import { useEffect, useMemo, useState } from "react"; import { Box, Button, Stack, Text } from "@mantine/core"; 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 AddPasswordSettings from "../components/tools/addPassword/AddPasswordSettings"; import ChangePermissionsSettings from "../components/tools/changePermissions/ChangePermissionsSettings"; import { useAddPasswordParameters } from "../hooks/tools/addPassword/useAddPasswordParameters"; import { useAddPasswordOperation } from "../hooks/tools/addPassword/useAddPasswordOperation"; import { useAddPasswordTips } from "../components/tooltips/useAddPasswordTips"; import { useAddPasswordPermissionsTips } from "../components/tooltips/useAddPasswordPermissionsTips"; import { BaseToolProps } from "../types/tool"; const AddPassword = ({ onPreviewFile, onComplete, onError }: BaseToolProps) => { const { t } = useTranslation(); const { setCurrentMode } = useFileContext(); const { selectedFiles } = useToolFileSelection(); const [collapsedPermissions, setCollapsedPermissions] = useState(true); const addPasswordParams = useAddPasswordParameters(); const addPasswordOperation = useAddPasswordOperation(); const addPasswordTips = useAddPasswordTips(); const addPasswordPermissionsTips = useAddPasswordPermissionsTips(); // Endpoint validation const { enabled: endpointEnabled, loading: endpointLoading } = useEndpointEnabled(addPasswordParams.getEndpointName()); useEffect(() => { addPasswordOperation.resetResults(); onPreviewFile?.(null); }, [addPasswordParams.parameters, selectedFiles]); const handleAddPassword = async () => { try { await addPasswordOperation.executeOperation( addPasswordParams.fullParameters, selectedFiles ); if (addPasswordOperation.files && onComplete) { onComplete(addPasswordOperation.files); } } catch (error) { if (onError) { onError(error instanceof Error ? error.message : t('addPassword.error.failed', 'Add password operation failed')); } } }; const handleThumbnailClick = (file: File) => { onPreviewFile?.(file); sessionStorage.setItem('previousMode', 'addPassword'); setCurrentMode('viewer'); }; const handleSettingsReset = () => { addPasswordOperation.resetResults(); onPreviewFile?.(null); setCurrentMode('addPassword'); }; const hasFiles = selectedFiles.length > 0; const hasResults = addPasswordOperation.files.length > 0 || addPasswordOperation.downloadUrl !== null; const filesCollapsed = hasFiles; const passwordsCollapsed = hasResults; const permissionsCollapsed = collapsedPermissions || hasResults; const previewResults = useMemo(() => addPasswordOperation.files?.map((file, index) => ({ file, thumbnail: addPasswordOperation.thumbnails[index] })) || [], [addPasswordOperation.files, addPasswordOperation.thumbnails] ); return ( {/* Files Step */} {/* Passwords & Encryption Step */} {/* Permissions Step */} setCollapsedPermissions(!collapsedPermissions)} tooltip={addPasswordPermissionsTips} > {/* Results Step */} {addPasswordOperation.status && ( {addPasswordOperation.status} )} {addPasswordOperation.downloadUrl && ( )} ); } export default AddPassword;