From be251d271d90a96243bd2fba58457fbde2f36b92 Mon Sep 17 00:00:00 2001 From: Reece Date: Tue, 15 Jul 2025 00:20:59 +0100 Subject: [PATCH] Restore/refactor endpoint mamagement. refactor usetool management --- frontend/src/hooks/useToolManagement.tsx | 115 ++++++++--------------- frontend/src/tools/Split.tsx | 17 ++++ 2 files changed, 58 insertions(+), 74 deletions(-) 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);