diff --git a/frontend/src/pages/HomePage.tsx b/frontend/src/pages/HomePage.tsx index 5c45f0d14..427dd6645 100644 --- a/frontend/src/pages/HomePage.tsx +++ b/frontend/src/pages/HomePage.tsx @@ -72,8 +72,8 @@ function getToolParams(toolKey: string, searchParams: URLSearchParams) { return { mode: searchParams.get("splitMode") || "byPages", pages: searchParams.get("pages") || "", - hDiv: searchParams.get("hDiv") || "0", - vDiv: searchParams.get("vDiv") || "1", + hDiv: searchParams.get("hDiv") || "", + vDiv: searchParams.get("vDiv") || "", merge: searchParams.get("merge") === "true", splitType: searchParams.get("splitType") || "size", splitValue: searchParams.get("splitValue") || "", @@ -83,8 +83,11 @@ function getToolParams(toolKey: string, searchParams: URLSearchParams) { }; case "compress": return { - level: searchParams.get("compressLevel") || "medium", - keepQuality: searchParams.get("keepQuality") === "true", + compressionLevel: parseInt(searchParams.get("compressionLevel") || "5"), + grayscale: searchParams.get("grayscale") === "true", + removeMetadata: searchParams.get("removeMetadata") === "true", + expectedSize: searchParams.get("expectedSize") || "", + aggressive: searchParams.get("aggressive") === "true", }; case "merge": return { @@ -124,10 +127,13 @@ function updateToolParams(toolKey: string, searchParams: URLSearchParams, setSea params.set("allowDuplicates", String(merged.allowDuplicates)); } } else if (toolKey === "compress") { - ["compressLevel", "keepQuality"].forEach((k) => params.delete(k)); + ["compressionLevel", "grayscale", "removeMetadata", "expectedSize", "aggressive"].forEach((k) => params.delete(k)); const merged = { ...getToolParams("compress", searchParams), ...newParams }; - params.set("compressLevel", merged.level); - params.set("keepQuality", String(merged.keepQuality)); + params.set("compressionLevel", String(merged.compressionLevel)); + params.set("grayscale", String(merged.grayscale)); + params.set("removeMetadata", String(merged.removeMetadata)); + if (merged.expectedSize) params.set("expectedSize", merged.expectedSize); + params.set("aggressive", String(merged.aggressive)); } else if (toolKey === "merge") { ["mergeOrder", "removeDuplicates"].forEach((k) => params.delete(k)); const merged = { ...getToolParams("merge", searchParams), ...newParams }; @@ -146,7 +152,7 @@ const TOOL_PARAMS = { "splitType", "splitValue", "bookmarkLevel", "includeMetadata", "allowDuplicates" ], compress: [ - "compressLevel", "keepQuality" + "compressionLevel", "grayscale", "removeMetadata", "expectedSize", "aggressive" ], merge: [ "mergeOrder", "removeDuplicates" @@ -222,13 +228,39 @@ export default function HomePage() { return
Tool not found
; } - // Pass only the necessary props - return React.createElement(selectedTool.component, { - files, - setDownloadUrl, - params: toolParams, - updateParams, - }); + // Pass tool-specific props + switch (selectedToolKey) { + case "split": + return React.createElement(selectedTool.component, { + file: pdfFile, + downloadUrl, + setDownloadUrl, + params: toolParams, + updateParams, + }); + case "compress": + return React.createElement(selectedTool.component, { + files, + setDownloadUrl, + setLoading: (loading: boolean) => {}, // TODO: Add loading state + params: toolParams, + updateParams, + }); + case "merge": + return React.createElement(selectedTool.component, { + files, + setDownloadUrl, + params: toolParams, + updateParams, + }); + default: + return React.createElement(selectedTool.component, { + files, + setDownloadUrl, + params: toolParams, + updateParams, + }); + } }; return ( diff --git a/frontend/src/tools/Compress.tsx b/frontend/src/tools/Compress.tsx index 23ad4279c..8f8f4257b 100644 --- a/frontend/src/tools/Compress.tsx +++ b/frontend/src/tools/Compress.tsx @@ -9,25 +9,42 @@ export interface CompressProps { files?: FileWithUrl[]; setDownloadUrl?: (url: string) => void; setLoading?: (loading: boolean) => void; + params?: { + compressionLevel: number; + grayscale: boolean; + removeMetadata: boolean; + expectedSize: string; + aggressive: boolean; + }; + updateParams?: (newParams: Partial) => void; } const CompressPdfPanel: React.FC = ({ files = [], setDownloadUrl, setLoading, + params = { + compressionLevel: 5, + grayscale: false, + removeMetadata: false, + expectedSize: "", + aggressive: false, + }, + updateParams, }) => { const { t } = useTranslation(); - const [searchParams] = useSearchParams(); - const [selected, setSelected] = useState(files.map(() => false)); - const [compressionLevel, setCompressionLevel] = useState(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); + const { + compressionLevel, + grayscale, + removeMetadata, + expectedSize, + aggressive, + } = params; + // Update selection state if files prop changes React.useEffect(() => { setSelected(files.map(() => false)); @@ -104,7 +121,7 @@ const CompressPdfPanel: React.FC = ({ max={9} step={1} value={compressionLevel} - onChange={setCompressionLevel} + onChange={(value) => updateParams?.({ compressionLevel: value })} marks={[ { value: 1, label: "1" }, { value: 5, label: "5" }, @@ -116,23 +133,23 @@ const CompressPdfPanel: React.FC = ({ setGrayscale(e.currentTarget.checked)} + onChange={e => updateParams?.({ grayscale: e.currentTarget.checked })} /> setRemoveMetadata(e.currentTarget.checked)} + onChange={e => updateParams?.({ removeMetadata: e.currentTarget.checked })} /> setAggressive(e.currentTarget.checked)} + onChange={e => updateParams?.({ aggressive: e.currentTarget.checked })} /> setExpectedSize(e.currentTarget.value)} + onChange={e => updateParams?.({ expectedSize: e.currentTarget.value })} />