UNPKG

react-browser-form

Version:

<div align="center"> <a href="https://deniskabana.github.io/react-browser-form/introduction" title="React Browser Form - Form management in React made simple for browsers."> <img src="https://raw.githubusercontent.com/deniskabana/react-browser-form/

59 lines (50 loc) 2.1 kB
import { DEFAULT_REQUIRED_ERROR_MESSAGE, DEFAULT_VALIDATION_ERROR_MESSAGE } from "../constants"; import { DataFlowState } from "../types"; import { ValidationError } from "../errors/ValidationError"; /** Validate **changed** data only. */ export function validateFormState<Schema>(dataFlowState: DataFlowState<Schema>): void { if (!dataFlowState.options.validationSchema) return; const { changedData, formState, fieldsData: { required, validated }, } = dataFlowState; const data = changedData ?? formState; const oldErrors = { ...dataFlowState.errorData.errors }; const newErrors: Partial<Record<keyof Schema, string>> = {}; for (let key in data) { // Clear this from the old errors delete oldErrors[key]; // Check required if (required.includes(key)) { const newValue = data[key] as unknown; if (newValue === null || newValue === undefined || newValue === false || String(newValue).length === 0) { newErrors[key] = dataFlowState.options?.validationSchema?.required?.message ?? DEFAULT_REQUIRED_ERROR_MESSAGE; dataFlowState.hasErrors = true; } } // Check validated if (validated.includes(key)) { const validator = dataFlowState.options?.validationSchema?.validators ? dataFlowState.options?.validationSchema?.validators[key] : null; if (!validator) break; try { if (typeof validator === "function") { validator(data[key] as Schema[Extract<keyof Schema, string>], { ...formState, ...data }); } else if (Array.isArray(validator)) { for (let validatorFn of validator) { validatorFn(data[key], { ...formState, ...data }); } } else { throw new Error("react-browser-form: Invalid validators provided!"); } } catch (error) { if (!(error instanceof ValidationError)) throw error; newErrors[key] = (error as any)?.message ?? DEFAULT_VALIDATION_ERROR_MESSAGE; dataFlowState.hasErrors = true; } } } dataFlowState.setErrors({ ...oldErrors, ...newErrors }); }