import React, { createContext, useContext, useState, useCallback, useEffect, ReactNode } from 'react'; import { AlertTriangle, HelpCircle } from 'lucide-react'; interface ConfirmOptions { title?: string; message: string; confirmText?: string; cancelText?: string; danger?: boolean; } type ConfirmInput = string | ConfirmOptions; interface ConfirmContextType { confirm: (input: ConfirmInput) => Promise; } const ConfirmContext = createContext(undefined); // Detecta ações destrutivas pelo texto → estilo de alerta (vermelho). const DANGER_RE = /EXCLUIR|REMOVER|APAGAR|PERMANENTE|LIMPAR|CANCELAR|SAIR|DELETE|DESFEIT|RESETAR/i; export const ConfirmProvider: React.FC<{ children: ReactNode }> = ({ children }) => { const [state, setState] = useState<{ opts: ConfirmOptions; resolve: (v: boolean) => void } | null>(null); const confirm = useCallback((input: ConfirmInput) => { const opts: ConfirmOptions = typeof input === 'string' ? { message: input } : input; return new Promise((resolve) => setState({ opts, resolve })); }, []); const close = useCallback((v: boolean) => { setState((s) => { s?.resolve(v); return null; }); }, []); useEffect(() => { if (!state) return; const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') close(false); if (e.key === 'Enter') close(true); }; document.addEventListener('keydown', onKey); return () => document.removeEventListener('keydown', onKey); }, [state, close]); const o = state?.opts; const danger = o ? (o.danger ?? DANGER_RE.test(`${o.title || ''} ${o.message}`)) : false; return ( {children} {o && (
{ if (e.target === e.currentTarget) close(false); }} >
{danger ? : }
{o.title &&

{o.title}

}

{o.message}

)}
); }; export const useConfirm = (): ((input: ConfirmInput) => Promise) => { const ctx = useContext(ConfirmContext); if (!ctx) throw new Error('useConfirm must be used within a ConfirmProvider'); return ctx.confirm; };