import React, { useState, useEffect } from 'react'; import { useDownloadStore } from '../store/useDownloadStore'; import { AlertTriangle } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { isTopmostModal, useModalFocus } from '../hooks/useModalFocus'; export const DeleteConfirmationModal: React.FC = () => { const { t } = useTranslation(); const { deleteModalState, closeDeleteModal, removeDownload } = useDownloadStore(); const [errorMessage, setErrorMessage] = useState(''); const [isRemoving, setIsRemoving] = useState(false); const modalRef = useModalFocus(deleteModalState.isOpen); useEffect(() => { if (deleteModalState.isOpen) { setIsRemoving(false); setErrorMessage(''); } }, [deleteModalState.isOpen]); useEffect(() => { if (!deleteModalState.isOpen || isRemoving) return; const handleEscape = (event: KeyboardEvent) => { if (event.key === 'Escape' && isTopmostModal(modalRef.current)) { event.preventDefault(); closeDeleteModal(); } }; window.addEventListener('keydown', handleEscape); return () => window.removeEventListener('keydown', handleEscape); }, [closeDeleteModal, deleteModalState.isOpen, isRemoving]); if (!deleteModalState.isOpen) return null; const handleCancel = () => { closeDeleteModal(); }; const removeMany = async (deleteFile: boolean) => { const ids = deleteModalState.downloadIds ?? []; if (ids.length === 0) { closeDeleteModal(); return; } setIsRemoving(true); setErrorMessage(''); let succeeded = 0; const failures: string[] = []; for (const id of ids) { try { await removeDownload(id, deleteFile); succeeded += 1; } catch (error) { failures.push(String(error)); } } if (failures.length > 0) { setErrorMessage(t($ => $.dialogs.removeDownload.errorSummary, { succeeded, failed: failures.length, detail: failures[0], })); setIsRemoving(false); return; } setIsRemoving(false); closeDeleteModal(); }; const handleRemoveFromList = () => removeMany(false); const handleDeleteFile = () => removeMany(true); const itemCount = deleteModalState.downloadIds?.length ?? 0; return (
{ if (event.target === event.currentTarget && !isRemoving) handleCancel(); }} role="dialog" aria-modal="true" aria-labelledby="remove-download-title" >
e.stopPropagation()} >

{t($ => $.dialogs.removeDownload.title)}

{itemCount > 1 ? t($ => $.dialogs.removeDownload.confirmationMultiple, { count: itemCount }) : t($ => $.dialogs.removeDownload.confirmationSingle)} {errorMessage &&
{errorMessage}
}
); };