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 ButtonSelector from "../components/shared/ButtonSelector"; 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 [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]); 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) 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 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.updateParameter('stampType', v)} options={[ { value: 'text', label: t('watermark.type.1', 'Text') }, { value: 'image', label: t('watermark.type.2', 'Image') }, ]} disabled={endpointLoading} buttonClassName={styles.modeToggleButton} textClassName={styles.modeToggleButtonText} />
{params.parameters.stampType === 'text' && ( <>