uno-react
Version:
Common functions, and hooks for React.
47 lines (46 loc) • 2.1 kB
JavaScript
;
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;