V2 reduce boilerplate in param hooks (#4246)

# Description of Changes
Extend the base params in all tools param hooks, reducing boilerplate
code.
This commit is contained in:
James Brunton
2025-08-21 08:48:25 +01:00
committed by GitHub
parent d06cbcaa91
commit a6706fcb0c
18 changed files with 308 additions and 478 deletions

View File

@@ -1,7 +1,8 @@
import { useState } from 'react';
import { SPLIT_MODES, SPLIT_TYPES, ENDPOINTS, type SplitMode, SplitType } from '../../../constants/splitConstants';
import { BaseParameters } from '../../../types/parameters';
import { useBaseParameters, BaseParametersHook } from '../shared/useBaseParameters';
export interface SplitParameters {
export interface SplitParameters extends BaseParameters {
mode: SplitMode | '';
pages: string;
hDiv: string;
@@ -14,15 +15,9 @@ export interface SplitParameters {
allowDuplicates: boolean;
}
export interface SplitParametersHook {
parameters: SplitParameters;
updateParameter: (parameter: keyof SplitParameters, value: string | boolean) => void;
resetParameters: () => void;
validateParameters: () => boolean;
getEndpointName: () => string;
}
export type SplitParametersHook = BaseParametersHook<SplitParameters>;
const initialParameters: SplitParameters = {
const defaultParameters: SplitParameters = {
mode: '',
pages: '',
hDiv: '2',
@@ -36,43 +31,27 @@ const initialParameters: SplitParameters = {
};
export const useSplitParameters = (): SplitParametersHook => {
const [parameters, setParameters] = useState<SplitParameters>(initialParameters);
return useBaseParameters({
defaultParameters,
endpointName: (params) => {
if (!params.mode) return ENDPOINTS[SPLIT_MODES.BY_PAGES];
return ENDPOINTS[params.mode as SplitMode];
},
validateFn: (params) => {
if (!params.mode) return false;
const updateParameter = (parameter: keyof SplitParameters, value: string | boolean) => {
setParameters(prev => ({ ...prev, [parameter]: value }));
};
const resetParameters = () => {
setParameters(initialParameters);
};
const validateParameters = () => {
if (!parameters.mode) return false;
switch (parameters.mode) {
case SPLIT_MODES.BY_PAGES:
return parameters.pages.trim() !== "";
case SPLIT_MODES.BY_SECTIONS:
return parameters.hDiv !== "" && parameters.vDiv !== "";
case SPLIT_MODES.BY_SIZE_OR_COUNT:
return parameters.splitValue.trim() !== "";
case SPLIT_MODES.BY_CHAPTERS:
return parameters.bookmarkLevel !== "";
default:
return false;
}
};
const getEndpointName = () => {
if (!parameters.mode) return ENDPOINTS[SPLIT_MODES.BY_PAGES];
return ENDPOINTS[parameters.mode as SplitMode];
};
return {
parameters,
updateParameter,
resetParameters,
validateParameters,
getEndpointName,
};
switch (params.mode) {
case SPLIT_MODES.BY_PAGES:
return params.pages.trim() !== "";
case SPLIT_MODES.BY_SECTIONS:
return params.hDiv !== "" && params.vDiv !== "";
case SPLIT_MODES.BY_SIZE_OR_COUNT:
return params.splitValue.trim() !== "";
case SPLIT_MODES.BY_CHAPTERS:
return params.bookmarkLevel !== "";
default:
return false;
}
},
});
};