2025-08-28 10:59:38 +01:00
|
|
|
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<TParams> {
|
|
|
|
// File management
|
|
|
|
selectedFiles: File[];
|
|
|
|
|
|
|
|
// Tool-specific hooks
|
|
|
|
params: BaseParametersHook<TParams>;
|
|
|
|
operation: ToolOperationHook<TParams>;
|
|
|
|
|
|
|
|
// Endpoint validation
|
|
|
|
endpointEnabled: boolean | null;
|
|
|
|
endpointLoading: boolean;
|
|
|
|
|
|
|
|
// Standard handlers
|
|
|
|
handleExecute: () => Promise<void>;
|
|
|
|
handleThumbnailClick: (file: File) => void;
|
|
|
|
handleSettingsReset: () => void;
|
2025-09-02 15:09:05 +01:00
|
|
|
handleUndo: () => Promise<void>;
|
2025-08-28 10:59:38 +01:00
|
|
|
|
|
|
|
// Standard computed state
|
|
|
|
hasFiles: boolean;
|
|
|
|
hasResults: boolean;
|
|
|
|
settingsCollapsed: boolean;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Base tool hook for tool components. Manages standard behaviour for tools.
|
|
|
|
*/
|
|
|
|
export function useBaseTool<TParams>(
|
|
|
|
toolName: string,
|
|
|
|
useParams: () => BaseParametersHook<TParams>,
|
|
|
|
useOperation: () => ToolOperationHook<TParams>,
|
|
|
|
props: BaseToolProps,
|
|
|
|
): BaseToolReturn<TParams> {
|
|
|
|
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]);
|
|
|
|
|
2025-09-02 15:09:05 +01:00
|
|
|
const handleUndo = useCallback(async () => {
|
|
|
|
await operation.undoOperation();
|
|
|
|
onPreviewFile?.(null);
|
|
|
|
}, [operation, onPreviewFile]);
|
|
|
|
|
2025-08-28 10:59:38 +01:00
|
|
|
// 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,
|
2025-09-02 15:09:05 +01:00
|
|
|
handleUndo,
|
2025-08-28 10:59:38 +01:00
|
|
|
|
|
|
|
// State
|
|
|
|
hasFiles,
|
|
|
|
hasResults,
|
|
|
|
settingsCollapsed
|
|
|
|
};
|
|
|
|
}
|