import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { useFileSelection } from "../contexts/FileContext"; import { createToolFlow } from "../components/tools/shared/createToolFlow"; import { BaseToolProps, ToolComponent } from "../types/tool"; import { useEndpointEnabled } from "../hooks/useEndpointConfig"; import { useAddStampParameters } from "../components/tools/addStamp/useAddStampParameters"; import { useAddStampOperation } from "../components/tools/addStamp/useAddStampOperation"; import { Group, Select, Stack, Textarea, TextInput, ColorInput, Button, Slider, Text, NumberInput } from "@mantine/core"; import StampPreview from "../components/tools/addStamp/StampPreview"; import LocalIcon from "../components/shared/LocalIcon"; import styles from "../components/tools/addStamp/StampPreview.module.css"; import { Tooltip } from "../components/shared/Tooltip"; import FitText from "../components/shared/FitText"; const AddStamp = ({ onPreviewFile, onComplete, onError }: BaseToolProps) => { const { t } = useTranslation(); const { selectedFiles } = useFileSelection(); const [collapsedType, setCollapsedType] = useState(false); const [collapsedFormatting, setCollapsedFormatting] = useState(true); const [collapsedPageSelection, setCollapsedPageSelection] = useState(false); const [textConfirmed, setTextConfirmed] = useState(false); const [quickPositionModeSelected, setQuickPositionModeSelected] = useState(false); const [customPositionModeSelected, setCustomPositionModeSelected] = useState(true); const params = useAddStampParameters(); const operation = useAddStampOperation(); const { enabled: endpointEnabled, loading: endpointLoading } = useEndpointEnabled("add-stamp"); useEffect(() => { operation.resetResults(); onPreviewFile?.(null); }, [params.parameters]); // Auto-collapse steps 2 and 3, and auto-expand step 4 when an image is uploaded useEffect(() => { if (params.parameters.stampType === 'image' && params.parameters.stampImage) { setCollapsedType(true); setCollapsedPageSelection(true); setCollapsedFormatting(false); // Auto-expand step 4 (Position & Formatting) } }, [params.parameters.stampType, params.parameters.stampImage]); // Reset text confirmation when inputs change useEffect(() => { if (params.parameters.stampType !== 'text') { setTextConfirmed(false); } else { setTextConfirmed(false); } }, [params.parameters.stampType, params.parameters.stampText, params.parameters.alphabet]); // Do not auto-collapse when switching types to avoid hiding file input prematurely const handleExecute = async () => { try { await operation.executeOperation(params.parameters, selectedFiles); if (operation.files && onComplete) { onComplete(operation.files); } } catch (error: any) { onError?.(error?.message || t("AddStampRequest.error.failed", "Add stamp operation failed")); } }; const hasFiles = selectedFiles.length > 0; const hasResults = operation.files.length > 0 || operation.downloadUrl !== null; const getSteps = () => { const steps: any[] = []; // Step 1: File settings (page selection) - auto-collapse when image is uploaded steps.push({ title: t("AddStampRequest.pageSelection", "Page Selection"), isCollapsed: hasResults || collapsedPageSelection, onCollapsedClick: hasResults ? () => operation.resetResults() : () => setCollapsedPageSelection(!collapsedPageSelection), isVisible: hasFiles || hasResults, content: ( params.updateParameter('pageNumbers', e.currentTarget.value)} disabled={endpointLoading} /> ), }); // Step 2: Type & Content - auto-collapse when image is uploaded steps.push({ title: t("AddStampRequest.stampType", "Stamp Type"), isCollapsed: hasResults ? true : collapsedType, onCollapsedClick: hasResults ? () => operation.resetResults() : () => setCollapsedType(!collapsedType), isVisible: hasFiles || hasResults, content: (
{t('AddStampRequest.stampType', 'Stamp Type')}
{params.parameters.stampType === 'text' && ( <>