import React, { useState, useEffect } from "react"; export default function MergePdfPanel({ files, setDownloadUrl }) { const [selectedFiles, setSelectedFiles] = useState([]); const [downloadUrl, setLocalDownloadUrl] = useState(null); // Local state for download URL const [isLoading, setIsLoading] = useState(false); // Loading state const [errorMessage, setErrorMessage] = useState(null); // Error message state // Sync selectedFiles with files whenever files change useEffect(() => { setSelectedFiles(files.map(() => true)); // Select all files by default }, [files]); const handleMerge = async () => { const filesToMerge = files.filter((_, index) => selectedFiles[index]); if (filesToMerge.length < 2) { alert("Please select at least two PDFs to merge."); return; } const formData = new FormData(); filesToMerge.forEach((file) => formData.append("fileInput", file)); // Use "fileInput" as the key setIsLoading(true); // Start loading setErrorMessage(null); // Clear previous errors try { const response = await fetch("/api/v1/general/merge-pdfs", { method: "POST", body: formData, }); if (!response.ok) { const errorText = await response.text(); throw new Error(`Failed to merge PDFs: ${errorText}`); } const blob = await response.blob(); const downloadUrl = URL.createObjectURL(blob); setDownloadUrl(downloadUrl); // Pass to parent component setLocalDownloadUrl(downloadUrl); // Store locally for download button } catch (error) { console.error("Error merging PDFs:", error); setErrorMessage(error.message); // Set error message } finally { setIsLoading(false); // Stop loading } }; const handleCheckboxChange = (index) => { setSelectedFiles((prevSelectedFiles) => prevSelectedFiles.map((selected, i) => (i === index ? !selected : selected)) ); }; return (

Merge PDFs

{files.filter((_, index) => selectedFiles[index]).length < 2 && (

Please select at least two PDFs to merge.

)} {errorMessage && (

{errorMessage}

)} {downloadUrl && ( Download Merged PDF )}
); }