diff --git a/src/pages/Delete.tsx b/src/pages/Delete.tsx index 581077c..55d7011 100644 --- a/src/pages/Delete.tsx +++ b/src/pages/Delete.tsx @@ -1,4 +1,5 @@ -import { Accordion, AccordionItem, Avatar, Button } from '@heroui/react' +import { useAutoAnimate } from '@formkit/auto-animate/react' +import { Accordion, AccordionItem, Alert, Avatar, Button } from '@heroui/react' import { message } from '@tauri-apps/plugin-dialog' import cronstrue from 'cronstrue' import { @@ -16,6 +17,7 @@ import { getConfigFlags, getCurrentGlobalFlags, getFilterFlags, + getRemote, startDelete, } from '../../lib/rclone/api' import { RCLONE_CONFIG_DEFAULTS } from '../../lib/rclone/constants' @@ -24,6 +26,17 @@ import CronEditor from '../components/CronEditor' import OptionsSection from '../components/OptionsSection' import { PathField } from '../components/PathFinder' +const SUPPORTS_PURGE = [ + 'box', + 'dropbox', + 'gcs', + 'drive', + 'azureblob', + 'onedrive', + 'protondrive', + 'webdav', +] + export default function Delete() { const [searchParams] = useSearchParams() @@ -49,12 +62,15 @@ export default function Delete() { const [currentGlobalOptions, setCurrentGlobalOptions] = useState([]) + const [supportsPurge, setSupportsPurge] = useState(false) + const [animationParent] = useAutoAnimate() + + const sourceRemoteName = getRemoteName(sourceFs) + // biome-ignore lint/correctness/useExhaustiveDependencies: when unlocking, we don't want to re-run the effect useEffect(() => { const storeData = usePersistedStore.getState() - const sourceRemote = getRemoteName(sourceFs?.[0]) - let mergedFilterDefaults = {} let mergedConfigDefaults = {} @@ -85,7 +101,7 @@ export default function Delete() { } // Only merge defaults for remote paths - if (sourceRemote) mergeRemoteDefaults(sourceRemote) + if (sourceRemoteName) mergeRemoteDefaults(sourceRemoteName) if (Object.keys(mergedFilterDefaults).length > 0 && !filterOptionsLocked) { setFilterOptionsJson(JSON.stringify(mergedFilterDefaults, null, 2)) @@ -94,7 +110,14 @@ export default function Delete() { if (Object.keys(mergedConfigDefaults).length > 0 && !configOptionsLocked) { setConfigOptionsJson(JSON.stringify(mergedConfigDefaults, null, 2)) } - }, [sourceFs]) + }, [sourceRemoteName]) + + useEffect(() => { + if (!sourceRemoteName) return + getRemote(sourceRemoteName).then((remote) => + setSupportsPurge(SUPPORTS_PURGE.includes(remote.type)) + ) + }, [sourceRemoteName]) useEffect(() => { getCurrentGlobalFlags().then((flags) => setCurrentGlobalOptions(flags)) @@ -192,14 +215,19 @@ export default function Delete() { return (
{/* Main Content */} -
+
{/* Path Display */} {/*
@@ -208,6 +236,18 @@ export default function Delete() {
*/} + {supportsPurge && ( + + If you're deleting a entire folder, "{sourceRemoteName}" supports Purge + which is more efficient! + + )} + {isMounted ? ( <> + +