From a47eab7a03bbdad96e74489f0fe5dd5500d53fc1 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Sun, 1 Feb 2026 04:39:39 +0100 Subject: [PATCH] Add quick delete functionality for texts and folders --- src/App.tsx | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/App.tsx b/src/App.tsx index 6ee70cb..6312f78 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -797,6 +797,39 @@ export default function App() { [refreshTexts, selectedTextId] ); + const isQuickDeleteText = useCallback( + async (text: Text) => { + if ((text.title || "").trim() !== DEFAULT_TITLE) return false; + if (text.id === selectedTextId && body.trim().length > 0) return false; + + const draft = await getDraft(text.id); + if (draft) return false; + + const versions = await listVersions(text.id); + if (versions.length === 0) return true; + if (versions.length > 1) return false; + return versions[0].body.trim().length === 0; + }, + [body, selectedTextId] + ); + + const requestDeleteText = useCallback( + async (text: Text) => { + const skipConfirm = await isQuickDeleteText(text); + if (skipConfirm) { + await handleDeleteText(text.id); + return; + } + setConfirmState({ + title: "Delete text", + message: `Delete \"${text.title}\"? This removes all versions and drafts.`, + actionLabel: "Delete text", + onConfirm: () => handleDeleteText(text.id) + }); + }, + [handleDeleteText, isQuickDeleteText] + ); + const handleDeleteFolder = useCallback( async (folderId: string) => { await deleteFolder(folderId); @@ -813,6 +846,23 @@ export default function App() { [clearFolderEditing, editingFolderId, refreshFolders, refreshTexts] ); + const requestDeleteFolder = useCallback( + async (folder: Folder) => { + if (isFolderEmpty(folder.id)) { + await handleDeleteFolder(folder.id); + return; + } + setConfirmState({ + title: "Delete folder", + message: + "Delete this folder? Its subfolders and texts will move one level up.", + actionLabel: "Delete folder", + onConfirm: () => handleDeleteFolder(folder.id) + }); + }, + [handleDeleteFolder, isFolderEmpty] + ); + const handleTextContextMenu = useCallback( async (event: React.MouseEvent, text: Text) => { event.preventDefault();