import {ComputedRef, unref} from 'vue'; import { Dispatch, SetStateAction, useEffect, useReactive, useReadonly, useRef } from './index'; export type ValidityState = [boolean | undefined, ...any[]] | [undefined]; export interface StateValidator { (state: S): V; (state: S, dispatch: Dispatch>): void; } export type UseStateValidatorReturn = [Readonly, () => void]; export default function useStateValidator( state: S, validator: StateValidator, initialState: V = [undefined] as V ): UseStateValidatorReturn { const stateInner = useRef(state); const validatorInner = useRef(validator); const [validity, setValidity] = useReadonly(initialState as V); const validate = () => { if (validatorInner.value.length >= 2) { validatorInner.value(unref(stateInner.value) as S, setValidity as Dispatch>); } else { setValidity(validatorInner.value(unref(stateInner.value) as S)); } }; return [validity, validate]; }