import { createContext, type ReactNode, useCallback, useContext, useMemo, useRef, useState, } from "react"; import { ConfirmModal } from "@/components/dialog/ConfirmModal"; export type ConfirmOptions = { title: ReactNode; description: ReactNode; confirmLabel: string; cancelLabel?: string; danger?: boolean; }; type DialogContextValue = { confirm: (options: ConfirmOptions) => Promise; }; const DialogContext = createContext(null); export function DialogProvider({ children }: Readonly<{ children: ReactNode }>) { const [open, setOpen] = useState(false); const [options, setOptions] = useState(null); const resolverRef = useRef<((result: boolean) => void) | null>(null); const confirm = useCallback((opts: ConfirmOptions) => { setOptions(opts); setOpen(true); return new Promise((resolve) => { resolverRef.current = resolve; }); }, []); const settle = (result: boolean) => { resolverRef.current?.(result); resolverRef.current = null; setOpen(false); }; const value = useMemo(() => ({ confirm }), [confirm]); return ( {children} settle(true)} onCancel={() => settle(false)} /> ); } export const useConfirm = () => { const ctx = useContext(DialogContext); if (!ctx) throw new Error("useConfirm must be used within a DialogProvider"); return ctx.confirm; };