Skip to main content

All hooks

useMultiStateValidator

Custom hook that validates multiple states at once.


Usage

import { useMultiStateValidator } from '@ts-hooks-kit/core'

function Example() {
  const result = useMultiStateValidator()
  return <pre>{JSON.stringify(result, null, 2)}</pre>
}

API

function useMultiStateValidator(states: S[], validator: ValidatorFn<S>): V

Custom hook that validates multiple states at once.

Parameters

NameTypeDefault valueDescription
statesS[]-Array of states to validate.
validatorValidatorFn<S>-Function that receives all states and returns validation result.

Returns

The validation result.

Type declaration

UseMultiStateValidatorReturn

The hook return type.

ValidatorFn

The validator function type.

Hook

import { useCallback, useEffect, useRef, useState } from 'react'

/** The validator function type. */
export type ValidatorFn<S> = (...states: S[]) => unknown

/** The hook return type. */
export type UseMultiStateValidatorReturn<V> = V

/**
 * Custom hook that validates multiple states at once.
 * @param {S[]} states - Array of states to validate.
 * @param {ValidatorFn<S>} validator - Function that receives all states and returns validation result.
 * @returns {UseMultiStateValidatorReturn<V>} The validation result.
 * @public
 * @see [Documentation](https://react-use.vercel.app/useMultiStateValidator)
 * @example
 * ```tsx
 * const isValid = useMultiStateValidator(
 *   [email, password, confirmPassword],
 *   (email, password, confirm) => email.includes('@') && password.length >= 8 && password === confirm
 * );
 * ```
 */
export function useMultiStateValidator<S, V>(
  states: S[],
  validator: ValidatorFn<S>
): UseMultiStateValidatorReturn<V> {
  const [result, setResult] = useState<V>(() =>
    validator(...states) as V
  )

  const validatorRef = useRef(validator)
  validatorRef.current = validator

  useEffect(() => {
    setResult(validatorRef.current(...states) as V)
  }, [states])

  return result
}