diff --git a/frontend/src/components/FileExplorer.tsx b/frontend/src/components/FileExplorer.tsx index 62d142d..ce9cff2 100644 --- a/frontend/src/components/FileExplorer.tsx +++ b/frontend/src/components/FileExplorer.tsx @@ -244,6 +244,7 @@ export default function FileExplorer({ onLogout }: FileExplorerProps) { const [draggedFile, setDraggedFile] = useState(null); const [uploads, setUploads] = useState([]); const [toasts, setToasts] = useState([]); + const [deleteConfirm, setDeleteConfirm] = useState<{ type: 'single' | 'multiple'; file?: FileItem; count?: number } | null>(null); function showToast(message: string, type: 'success' | 'error' | 'info' = 'success') { const id = Date.now() + Math.random(); @@ -384,7 +385,7 @@ export default function FileExplorer({ onLogout }: FileExplorerProps) { e.preventDefault(); navigateUp(); } else if (e.key === 'Delete') { - deleteSelected(); + requestDeleteSelected(); } else if (e.key === 'a' && (e.ctrlKey || e.metaKey)) { e.preventDefault(); selectAll(); @@ -613,18 +614,29 @@ export default function FileExplorer({ onLogout }: FileExplorerProps) { setSelectedFiles(new Set(files.map(f => f.path))); } - async function deleteSelected() { + function requestDeleteSelected() { if (selectedFiles.size === 0) return; - if (!confirm(`Move ${selectedFiles.size} items to trash?`)) return; + setDeleteConfirm({ type: 'multiple', count: selectedFiles.size }); + } + + async function executeDeleteSelected() { const count = selectedFiles.size; for (const path of selectedFiles) { await api.deleteFile(path); } setSelectedFiles(new Set()); loadFiles(undefined, true); + setDeleteConfirm(null); showToast(`Deleted ${count} item${count > 1 ? 's' : ''}`); } + async function executeDeleteSingle(file: FileItem) { + await api.deleteFile(file.path); + loadFiles(undefined, true); + setDeleteConfirm(null); + showToast(`Deleted ${file.name}`); + } + async function handlePin(file: FileItem) { await api.togglePin(file.path); loadFiles(undefined, true); @@ -1578,7 +1590,7 @@ export default function FileExplorer({ onLogout }: FileExplorerProps) { @@ -1693,12 +1705,7 @@ export default function FileExplorer({ onLogout }: FileExplorerProps) { label="Move to Trash" danger onClick={() => { - if (confirm(`Move ${contextMenu.file.name} to trash?`)) { - api.deleteFile(contextMenu.file.path).then(() => { - loadFiles(undefined, true); - showToast(`Deleted ${contextMenu.file.name}`); - }); - } + setDeleteConfirm({ type: 'single', file: contextMenu.file }); setContextMenu(null); }} /> @@ -1857,6 +1864,47 @@ export default function FileExplorer({ onLogout }: FileExplorerProps) { )} + + {deleteConfirm && ( +
+ +
+

Move to Trash?

+

+ {deleteConfirm.type === 'multiple' + ? `Are you sure you want to move ${deleteConfirm.count} items to the trash?` + : `Are you sure you want to move ${deleteConfirm.file?.name} to the trash?`} +

+
+ + +
+
+
+
+ )} +
+ {showTrashModal && (