react-validator-dev
Version:
Real-time error messaging and supports field dependencies React hook for form validation
134 lines (133 loc) • 8.93 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const react_1 = require("react");
const isRequiredCheck = (data, errorMessage) => !data ? errorMessage : "";
const maxLengthCheck = (data, max, errorMessage) => data.length > max ? errorMessage : "";
const minLengthCheck = (data, min, errorMessage) => data.length < min ? errorMessage : "";
const excludedCharactersCheck = (data, chars, errorMessage) => (chars.some((char) => data.includes(char)) ? errorMessage : "");
const regexCheck = (data, regex, errorMessage) => new RegExp(regex).test(data) ? "" : errorMessage;
const alphaCheck = (data, errorMessage) => /^[A-Za-z]+$/.test(data) ? "" : errorMessage;
const emailCheck = (data, errorMessage) => {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailRegex.test(data) ? "" : errorMessage;
};
const alphaWithDashCheck = (data, errorMessage) => {
const regex = /^[A-Za-z]+(-[A-Za-z]+)*$/;
return regex.test(data) ? "" : errorMessage;
};
const numericCheck = (data, errorMessage) => /^\d+$/.test(data) ? "" : errorMessage;
const isDateCheck = (data, errorMessage) => {
const regex = /^\d{4}-\d{2}-\d{2}$/; // Example format YYYY-MM-DD
const date = new Date(data);
return regex.test(data) && !isNaN(date.getTime()) ? "" : errorMessage;
};
const alphaWithSpaceCheck = (data, errorMessage) => {
const regex = /^[A-Za-z]+( [A-Za-z]+)*$/;
return regex.test(data) ? "" : errorMessage;
};
const sameAsFieldCheck = (data, errorMessage, fieldValue) => (data === fieldValue ? "" : errorMessage);
const useValidation = (data, isMultiple = false, submit = true, debounceDelay = 300, validateAll = false) => {
const [errors, setErrors] = (0, react_1.useState)({
errors: {},
status: true,
});
const { fields, validation } = data;
const [fieldsInitailStaus, setFieldsInitailStaus] = (0, react_1.useState)();
const [submitted, setsubmitted] = (0, react_1.useState)(true);
(0, react_1.useEffect)(() => {
let status = Object.assign({}, fields);
Object.keys(fields).forEach((field) => (status[field] = false));
setFieldsInitailStaus(status);
setsubmitted(submit);
}, []);
const validateC = () => {
const newErrors = {};
Object.keys(fields).forEach((field) => {
var _a;
const multipleMessages = [];
const value = fields[field];
let error = "";
const rules = validation.rules[field];
const messages = (_a = validation === null || validation === void 0 ? void 0 : validation.messages) === null || _a === void 0 ? void 0 : _a[field];
let isRequired = false;
if (rules === null || rules === void 0 ? void 0 : rules.isRequired) {
error = isRequiredCheck(value, (messages === null || messages === void 0 ? void 0 : messages.isRequired) || `Please enter the ${field}`);
if (error === null || error === void 0 ? void 0 : error.length) {
isRequired = true;
multipleMessages.push(error);
}
}
if ((!error || isMultiple) && (rules === null || rules === void 0 ? void 0 : rules.maxLength) !== undefined && !isRequired) {
error = maxLengthCheck(value, rules.maxLength, (messages === null || messages === void 0 ? void 0 : messages.maxLength) ||
`The ${field} length should be at most ${rules.maxLength}`);
(error === null || error === void 0 ? void 0 : error.length) && multipleMessages.push(error);
}
if ((!error || isMultiple) && (rules === null || rules === void 0 ? void 0 : rules.minLength) !== undefined && !isRequired) {
error = minLengthCheck(value, rules.minLength, (messages === null || messages === void 0 ? void 0 : messages.minLength) ||
`The ${field} length should be at least ${rules.minLength}`);
(error === null || error === void 0 ? void 0 : error.length) && multipleMessages.push(error);
}
if ((!error || isMultiple) && (rules === null || rules === void 0 ? void 0 : rules.excludedCharacters) && !isRequired) {
error = excludedCharactersCheck(value, rules.excludedCharacters, (messages === null || messages === void 0 ? void 0 : messages.excludedCharacters) || `Please enter valid ${field}`);
(error === null || error === void 0 ? void 0 : error.length) && multipleMessages.push(error);
}
if ((!error || isMultiple) && (rules === null || rules === void 0 ? void 0 : rules.regex) && !isRequired) {
error = regexCheck(value, rules.regex, (messages === null || messages === void 0 ? void 0 : messages.regex) || `The ${field} format is invalid`);
(error === null || error === void 0 ? void 0 : error.length) && multipleMessages.push(error);
}
if ((!error || isMultiple) && (rules === null || rules === void 0 ? void 0 : rules.alpha) && !isRequired) {
error = alphaCheck(value, (messages === null || messages === void 0 ? void 0 : messages.alpha) || `Please enter valid ${field}`);
(error === null || error === void 0 ? void 0 : error.length) && multipleMessages.push(error);
}
if ((!error || isMultiple) && (rules === null || rules === void 0 ? void 0 : rules.email) && !isRequired) {
error = emailCheck(value, (messages === null || messages === void 0 ? void 0 : messages.email) || `Please enter a valid ${field}`);
(error === null || error === void 0 ? void 0 : error.length) && multipleMessages.push(error);
}
if ((!error || isMultiple) && (rules === null || rules === void 0 ? void 0 : rules.numeric) && !isRequired) {
error = numericCheck(value, (messages === null || messages === void 0 ? void 0 : messages.numeric) || `Please enter a valid ${field}`);
(error === null || error === void 0 ? void 0 : error.length) && multipleMessages.push(error);
}
if ((!error || isMultiple) && (rules === null || rules === void 0 ? void 0 : rules.date) && !isRequired) {
error = isDateCheck(value, (messages === null || messages === void 0 ? void 0 : messages.date) || `Please enter a valid ${field}`);
(error === null || error === void 0 ? void 0 : error.length) && multipleMessages.push(error);
}
if ((!error || isMultiple) && (rules === null || rules === void 0 ? void 0 : rules.alphaDash) && !isRequired) {
error = alphaWithDashCheck(value, (messages === null || messages === void 0 ? void 0 : messages.alphaDash) || `Please enter valid ${field}`);
(error === null || error === void 0 ? void 0 : error.length) && multipleMessages.push(error);
}
if ((!error || isMultiple) && (rules === null || rules === void 0 ? void 0 : rules.alphaSpace) && !isRequired) {
error = alphaWithSpaceCheck(value, (messages === null || messages === void 0 ? void 0 : messages.alphaSpace) || `Please enter valid ${field}`);
(error === null || error === void 0 ? void 0 : error.length) && multipleMessages.push(error);
}
if ((!error || isMultiple) && (rules === null || rules === void 0 ? void 0 : rules.sameAsField) && !isRequired) {
const otherFieldValue = fields[rules.sameAsField];
error = sameAsFieldCheck(value, (messages === null || messages === void 0 ? void 0 : messages.sameAsField) ||
`Please ensure ${field} matches ${rules.sameAsField}`, otherFieldValue);
(error === null || error === void 0 ? void 0 : error.length) && multipleMessages.push(error);
}
if (!error.length) {
setFieldsInitailStaus(Object.assign(Object.assign({}, fieldsInitailStaus), { [field]: true }));
}
if ((fieldsInitailStaus === null || fieldsInitailStaus === void 0 ? void 0 : fieldsInitailStaus[field]) == true || submitted == true) {
newErrors[field] = !isMultiple ? error : multipleMessages;
}
});
if (JSON.stringify(errors.errors) !== JSON.stringify(newErrors)) {
const status = Object.values(newErrors).some((error) => error.length);
setErrors({ errors: newErrors, status });
}
};
(0, react_1.useEffect)(() => {
const handler = setTimeout(() => {
validateC();
}, debounceDelay);
return () => {
clearTimeout(handler);
};
}, [fields, validation, debounceDelay, submitted]);
(0, react_1.useEffect)(() => {
validateAll && setsubmitted(true);
}, [validateAll]);
return [errors];
};
exports.default = useValidation;