import { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { Helmet } from 'react-helmet-async'; import { PenTool } from 'lucide-react'; import FileUploader from '@/components/shared/FileUploader'; import ProgressBar from '@/components/shared/ProgressBar'; import DownloadButton from '@/components/shared/DownloadButton'; import AdSlot from '@/components/layout/AdSlot'; import { useTaskPolling } from '@/hooks/useTaskPolling'; import { generateToolSchema } from '@/utils/seo'; import { useFileStore } from '@/stores/fileStore'; import api, { type TaskResponse } from '@/services/api'; export default function SignPdf() { const { t } = useTranslation(); const [phase, setPhase] = useState<'upload' | 'processing' | 'done'>('upload'); const [pdfFile, setPdfFile] = useState(null); const [sigFile, setSigFile] = useState(null); const [taskId, setTaskId] = useState(null); const [error, setError] = useState(null); const [page, setPage] = useState(1); const { status, result, error: taskError } = useTaskPolling({ taskId, onComplete: () => setPhase('done'), onError: () => setPhase('done'), }); const storeFile = useFileStore((s) => s.file); const clearStoreFile = useFileStore((s) => s.clearFile); useEffect(() => { if (storeFile) { setPdfFile(storeFile); clearStoreFile(); } }, []); // eslint-disable-line react-hooks/exhaustive-deps const handleUpload = async () => { if (!pdfFile || !sigFile) return; setError(null); setPhase('processing'); try { const fd = new FormData(); fd.append('file', pdfFile); fd.append('signature', sigFile); fd.append('page', String(page)); const res = await api.post('/pdf-tools/sign', fd); setTaskId(res.data.task_id); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to sign PDF.'); setPhase('done'); } }; const handleReset = () => { setPhase('upload'); setPdfFile(null); setSigFile(null); setTaskId(null); setError(null); setPage(1); }; const schema = generateToolSchema({ name: t('tools.signPdf.title'), description: t('tools.signPdf.description'), url: `${window.location.origin}/tools/sign-pdf`, }); return ( <> {t('tools.signPdf.title')} — {t('common.appName')}

{t('tools.signPdf.title')}

{t('tools.signPdf.description')}

{phase === 'upload' && (
setPage(Math.max(1, Number(e.target.value)))} className="w-24 rounded-lg border border-slate-300 px-3 py-2 text-sm dark:border-slate-600 dark:bg-slate-700 dark:text-slate-200" />
{pdfFile && sigFile && ( )}
)} {phase === 'processing' && !result && } {phase === 'done' && result && result.status === 'completed' && } {phase === 'done' && (taskError || error) && (

{taskError || error}

)}
); }