import { useEffect, useCallback } from 'react'; import { useFileSelection } from '../../../contexts/FileContext'; import { useEndpointEnabled } from '../../useEndpointConfig'; import { BaseToolProps } from '../../../types/tool'; import { ToolOperationHook } from './useToolOperation'; import { BaseParametersHook } from './useBaseParameters'; interface BaseToolReturn { // File management selectedFiles: File[]; // Tool-specific hooks params: BaseParametersHook; operation: ToolOperationHook; // Endpoint validation endpointEnabled: boolean | null; endpointLoading: boolean; // Standard handlers handleExecute: () => Promise; handleThumbnailClick: (file: File) => void; handleSettingsReset: () => void; // Standard computed state hasFiles: boolean; hasResults: boolean; settingsCollapsed: boolean; } /** * Base tool hook for tool components. Manages standard behaviour for tools. */ export function useBaseTool( toolName: string, useParams: () => BaseParametersHook, useOperation: () => ToolOperationHook, props: BaseToolProps, ): BaseToolReturn { const { onPreviewFile, onComplete, onError } = props; // File selection const { selectedFiles } = useFileSelection(); // Tool-specific hooks const params = useParams(); const operation = useOperation(); // Endpoint validation using parameters hook const { enabled: endpointEnabled, loading: endpointLoading } = useEndpointEnabled(params.getEndpointName()); // Reset results when parameters change useEffect(() => { operation.resetResults(); onPreviewFile?.(null); }, [params.parameters]); // Reset results when selected files change useEffect(() => { if (selectedFiles.length > 0) { operation.resetResults(); onPreviewFile?.(null); } }, [selectedFiles.length]); // Standard handlers const handleExecute = useCallback(async () => { try { await operation.executeOperation(params.parameters, selectedFiles); if (operation.files && onComplete) { onComplete(operation.files); } } catch (error) { if (onError) { const message = error instanceof Error ? error.message : `${toolName} operation failed`; onError(message); } } }, [operation, params.parameters, selectedFiles, onComplete, onError, toolName]); const handleThumbnailClick = useCallback((file: File) => { onPreviewFile?.(file); sessionStorage.setItem('previousMode', toolName); }, [onPreviewFile, toolName]); const handleSettingsReset = useCallback(() => { operation.resetResults(); onPreviewFile?.(null); }, [operation, onPreviewFile]); // Standard computed state const hasFiles = selectedFiles.length > 0; const hasResults = operation.files.length > 0 || operation.downloadUrl !== null; const settingsCollapsed = !hasFiles || hasResults; return { // File management selectedFiles, // Tool-specific hooks params, operation, // Endpoint validation endpointEnabled, endpointLoading, // Handlers handleExecute, handleThumbnailClick, handleSettingsReset, // State hasFiles, hasResults, settingsCollapsed }; }