mirror of
https://github.com/streamich/react-use.git
synced 2026-01-18 14:06:52 +00:00
38 lines
1.3 KiB
TypeScript
38 lines
1.3 KiB
TypeScript
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
import { StateValidator, UseStateValidatorReturn, ValidityState } from './useStateValidator';
|
|
|
|
export type MultiStateValidatorStates = any[] | { [p: string]: any } | { [p: number]: any };
|
|
export type MultiStateValidator<V extends ValidityState, S extends MultiStateValidatorStates> = StateValidator<V, S>;
|
|
|
|
export function useMultiStateValidator<V extends ValidityState, S extends MultiStateValidatorStates, I extends V>(
|
|
states: S,
|
|
validator: MultiStateValidator<V, S>,
|
|
initialValidity: I = [undefined] as I
|
|
): UseStateValidatorReturn<V> {
|
|
if (typeof states !== 'object') {
|
|
throw new Error('states expected to be an object or array, got ' + typeof states);
|
|
}
|
|
|
|
const validatorInner = useRef(validator);
|
|
const statesInner = useRef(states);
|
|
|
|
validatorInner.current = validator;
|
|
statesInner.current = states;
|
|
|
|
const [validity, setValidity] = useState(initialValidity as V);
|
|
|
|
const validate = useCallback(() => {
|
|
if (validatorInner.current.length >= 2) {
|
|
validatorInner.current(statesInner.current, setValidity);
|
|
} else {
|
|
setValidity(validatorInner.current(statesInner.current));
|
|
}
|
|
}, [setValidity]);
|
|
|
|
useEffect(() => {
|
|
validate();
|
|
}, Object.values(states));
|
|
|
|
return [validity, validate];
|
|
}
|