UNPKG

koval-ui

Version:

React components collection with minimalistic design. Supports theming, layout, and input validation.

95 lines (94 loc) 2.5 kB
"use client"; import { useState as C, useCallback as s } from "react"; import w from "awesome-debounce-promise"; import { ValidationState as u } from "./ValidationProps.js"; import { defaultValidator as A } from "./defaultValidator.js"; import { useHandleFormReset as E } from "./useHandleFormReset.js"; import { getFormState as V } from "./getFormState.js"; const g = (r, e) => e === "interactive" ? r.target.checked : r.target.value, b = ({ validatorFn: r, reportValidity: e, setValidity: y }) => { const i = s( (o, t) => { const c = g(t, o), m = V(t.target.form), l = r?.( c, t.target.validity, m ); t.target.setCustomValidity(l), e(t); }, [r, e] ), d = s(() => { }, []), n = s(w(r, 1e3), [ r ]), f = s( async (o, t) => { t.target.setCustomValidity(""); const c = g(t, o), m = V(t.target.form); y(u.inProgress); let l = ""; try { l = await n( c, t.target.validity, m ); } catch (a) { t.target.setCustomValidity(a); } t.target.setCustomValidity(l), e(t); }, [y, n, e] ); return { createValidatorSync: i, createValidatorAsync: f, createValidatorExternal: d }; }, F = (r) => typeof r == "function" ? r : A, h = (r) => r?.constructor.name === "AsyncFunction" ? "async" : typeof r == "string" ? "external" : "sync", R = ({ validation: r, hasValidators: e }) => { const y = F(r), i = h(r), [d, n] = C( u.pristine ); E(n); const f = s( (a) => { const p = a.target.reportValidity(), x = e ? u.valid : u.pristine, S = p ? x : u.error; (e || d === u.error) && n(S); }, [e, d] ), { createValidatorAsync: o, createValidatorSync: t, createValidatorExternal: c } = b({ validatorFn: y, reportValidity: f, setValidity: n }), m = s( (a) => { switch (i) { case "sync": return t("interactive", a); case "async": return o("interactive", a); case "external": return c(); } }, [o, c, t, i] ), l = s( (a) => { switch (i) { case "sync": return t("textual", a); case "async": return o("textual", a); case "external": return c(); } }, [i, t, o, c] ); return { validateInteractive: m, validateTextual: l, validity: d, setValidity: n }; }; export { R as useValidation }; //# sourceMappingURL=useValidation.js.map