// Copyright 2017-2026 @pezkuwi/react-hooks authors & contributors // SPDX-License-Identifier: Apache-2.0 import { useCallback, useMemo, useState } from 'react'; import { isUndefined } from '@pezkuwi/util'; export type FormField = [ T | null, boolean, (_?: T | null) => void ]; type ValidateFn = (_: T) => boolean; const defaultValidate = (): boolean => true; // FIXME Since we use generics, this cannot be a createNamedHook as of yet export function useFormField (defaultValue: T | null, validate: ValidateFn = defaultValidate): FormField { const [value, setValue] = useState(defaultValue); const isValid = useMemo( () => !!value && validate(value), [validate, value] ); const setter = useCallback( (value?: T | null) => !isUndefined(value) && setValue(value), [] ); return [value, isValid, setter]; }