import { createContext, useCallback, useRef, useState, type ReactNode } from 'react'; import Modal from './Modal'; export interface ConfirmOptions { title?: string; message: string; confirmLabel?: string; cancelLabel?: string; } export type ConfirmFn = (options: ConfirmOptions) => Promise; export const ConfirmContext = createContext(null); interface PendingConfirm extends ConfirmOptions { resolve: (value: boolean) => void; } /** * Fournit `useConfirm()` : une fonction `confirm(options)` qui ouvre un dialogue * et résout `true`/`false` selon le choix de l'utilisateur. À monter une fois, * haut dans l'arbre (cf. main.tsx). Idéal avant une action destructrice (`del`). */ export function ConfirmProvider({ children }: { children: ReactNode }) { const [pending, setPending] = useState(null); const pendingRef = useRef(null); pendingRef.current = pending; const confirm = useCallback((options) => { return new Promise((resolve) => { setPending({ ...options, resolve }); }); }, []); const settle = useCallback((value: boolean) => { pendingRef.current?.resolve(value); setPending(null); }, []); return ( {children} {pending && ( settle(false)} footer={ <> } >

{pending.message}

)}
); }