import React, { useState } from "react"; import { Stack, Slider, Group, Text, Button, Checkbox, TextInput, Paper } from "@mantine/core"; export default function CompressPdfPanel({ files = [], setDownloadUrl, setLoading }) { const [selected, setSelected] = useState(files.map(() => false)); const [compressionLevel, setCompressionLevel] = useState(5); // 1-9, default 5 const [grayscale, setGrayscale] = useState(false); const [removeMetadata, setRemoveMetadata] = useState(false); const [expectedSize, setExpectedSize] = useState(""); const [aggressive, setAggressive] = useState(false); const [localLoading, setLocalLoading] = useState(false); // Update selection state if files prop changes React.useEffect(() => { setSelected(files.map(() => false)); }, [files]); const handleCheckbox = idx => { setSelected(sel => sel.map((v, i) => (i === idx ? !v : v))); }; const handleCompress = async () => { const selectedFiles = files.filter((_, i) => selected[i]); if (selectedFiles.length === 0) return; setLocalLoading(true); setLoading?.(true); const formData = new FormData(); selectedFiles.forEach(file => formData.append("fileInput", file)); formData.append("compressionLevel", compressionLevel); formData.append("grayscale", grayscale); formData.append("removeMetadata", removeMetadata); formData.append("aggressive", aggressive); if (expectedSize) formData.append("expectedSize", expectedSize); try { const res = await fetch("/api/v1/general/compress-pdf", { method: "POST", body: formData, }); const blob = await res.blob(); setDownloadUrl(URL.createObjectURL(blob)); } finally { setLocalLoading(false); setLoading?.(false); } }; return ( Select files to compress: {files.length === 0 && No files loaded.} {files.map((file, idx) => ( handleCheckbox(idx)} /> ))} Compression Level setGrayscale(e.currentTarget.checked)} /> setRemoveMetadata(e.currentTarget.checked)} /> setAggressive(e.currentTarget.checked)} /> setExpectedSize(e.currentTarget.value)} /> ); }