mirror of
https://github.com/Stirling-Tools/Stirling-PDF.git
synced 2025-07-29 08:35:30 +00:00
Fix url params and fix vite
This commit is contained in:
parent
61eac67dc1
commit
7dd79aa2a1
@ -72,8 +72,8 @@ function getToolParams(toolKey: string, searchParams: URLSearchParams) {
|
|||||||
return {
|
return {
|
||||||
mode: searchParams.get("splitMode") || "byPages",
|
mode: searchParams.get("splitMode") || "byPages",
|
||||||
pages: searchParams.get("pages") || "",
|
pages: searchParams.get("pages") || "",
|
||||||
hDiv: searchParams.get("hDiv") || "0",
|
hDiv: searchParams.get("hDiv") || "",
|
||||||
vDiv: searchParams.get("vDiv") || "1",
|
vDiv: searchParams.get("vDiv") || "",
|
||||||
merge: searchParams.get("merge") === "true",
|
merge: searchParams.get("merge") === "true",
|
||||||
splitType: searchParams.get("splitType") || "size",
|
splitType: searchParams.get("splitType") || "size",
|
||||||
splitValue: searchParams.get("splitValue") || "",
|
splitValue: searchParams.get("splitValue") || "",
|
||||||
@ -83,8 +83,11 @@ function getToolParams(toolKey: string, searchParams: URLSearchParams) {
|
|||||||
};
|
};
|
||||||
case "compress":
|
case "compress":
|
||||||
return {
|
return {
|
||||||
level: searchParams.get("compressLevel") || "medium",
|
compressionLevel: parseInt(searchParams.get("compressionLevel") || "5"),
|
||||||
keepQuality: searchParams.get("keepQuality") === "true",
|
grayscale: searchParams.get("grayscale") === "true",
|
||||||
|
removeMetadata: searchParams.get("removeMetadata") === "true",
|
||||||
|
expectedSize: searchParams.get("expectedSize") || "",
|
||||||
|
aggressive: searchParams.get("aggressive") === "true",
|
||||||
};
|
};
|
||||||
case "merge":
|
case "merge":
|
||||||
return {
|
return {
|
||||||
@ -124,10 +127,13 @@ function updateToolParams(toolKey: string, searchParams: URLSearchParams, setSea
|
|||||||
params.set("allowDuplicates", String(merged.allowDuplicates));
|
params.set("allowDuplicates", String(merged.allowDuplicates));
|
||||||
}
|
}
|
||||||
} else if (toolKey === "compress") {
|
} 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 };
|
const merged = { ...getToolParams("compress", searchParams), ...newParams };
|
||||||
params.set("compressLevel", merged.level);
|
params.set("compressionLevel", String(merged.compressionLevel));
|
||||||
params.set("keepQuality", String(merged.keepQuality));
|
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") {
|
} else if (toolKey === "merge") {
|
||||||
["mergeOrder", "removeDuplicates"].forEach((k) => params.delete(k));
|
["mergeOrder", "removeDuplicates"].forEach((k) => params.delete(k));
|
||||||
const merged = { ...getToolParams("merge", searchParams), ...newParams };
|
const merged = { ...getToolParams("merge", searchParams), ...newParams };
|
||||||
@ -146,7 +152,7 @@ const TOOL_PARAMS = {
|
|||||||
"splitType", "splitValue", "bookmarkLevel", "includeMetadata", "allowDuplicates"
|
"splitType", "splitValue", "bookmarkLevel", "includeMetadata", "allowDuplicates"
|
||||||
],
|
],
|
||||||
compress: [
|
compress: [
|
||||||
"compressLevel", "keepQuality"
|
"compressionLevel", "grayscale", "removeMetadata", "expectedSize", "aggressive"
|
||||||
],
|
],
|
||||||
merge: [
|
merge: [
|
||||||
"mergeOrder", "removeDuplicates"
|
"mergeOrder", "removeDuplicates"
|
||||||
@ -222,13 +228,39 @@ export default function HomePage() {
|
|||||||
return <div>Tool not found</div>;
|
return <div>Tool not found</div>;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pass only the necessary props
|
// 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, {
|
return React.createElement(selectedTool.component, {
|
||||||
files,
|
files,
|
||||||
setDownloadUrl,
|
setDownloadUrl,
|
||||||
params: toolParams,
|
params: toolParams,
|
||||||
updateParams,
|
updateParams,
|
||||||
});
|
});
|
||||||
|
default:
|
||||||
|
return React.createElement(selectedTool.component, {
|
||||||
|
files,
|
||||||
|
setDownloadUrl,
|
||||||
|
params: toolParams,
|
||||||
|
updateParams,
|
||||||
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -9,25 +9,42 @@ export interface CompressProps {
|
|||||||
files?: FileWithUrl[];
|
files?: FileWithUrl[];
|
||||||
setDownloadUrl?: (url: string) => void;
|
setDownloadUrl?: (url: string) => void;
|
||||||
setLoading?: (loading: boolean) => void;
|
setLoading?: (loading: boolean) => void;
|
||||||
|
params?: {
|
||||||
|
compressionLevel: number;
|
||||||
|
grayscale: boolean;
|
||||||
|
removeMetadata: boolean;
|
||||||
|
expectedSize: string;
|
||||||
|
aggressive: boolean;
|
||||||
|
};
|
||||||
|
updateParams?: (newParams: Partial<CompressProps["params"]>) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
const CompressPdfPanel: React.FC<CompressProps> = ({
|
const CompressPdfPanel: React.FC<CompressProps> = ({
|
||||||
files = [],
|
files = [],
|
||||||
setDownloadUrl,
|
setDownloadUrl,
|
||||||
setLoading,
|
setLoading,
|
||||||
|
params = {
|
||||||
|
compressionLevel: 5,
|
||||||
|
grayscale: false,
|
||||||
|
removeMetadata: false,
|
||||||
|
expectedSize: "",
|
||||||
|
aggressive: false,
|
||||||
|
},
|
||||||
|
updateParams,
|
||||||
}) => {
|
}) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const [searchParams] = useSearchParams();
|
|
||||||
|
|
||||||
|
|
||||||
const [selected, setSelected] = useState<boolean[]>(files.map(() => false));
|
const [selected, setSelected] = useState<boolean[]>(files.map(() => false));
|
||||||
const [compressionLevel, setCompressionLevel] = useState<number>(5);
|
|
||||||
const [grayscale, setGrayscale] = useState<boolean>(false);
|
|
||||||
const [removeMetadata, setRemoveMetadata] = useState<boolean>(false);
|
|
||||||
const [expectedSize, setExpectedSize] = useState<string>("");
|
|
||||||
const [aggressive, setAggressive] = useState<boolean>(false);
|
|
||||||
const [localLoading, setLocalLoading] = useState<boolean>(false);
|
const [localLoading, setLocalLoading] = useState<boolean>(false);
|
||||||
|
|
||||||
|
const {
|
||||||
|
compressionLevel,
|
||||||
|
grayscale,
|
||||||
|
removeMetadata,
|
||||||
|
expectedSize,
|
||||||
|
aggressive,
|
||||||
|
} = params;
|
||||||
|
|
||||||
// Update selection state if files prop changes
|
// Update selection state if files prop changes
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
setSelected(files.map(() => false));
|
setSelected(files.map(() => false));
|
||||||
@ -104,7 +121,7 @@ const CompressPdfPanel: React.FC<CompressProps> = ({
|
|||||||
max={9}
|
max={9}
|
||||||
step={1}
|
step={1}
|
||||||
value={compressionLevel}
|
value={compressionLevel}
|
||||||
onChange={setCompressionLevel}
|
onChange={(value) => updateParams?.({ compressionLevel: value })}
|
||||||
marks={[
|
marks={[
|
||||||
{ value: 1, label: "1" },
|
{ value: 1, label: "1" },
|
||||||
{ value: 5, label: "5" },
|
{ value: 5, label: "5" },
|
||||||
@ -116,23 +133,23 @@ const CompressPdfPanel: React.FC<CompressProps> = ({
|
|||||||
<Checkbox
|
<Checkbox
|
||||||
label={t("compress.grayscale.label", "Convert images to grayscale")}
|
label={t("compress.grayscale.label", "Convert images to grayscale")}
|
||||||
checked={grayscale}
|
checked={grayscale}
|
||||||
onChange={e => setGrayscale(e.currentTarget.checked)}
|
onChange={e => updateParams?.({ grayscale: e.currentTarget.checked })}
|
||||||
/>
|
/>
|
||||||
<Checkbox
|
<Checkbox
|
||||||
label={t("removeMetadata.submit", "Remove PDF metadata")}
|
label={t("removeMetadata.submit", "Remove PDF metadata")}
|
||||||
checked={removeMetadata}
|
checked={removeMetadata}
|
||||||
onChange={e => setRemoveMetadata(e.currentTarget.checked)}
|
onChange={e => updateParams?.({ removeMetadata: e.currentTarget.checked })}
|
||||||
/>
|
/>
|
||||||
<Checkbox
|
<Checkbox
|
||||||
label={t("compress.selectText.1.1", "Aggressive compression (may reduce quality)")}
|
label={t("compress.selectText.1.1", "Aggressive compression (may reduce quality)")}
|
||||||
checked={aggressive}
|
checked={aggressive}
|
||||||
onChange={e => setAggressive(e.currentTarget.checked)}
|
onChange={e => updateParams?.({ aggressive: e.currentTarget.checked })}
|
||||||
/>
|
/>
|
||||||
<TextInput
|
<TextInput
|
||||||
label={t("compress.selectText.5", "Expected output size")}
|
label={t("compress.selectText.5", "Expected output size")}
|
||||||
placeholder={t("compress.selectText.5", "e.g. 25MB, 10.8MB, 25KB")}
|
placeholder={t("compress.selectText.5", "e.g. 25MB, 10.8MB, 25KB")}
|
||||||
value={expectedSize}
|
value={expectedSize}
|
||||||
onChange={e => setExpectedSize(e.currentTarget.value)}
|
onChange={e => updateParams?.({ expectedSize: e.currentTarget.value })}
|
||||||
/>
|
/>
|
||||||
<Button
|
<Button
|
||||||
onClick={handleCompress}
|
onClick={handleCompress}
|
||||||
|
@ -129,9 +129,13 @@ const SplitPdfPanel: React.FC<SplitPdfPanelProps> = ({
|
|||||||
setStatus(t("downloadComplete"));
|
setStatus(t("downloadComplete"));
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
setErrorMessage(
|
let errorMsg = t("error.pdfPassword", "An error occurred while splitting the PDF.");
|
||||||
error.response?.data || t("error.pdfPassword", "An error occurred while splitting the PDF.")
|
if (error.response?.data && typeof error.response.data === 'string') {
|
||||||
);
|
errorMsg = error.response.data;
|
||||||
|
} else if (error.message) {
|
||||||
|
errorMsg = error.message;
|
||||||
|
}
|
||||||
|
setErrorMessage(errorMsg);
|
||||||
setStatus(t("error._value", "Split failed."));
|
setStatus(t("error._value", "Split failed."));
|
||||||
} finally {
|
} finally {
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
import { defineConfig } from 'vite';
|
|
||||||
import react from '@vitejs/plugin-react';
|
|
||||||
|
|
||||||
export default defineConfig({
|
|
||||||
plugins: [react()],
|
|
||||||
});
|
|
@ -113,5 +113,5 @@
|
|||||||
"include": [
|
"include": [
|
||||||
"src",
|
"src",
|
||||||
"src/global.d.ts"
|
"src/global.d.ts"
|
||||||
]
|
, "vite.config.ts" ]
|
||||||
}
|
}
|
||||||
|
15
frontend/vite.config.ts
Normal file
15
frontend/vite.config.ts
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import { defineConfig } from 'vite';
|
||||||
|
import react from '@vitejs/plugin-react';
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
plugins: [react()],
|
||||||
|
server: {
|
||||||
|
proxy: {
|
||||||
|
'/api': {
|
||||||
|
target: 'http://localhost:8080',
|
||||||
|
changeOrigin: true,
|
||||||
|
secure: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
Loading…
x
Reference in New Issue
Block a user