UNPKG

uno-react

Version:

Common functions, and hooks for React.

47 lines (46 loc) 2.1 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.useValidation = void 0; const react_1 = require("react"); const useEffectWithDebounce_1 = __importDefault(require("./useEffectWithDebounce")); const validate = (_hasChanged, currentErrors, disabledHasChange, value) => !Object.keys(currentErrors).some((x) => currentErrors[x]) && (disabledHasChange || !Object.keys(value).some((x) => (_hasChanged[x] === undefined ? false : !_hasChanged[x]))); const errorReducer = (_hasChanged, validation, disabledHasChange, value) => (last, current) => { const error = validation(current, value[current], value); if (disabledHasChange) { last[current] = error; } else { if (error) { last[current] = error; _hasChanged[current] = true; } else { last[current] = !_hasChanged[current] ? '' : error; } if (!_hasChanged[current]) { _hasChanged[current] = true; last[current] = error; } } return last; }; const useValidation = (validation, value, debounce = 100, disabledHasChange = false) => { const [errors, setErrors] = (0, react_1.useState)({}); const [isValid, setIsValid] = (0, react_1.useState)(false); const [hasChanged, setHasChanged] = (0, react_1.useState)({}); const effect = (0, react_1.useCallback)(() => { const _hasChanged = Object.assign({}, hasChanged); const currentErrors = Object.keys(value).reduce(errorReducer(_hasChanged, validation, disabledHasChange, value), {}); setHasChanged(_hasChanged); const _isValid = validate(_hasChanged, currentErrors, disabledHasChange, value); setErrors(currentErrors); setIsValid(_isValid); }, [hasChanged, value, validation, disabledHasChange]); (0, useEffectWithDebounce_1.default)(effect, debounce); return [isValid, errors]; }; exports.useValidation = useValidation;