import { useEffect } from 'react'; import { createPortal } from 'react-dom'; import { X } from 'lucide-react'; interface ConfirmModalProps { open: boolean; title: string; message: string; confirmLabel: string; /** * Cancel button label. Omit (together with `onCancel`) to render the * modal as a single-button info dialog — Esc / outside-click / X then * also resolve via `onConfirm`. */ cancelLabel?: string; danger?: boolean; onConfirm: () => void; onCancel?: () => void; } export default function ConfirmModal({ open, title, message, confirmLabel, cancelLabel, danger, onConfirm, onCancel, }: ConfirmModalProps) { const dismiss = onCancel ?? onConfirm; useEffect(() => { if (!open) return; const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') dismiss(); else if (e.key === 'Enter') onConfirm(); }; window.addEventListener('keydown', onKey); return () => window.removeEventListener('keydown', onKey); }, [open, dismiss, onConfirm]); if (!open) return null; const confirmStyle = danger ? { background: 'var(--danger)', borderColor: 'var(--danger)', color: '#fff' } : undefined; return createPortal(
{message}