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 && (
<>
>
)}
{/* 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') && (
)}
{error &&
Error: {error}
}
{/* Fixed bottom button */}
)}
{/* Done State */}
{downloadUrl && (
Your files have been processed successfully!
Download Processed File
)}
);
}