import { useMemo, useState } from "react"; import { Box, IconButton, Slide, Snackbar } from "@mui/material"; import { Close, CheckCircleRounded, ErrorRounded } from "@mui/icons-material"; interface NoticeInstance { info: (msg: string) => void; error: (msg: string) => void; success: (msg: string) => void; } const useNotice = () => { const [message, setMessage] = useState(""); const [level, setLevel] = useState<"info" | "error" | "success">("info"); const handleClose = (_e: any, reason: string) => { if (reason !== "clickaway") setMessage(""); }; const msgElement = level === "info" ? ( message ) : ( {level === "error" && } {level === "success" && } {message} ); const element = useMemo( () => ( } transitionDuration={200} action={ setMessage("")} > } /> ), [message] ); const instance = (Object.fromEntries( (["info", "error", "success"] as const).map((item) => [ item, (msg: string) => { setLevel(item); setMessage(msg); }, ]) ) as unknown) as NoticeInstance; return [instance, element] as const; }; export default useNotice;