import { useState, useCallback, Dispatch, SetStateAction } from 'react'; export interface BaseParametersHook { parameters: T; setParameters: Dispatch>; updateParameter: (parameter: K, value: T[K]) => void; resetParameters: () => void; validateParameters: () => boolean; getEndpointName: () => string; } export interface BaseParametersConfig { defaultParameters: T; endpointName: string | ((params: T) => string); validateFn?: (params: T) => boolean; } export function useBaseParameters(config: BaseParametersConfig): BaseParametersHook { const [parameters, setParameters] = useState(config.defaultParameters); const updateParameter = useCallback((parameter: K, value: T[K]) => { setParameters(prev => ({ ...prev, [parameter]: value, })); }, []); const resetParameters = useCallback(() => { setParameters(config.defaultParameters); }, [config.defaultParameters]); const validateParameters = useCallback(() => { return config.validateFn ? config.validateFn(parameters) : true; }, [parameters, config.validateFn]); const endpointName = config.endpointName; let getEndpointName: () => string; if (typeof endpointName === "string") { getEndpointName = useCallback(() => { return endpointName; }, []); } else { getEndpointName = useCallback(() => { return endpointName(parameters); }, [parameters]); } return { parameters, setParameters, updateParameter, resetParameters, validateParameters, getEndpointName, }; }