import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, } from "@mui/material"; import React, { PropsWithChildren } from "react"; type AlertContext = (message: string, title?: string) => Promise<void>; const AlertContextK = React.createContext<AlertContext | null>(null); export function AlertDialogProvider(p: PropsWithChildren): React.ReactElement { const [open, setOpen] = React.useState(false); const [title, setTitle] = React.useState<string | undefined>(undefined); const [message, setMessage] = React.useState(""); const cb = React.useRef<null | (() => void)>(null); const handleClose = () => { setOpen(false); if (cb.current !== null) cb.current(); cb.current = null; }; const hook: AlertContext = (message, title) => { setTitle(title); setMessage(message); setOpen(true); return new Promise((res) => { cb.current = res; }); }; return ( <> <AlertContextK value={hook}>{p.children}</AlertContextK> <Dialog open={open} onClose={handleClose} aria-labelledby="alert-dialog-title" aria-describedby="alert-dialog-description" > {title && <DialogTitle id="alert-dialog-title">{title}</DialogTitle>} <DialogContent> <DialogContentText id="alert-dialog-description" style={{ whiteSpace: "pre-line" }} > {message} </DialogContentText> </DialogContent> <DialogActions> <Button onClick={handleClose} autoFocus> Ok </Button> </DialogActions> </Dialog> </> ); } export function useAlert(): AlertContext { return React.use(AlertContextK)!; }