import { useEffect } from 'react' import type { FieldValidator } from 'final-form' import type { FieldMetaState } from 'react-final-form' import type { ValueType } from '../../FieldBase' import { useFormContext } from '../../Form/FormContext' export type Props = { name: string meta: FieldMetaState validators: FieldValidator shouldValidateOnSubmit?: boolean } export const getFieldError = ( meta: FieldMetaState, shouldValidateOnSubmit?: boolean ) => { if (shouldValidateOnSubmit && meta.modifiedSinceLastSubmit) { return null } if (!meta.error && !meta.submitError) { return null } if (!meta.touched) { return null } if (meta.error) { return meta.error } if (meta.dirtySinceLastSubmit) { return null } return meta.submitError } const useFieldValidation = ({ name, meta, validators, shouldValidateOnSubmit, }: Props) => { const { setValidators, clearValidators } = useFormContext() useEffect(() => { if (shouldValidateOnSubmit) { setValidators(name, validators) } return () => { clearValidators(name) } }, [setValidators, clearValidators, validators, shouldValidateOnSubmit, name]) return getFieldError(meta, shouldValidateOnSubmit) } export default useFieldValidation