import React, { useState, useRef } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { Upload, X, Check, Lock, RotateCw, Type, Trash2, LayoutList, FileText, Download, ArrowRight } from 'lucide-react'; const API_BASE = 'http://localhost:8000'; export default function ToolProcessor({ tools }) { const { toolId } = useParams(); const navigate = useNavigate(); const tool = tools.find((t) => t.id === toolId); const fileInputRef = useRef(null); const [files, setFiles] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [downloadUrl, setDownloadUrl] = useState(null); // Tool specific states const [password, setPassword] = useState(''); const [rotation, setRotation] = useState(90); const [watermarkText, setWatermarkText] = useState('CONFIDENTIAL'); const [pagesStr, setPagesStr] = useState('1'); if (!tool) { return
Tool not found.
; } const handleFileChange = (e) => { const selected = Array.from(e.target.files); if (!selected.length) return; if (tool.id === 'merge' || tool.id === 'jpg-to-pdf') { setFiles((prev) => [...prev, ...selected]); } else { setFiles([selected[0]]); } }; const removeFile = (index) => { setFiles((prev) => prev.filter((_, i) => i !== index)); }; const processFiles = async () => { if (files.length === 0) return; setLoading(true); setError(null); setDownloadUrl(null); const formData = new FormData(); files.forEach((file) => formData.append('files', file)); if (tool.id === 'protect' || tool.id === 'unlock') formData.append('password', password); if (tool.id === 'rotate') formData.append('rotation', rotation); if (tool.id === 'watermark') formData.append('watermark_text', watermarkText); if (tool.id === 'delete-pages') formData.append('pages_to_delete', pagesStr); if (tool.id === 'extract-pages') formData.append('pages_to_extract', pagesStr); try { const response = await fetch(`${API_BASE}/api/${tool.id}`, { method: 'POST', body: formData, }); if (!response.ok) { const errData = await response.json(); throw new Error(errData.detail || 'Processing failed'); } const blob = await response.blob(); const url = window.URL.createObjectURL(blob); setDownloadUrl(url); } catch (err) { setError(err.message); } finally { setLoading(false); } }; const isMultiple = tool.id === 'merge' || tool.id === 'jpg-to-pdf'; let acceptedTypes = 'application/pdf'; if (tool.id === 'jpg-to-pdf') acceptedTypes = 'image/jpeg,image/png'; if (tool.id === 'word-to-pdf') acceptedTypes = '.doc,.docx,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document'; if (tool.id === 'excel-to-pdf') acceptedTypes = '.xls,.xlsx,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; if (tool.id === 'ppt-to-pdf') acceptedTypes = '.ppt,.pptx,application/vnd.ms-powerpoint,application/vnd.openxmlformats-officedocument.presentationml.presentation'; if (tool.id === 'html-to-pdf') acceptedTypes = '.html,.htm'; let extension = 'pdf'; if (tool.id === 'split' || tool.id === 'pdf-to-jpg') extension = 'zip'; if (tool.id === 'pdf-to-word') extension = 'docx'; if (tool.id === 'pdf-to-txt') extension = 'txt'; const onDragOver = (e) => { e.preventDefault(); }; const onDrop = (e) => { e.preventDefault(); if (e.dataTransfer.files && e.dataTransfer.files.length > 0) { if (isMultiple) { setFiles(prev => [...prev, ...Array.from(e.dataTransfer.files)]); } else { setFiles([e.dataTransfer.files[0]]); } e.dataTransfer.clearData(); } }; return (
{/* Before processing and before upload */} {!downloadUrl && files.length === 0 && ( <>

{tool.title}

{tool.desc}

fileInputRef.current.click()}>

or drop files here

)} {/* Before processing and AFTER upload (Active State) */} {!downloadUrl && files.length > 0 && (
{files.map((file, idx) => (
{file.name}
))} {/* Add more button for multiple allowed */} {isMultiple && (
fileInputRef.current.click()}>
Add more files
)}
{/* Form inputs based on tool ID */} {(tool.id === 'protect' || tool.id === 'unlock') && (

Enter Password:

setPassword(e.target.value)} placeholder={tool.id === 'protect' ? "Set new password" : "Enter PDF password"} />
)} {tool.id === 'rotate' && (

Rotation angle:

)} {tool.id === 'watermark' && (

Watermark Text:

setWatermarkText(e.target.value)} placeholder={"Enter text to stamp on PDF"} />
)} {(tool.id === 'delete-pages' || tool.id === 'extract-pages') && (

{tool.id === 'delete-pages' ? : } Pages to {tool.id === 'delete-pages' ? 'remove' : 'extract'}:

setPagesStr(e.target.value)} placeholder={"e.g. 1, 3, 5"} />

Comma separated page numbers.

)} {error &&
Error: {error}
} {/* Fixed bottom button */}
)} {/* Done State */} {downloadUrl && (

Your files have been processed successfully!

Download Processed File
)}
); }