import { useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import { ToolType, useToolOperation, ToolOperationConfig } from '../shared/useToolOperation'; import { createStandardErrorHandler } from '../../../utils/toolErrorHandler'; import { ScannerImageSplitParameters, defaultParameters } from './useScannerImageSplitParameters'; import { useToolResources } from '../shared/useToolResources'; export const buildScannerImageSplitFormData = (parameters: ScannerImageSplitParameters, file: File): FormData => { const formData = new FormData(); formData.append('fileInput', file); formData.append('angle_threshold', parameters.angle_threshold.toString()); formData.append('tolerance', parameters.tolerance.toString()); formData.append('min_area', parameters.min_area.toString()); formData.append('min_contour_area', parameters.min_contour_area.toString()); formData.append('border_size', parameters.border_size.toString()); return formData; }; // Static configuration object export const scannerImageSplitOperationConfig = { toolType: ToolType.singleFile, buildFormData: buildScannerImageSplitFormData, operationType: 'scannerImageSplit', endpoint: '/api/v1/misc/extract-image-scans', defaultParameters, } as const; export const useScannerImageSplitOperation = () => { const { t } = useTranslation(); const { extractAllZipFiles } = useToolResources(); // Custom response handler that extracts ZIP files containing images // Can't add to exported config because it requires access to the hook so must be part of the hook const responseHandler = useCallback(async (blob: Blob, originalFiles: File[]): Promise => { try { // Scanner image split returns ZIP files with multiple images const extractedFiles = await extractAllZipFiles(blob); // If extraction succeeded and returned files, use them if (extractedFiles.length > 0) { return extractedFiles; } } catch (error) { console.warn('Failed to extract as ZIP, treating as single file:', error); } // Fallback: treat as single file (PNG image) const inputFileName = originalFiles[0]?.name || 'document'; const baseFileName = inputFileName.replace(/\.[^.]+$/, ''); const singleFile = new File([blob], `${baseFileName}.png`, { type: 'image/png' }); return [singleFile]; }, [extractAllZipFiles]); const config: ToolOperationConfig = { ...scannerImageSplitOperationConfig, responseHandler, getErrorMessage: createStandardErrorHandler(t('scannerImageSplit.error.failed', 'An error occurred while extracting image scans.')) }; return useToolOperation(config); };