From 245da1a31d87e31ccc1b17f3b98231b09b22a474 Mon Sep 17 00:00:00 2001 From: James Brunton Date: Fri, 15 Aug 2025 15:26:59 +0100 Subject: [PATCH] Use new tool workflow for Remove Password --- frontend/src/tools/RemovePassword.tsx | 150 +++++++------------------- 1 file changed, 39 insertions(+), 111 deletions(-) diff --git a/frontend/src/tools/RemovePassword.tsx b/frontend/src/tools/RemovePassword.tsx index 16e6120a7..cbe6e2585 100644 --- a/frontend/src/tools/RemovePassword.tsx +++ b/frontend/src/tools/RemovePassword.tsx @@ -1,16 +1,10 @@ -import { useEffect, useMemo } from "react"; -import { Box, Button, Stack, Text } from "@mantine/core"; +import { useEffect } from "react"; import { useTranslation } from "react-i18next"; -import DownloadIcon from "@mui/icons-material/Download"; import { useEndpointEnabled } from "../hooks/useEndpointConfig"; import { useFileContext } from "../contexts/FileContext"; import { useToolFileSelection } from "../contexts/FileSelectionContext"; -import ToolStep, { ToolStepContainer } from "../components/tools/shared/ToolStep"; -import OperationButton from "../components/tools/shared/OperationButton"; -import ErrorNotification from "../components/tools/shared/ErrorNotification"; -import FileStatusIndicator from "../components/tools/shared/FileStatusIndicator"; -import ResultsPreview from "../components/tools/shared/ResultsPreview"; +import { createToolFlow } from "../components/tools/shared/createToolFlow"; import RemovePasswordSettings from "../components/tools/removePassword/RemovePasswordSettings"; @@ -34,137 +28,71 @@ const RemovePassword = ({ onPreviewFile, onComplete, onError }: BaseToolProps) = useEffect(() => { removePasswordOperation.resetResults(); onPreviewFile?.(null); - }, [removePasswordParams.parameters, selectedFiles]); + }, [removePasswordParams.parameters]); const handleRemovePassword = async () => { try { - await removePasswordOperation.executeOperation( - removePasswordParams.parameters, - selectedFiles - ); + await removePasswordOperation.executeOperation(removePasswordParams.parameters, selectedFiles); if (removePasswordOperation.files && onComplete) { onComplete(removePasswordOperation.files); } } catch (error) { if (onError) { - onError(error instanceof Error ? error.message : t('removePassword.error.failed', 'Remove password operation failed')); + onError(error instanceof Error ? error.message : t("removePassword.error.failed", "Remove password operation failed")); } } }; const handleThumbnailClick = (file: File) => { onPreviewFile?.(file); - sessionStorage.setItem('previousMode', 'removePassword'); - setCurrentMode('viewer'); + sessionStorage.setItem("previousMode", "removePassword"); + setCurrentMode("viewer"); }; const handleSettingsReset = () => { removePasswordOperation.resetResults(); onPreviewFile?.(null); - setCurrentMode('removePassword'); + setCurrentMode("removePassword"); }; const hasFiles = selectedFiles.length > 0; const hasResults = removePasswordOperation.files.length > 0 || removePasswordOperation.downloadUrl !== null; - const filesCollapsed = hasFiles; - const passwordCollapsed = hasResults; + const passwordCollapsed = !hasFiles || hasResults; - const previewResults = useMemo(() => - removePasswordOperation.files?.map((file, index) => ({ - file, - thumbnail: removePasswordOperation.thumbnails[index] - })) || [], - [removePasswordOperation.files, removePasswordOperation.thumbnails] - ); - - return ( - - - {/* Files Step */} - - - - - {/* Password Step */} - + return createToolFlow({ + files: { + selectedFiles, + isCollapsed: hasFiles || hasResults, + }, + steps: [ + { + title: t("removePassword.password.stepTitle", "Password"), + isCollapsed: passwordCollapsed, + onCollapsedClick: hasResults ? handleSettingsReset : undefined, + tooltip: removePasswordTips, + content: ( - - - - - - - {/* Results Step */} - - - {removePasswordOperation.status && ( - {removePasswordOperation.status} - )} - - - - {removePasswordOperation.downloadUrl && ( - - )} - - - - - - - ); -} + ), + }, + ], + executeButton: { + text: t("removePassword.submit", "Remove Password"), + isVisible: !hasResults, + loadingText: t("loading"), + onClick: handleRemovePassword, + disabled: !removePasswordParams.validateParameters() || !hasFiles || !endpointEnabled, + }, + review: { + isVisible: hasResults, + operation: removePasswordOperation, + title: t("removePassword.results.title", "Decrypted PDFs"), + onFileClick: handleThumbnailClick, + }, + }); +}; export default RemovePassword;