import React, { useState, useCallback, useImperativeHandle, forwardRef } from 'react'; import { SxProps, Theme } from '@mui/material'; import Snackbar, { SnackbarCloseReason } from '@mui/material/Snackbar'; import Alert from '@mui/material/Alert'; import './Snack.css'; type SeverityType = 'error' | 'info' | 'success' | 'warning' | undefined; type SetSnackType = (message: string, severity?: SeverityType) => void; interface SnackHandle { setSnack: SetSnackType; }; interface SnackProps { sx?: SxProps; className?: string; }; const Snack = forwardRef(({ className, sx }: SnackProps, ref) => { const [open, setOpen] = useState(false); const [message, setMessage] = useState(""); const [severity, setSeverity] = useState("success"); // Set the snack pop-up and open it const setSnack: SetSnackType = useCallback((message: string, severity: SeverityType = "success") => { setTimeout(() => { setMessage(message); setSeverity(severity); setOpen(true); }); }, [setMessage, setSeverity, setOpen]); useImperativeHandle(ref, () => ({ setSnack: (message: string, severity?: SeverityType) => { setSnack(message, severity); } })); const handleSnackClose = ( event: React.SyntheticEvent | Event, reason?: SnackbarCloseReason, ) => { if (reason === 'clickaway') { return; } setOpen(false); }; return ( {message} ) }); export type { SeverityType, SetSnackType }; export { Snack };