import { useEffect, useRef } from 'react'; import { createPortal } from 'react-dom'; import type { ReactElement } from 'react'; import { X, AlertTriangle } from 'lucide-react'; import { PrimaryButton, SecondaryButton } from '@/components/shared'; interface DeleteConfirmationModalProps { isOpen: boolean; onClose: () => void; onConfirm: () => Promise; title: string; message: string; itemName?: string; isLoading?: boolean; children?: React.ReactNode; } export const DeleteConfirmationModal = ({ isOpen, onClose, onConfirm, title, message, itemName, isLoading = false, children, }: DeleteConfirmationModalProps): ReactElement | null => { const modalRef = useRef(null); // Handle click outside to close modal useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (modalRef.current && !modalRef.current.contains(event.target as Node)) { onClose(); } }; if (isOpen) { document.addEventListener('mousedown', handleClickOutside); document.body.style.overflow = 'hidden'; } return () => { document.removeEventListener('mousedown', handleClickOutside); document.body.style.overflow = 'unset'; }; }, [isOpen, onClose]); // Handle escape key useEffect(() => { const handleEscape = (event: KeyboardEvent) => { if (event.key === 'Escape' && isOpen) { onClose(); } }; document.addEventListener('keydown', handleEscape); return () => { document.removeEventListener('keydown', handleEscape); }; }, [isOpen, onClose]); const handleConfirm = async (): Promise => { await onConfirm(); }; if (!isOpen) return null; const modalContent = (
{/* Modal Header */}

{title}

{/* Modal Body */}

{message} {itemName && ( "{itemName}" )} ? This action cannot be undone.

{children &&
{children}
}
{/* Modal Footer */}
Cancel {isLoading ? 'Deleting...' : 'Delete'}
); return createPortal(modalContent, document.body); };