diff --git a/frontend/src/hooks/useToolManagement.tsx b/frontend/src/hooks/useToolManagement.tsx
index b74e08353..31e63e93d 100644
--- a/frontend/src/hooks/useToolManagement.tsx
+++ b/frontend/src/hooks/useToolManagement.tsx
@@ -1,4 +1,4 @@
-import React, { useState, useCallback, useMemo } from 'react';
+import React, { useState, useCallback, useMemo, useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import AddToPhotosIcon from "@mui/icons-material/AddToPhotos";
import ContentCutIcon from "@mui/icons-material/ContentCut";
@@ -6,6 +6,7 @@ import ZoomInMapIcon from "@mui/icons-material/ZoomInMap";
import SplitPdfPanel from "../tools/Split";
import CompressPdfPanel from "../tools/Compress";
import MergePdfPanel from "../tools/Merge";
+import { useMultipleEndpointsEnabled } from "./useEndpointConfig";
type ToolRegistryEntry = {
icon: React.ReactNode;
@@ -18,112 +19,78 @@ type ToolRegistry = {
[key: string]: ToolRegistryEntry;
};
-// Base tool registry without translations
const baseToolRegistry = {
split: { icon: , component: SplitPdfPanel, view: "split" },
compress: { icon: , component: CompressPdfPanel, view: "viewer" },
merge: { icon: , component: MergePdfPanel, view: "pageEditor" },
};
-// Tool parameter defaults
-const getToolDefaults = (toolKey: string) => {
- switch (toolKey) {
- case 'split':
- return {
- mode: '',
- pages: '',
- hDiv: '2',
- vDiv: '2',
- merge: false,
- splitType: 'size',
- splitValue: '',
- bookmarkLevel: '1',
- includeMetadata: false,
- allowDuplicates: false,
- };
- case 'compress':
- return {
- quality: 80,
- imageCompression: true,
- removeMetadata: false
- };
- case 'merge':
- return {
- sortOrder: 'name',
- includeMetadata: true
- };
- default:
- return {};
- }
+// Tool endpoint mappings
+const toolEndpoints: Record = {
+ split: ["split-pages", "split-pdf-by-sections", "split-by-size-or-count", "split-pdf-by-chapters"],
+ compress: ["compress-pdf"],
+ merge: ["merge-pdfs"],
};
+
export const useToolManagement = () => {
const { t } = useTranslation();
-
+
const [selectedToolKey, setSelectedToolKey] = useState(null);
const [toolSelectedFileIds, setToolSelectedFileIds] = useState([]);
- const [toolParams, setToolParams] = useState>({});
- // Tool registry with translations
- const toolRegistry: ToolRegistry = useMemo(() => ({
- split: { ...baseToolRegistry.split, name: t("home.split.title", "Split PDF") },
- compress: { ...baseToolRegistry.compress, name: t("home.compressPdfs.title", "Compress PDF") },
- merge: { ...baseToolRegistry.merge, name: t("home.merge.title", "Merge PDFs") },
- }), [t]);
+ const allEndpoints = Array.from(new Set(Object.values(toolEndpoints).flat()));
+ const { endpointStatus, loading: endpointsLoading } = useMultipleEndpointsEnabled(allEndpoints);
- // Get tool parameters with defaults
- const getToolParams = useCallback((toolKey: string | null) => {
- if (!toolKey) return {};
-
- const storedParams = toolParams[toolKey] || {};
- const defaultParams = getToolDefaults(toolKey);
-
- return { ...defaultParams, ...storedParams };
- }, [toolParams]);
+ const isToolAvailable = useCallback((toolKey: string): boolean => {
+ if (endpointsLoading) return true;
+ const endpoints = toolEndpoints[toolKey] || [];
+ return endpoints.some(endpoint => endpointStatus[endpoint] === true);
+ }, [endpointsLoading, endpointStatus]);
- // Update tool parameters
- const updateToolParams = useCallback((toolKey: string, newParams: any) => {
- setToolParams(prev => ({
- ...prev,
- [toolKey]: {
- ...prev[toolKey],
- ...newParams
+ const toolRegistry: ToolRegistry = useMemo(() => {
+ const availableToolRegistry: ToolRegistry = {};
+ Object.keys(baseToolRegistry).forEach(toolKey => {
+ if (isToolAvailable(toolKey)) {
+ availableToolRegistry[toolKey] = {
+ ...baseToolRegistry[toolKey as keyof typeof baseToolRegistry],
+ name: t(`home.${toolKey}.title`, toolKey.charAt(0).toUpperCase() + toolKey.slice(1))
+ };
}
- }));
- }, []);
+ });
+ return availableToolRegistry;
+ }, [t, isToolAvailable]);
+
+ useEffect(() => {
+ if (!endpointsLoading && selectedToolKey && !toolRegistry[selectedToolKey]) {
+ const firstAvailableTool = Object.keys(toolRegistry)[0];
+ if (firstAvailableTool) {
+ setSelectedToolKey(firstAvailableTool);
+ } else {
+ setSelectedToolKey(null);
+ }
+ }
+ }, [endpointsLoading, selectedToolKey, toolRegistry]);
- // Select tool
const selectTool = useCallback((toolKey: string) => {
setSelectedToolKey(toolKey);
}, []);
- // Clear tool selection
const clearToolSelection = useCallback(() => {
setSelectedToolKey(null);
}, []);
- // Get currently selected tool
const selectedTool = selectedToolKey ? toolRegistry[selectedToolKey] : null;
return {
- // State
selectedToolKey,
selectedTool,
toolSelectedFileIds,
- toolParams: getToolParams(selectedToolKey),
toolRegistry,
-
- // Actions
+
selectTool,
clearToolSelection,
- updateToolParams: (newParams: any) => {
- if (selectedToolKey) {
- updateToolParams(selectedToolKey, newParams);
- }
- },
setToolSelectedFileIds,
-
- // Utilities
- getToolParams,
+
};
-};
\ No newline at end of file
+};
diff --git a/frontend/src/tools/Split.tsx b/frontend/src/tools/Split.tsx
index 7789e7db4..8e3114d7c 100644
--- a/frontend/src/tools/Split.tsx
+++ b/frontend/src/tools/Split.tsx
@@ -24,6 +24,7 @@ import { FileOperation } from "../types/fileContext";
import { zipFileService } from "../services/zipFileService";
import { generateThumbnailForFile } from "../utils/thumbnailUtils";
import FileEditor from "../components/fileEditor/FileEditor";
+import { useEndpointEnabled } from "../hooks/useEndpointConfig";
export interface SplitPdfPanelProps {
selectedFiles?: File[];
@@ -50,6 +51,22 @@ const SplitPdfPanel: React.FC = ({
const [includeMetadata, setIncludeMetadata] = useState(false);
const [allowDuplicates, setAllowDuplicates] = useState(false);
+ // Helper to get endpoint name from split mode
+ const getEndpointName = (mode: string) => {
+ switch (mode) {
+ case "byPages":
+ return "split-pages";
+ case "bySections":
+ return "split-pdf-by-sections";
+ case "bySizeOrCount":
+ return "split-by-size-or-count";
+ case "byChapters":
+ return "split-pdf-by-chapters";
+ default:
+ return "split-pages"; // Default fallback
+ }
+ };
+
const [status, setStatus] = useState("");
const [isLoading, setIsLoading] = useState(false);
const [errorMessage, setErrorMessage] = useState(null);