From 6dbaff534276ea68eaff2ea38d7da91cdb1669bd Mon Sep 17 00:00:00 2001 From: James Brunton Date: Fri, 29 Aug 2025 17:23:44 +0100 Subject: [PATCH] Fix Split to be a single file interface (#4327) # Description of Changes Split was previously incorrectly marked as a multi-file interface, which meant that if you fed 2 files into it, it'd just process the first and discard the second. This PR changes it to a single-file interface, and implements a custom response handler because Split returns Zip files instead of PDFs, so the response you get when running Split now is the union of all of the split input files in the workbench (or them all zipped if you download it). --- .../hooks/tools/split/useSplitOperation.ts | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/frontend/src/hooks/tools/split/useSplitOperation.ts b/frontend/src/hooks/tools/split/useSplitOperation.ts index e3d9a1727..394fb694d 100644 --- a/frontend/src/hooks/tools/split/useSplitOperation.ts +++ b/frontend/src/hooks/tools/split/useSplitOperation.ts @@ -1,16 +1,16 @@ +import { useCallback } from 'react'; import { useTranslation } from 'react-i18next'; -import { ToolType, useToolOperation } from '../shared/useToolOperation'; +import { ToolType, useToolOperation, ToolOperationConfig } from '../shared/useToolOperation'; import { createStandardErrorHandler } from '../../../utils/toolErrorHandler'; import { SplitParameters, defaultParameters } from './useSplitParameters'; import { SPLIT_MODES } from '../../../constants/splitConstants'; +import { useToolResources } from '../shared/useToolResources'; // Static functions that can be used by both the hook and automation executor -export const buildSplitFormData = (parameters: SplitParameters, selectedFiles: File[]): FormData => { +export const buildSplitFormData = (parameters: SplitParameters, file: File): FormData => { const formData = new FormData(); - selectedFiles.forEach(file => { - formData.append("fileInput", file); - }); + formData.append("fileInput", file); switch (parameters.mode) { case SPLIT_MODES.BY_PAGES: @@ -57,7 +57,7 @@ export const getSplitEndpoint = (parameters: SplitParameters): string => { // Static configuration object export const splitOperationConfig = { - toolType: ToolType.multiFile, + toolType: ToolType.singleFile, buildFormData: buildSplitFormData, operationType: 'splitPdf', endpoint: getSplitEndpoint, @@ -67,9 +67,20 @@ export const splitOperationConfig = { export const useSplitOperation = () => { const { t } = useTranslation(); + const { extractZipFiles } = useToolResources(); - return useToolOperation({ + // Custom response handler that extracts ZIP files + // Can't add to exported config because it requires access to the zip code so must be part of the hook + const responseHandler = useCallback(async (blob: Blob, originalFiles: File[]): Promise => { + // Split operations return ZIP files with multiple PDF pages + return await extractZipFiles(blob); + }, [extractZipFiles]); + + const splitConfig: ToolOperationConfig = { ...splitOperationConfig, + responseHandler, getErrorMessage: createStandardErrorHandler(t('split.error.failed', 'An error occurred while splitting the PDF.')) - }); + }; + + return useToolOperation(splitConfig); };