koval-ui
Version:
React components collection with minimalistic design. Supports theming, layout, and input validation.
95 lines (94 loc) • 2.5 kB
JavaScript
"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