"use client"; import { generateUUID } from "lib/utils"; import { ReactNode, useState } from "react"; import { createRoot } from "react-dom/client"; import { Button } from "ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "ui/dialog"; import { Textarea } from "ui/textarea"; type Alert = { title?: ReactNode; description: ReactNode; }; const createContainer = () => { const container = document.createElement("div"); container.id = generateUUID(); document.body.appendChild(container); return container; }; export const notify = { component({ children, className, }: { children: ReactNode; className?: string }) { return new Promise((resolve) => { const container = createContainer(); const root = createRoot(container); const close = () => { root.unmount(); container.remove(); resolve(); }; root.render( {children} , ); }); }, alert(alert: Alert) { return new Promise((resolve) => { const container = createContainer(); const root = createRoot(container); const close = () => { root.unmount(); container.remove(); resolve(); }; root.render( {alert.title} {alert.description} , ); }); }, confirm: (confirm: Alert & { okText?: string; cancelText?: string }) => { return new Promise((resolve) => { const container = createContainer(); const root = createRoot(container); const close = () => { root.unmount(); container.remove(); }; const ok = () => { resolve(true); close(); }; const cancel = () => { resolve(false); close(); }; function Component() { return ( {confirm.title} {confirm.description} ); } root.render(); }); }, prompt: (prompt: Alert) => { return new Promise((resolve) => { const container = createContainer(); const root = createRoot(container); const close = (text: string = "") => { root.unmount(); container.remove(); resolve(text); }; const Component = () => { const [text, setText] = useState(""); return ( close()}> {prompt.title} {prompt.description}