@hitachivantara/uikit-react-core
Version:
Core React components for the NEXT Design System.
109 lines (108 loc) • 3.71 kB
JavaScript
const isNumeric = (num) => (
// to prevent Number( <spaces> ) = 0
num.trim().length > 0 && !Number.isNaN(Number(num))
);
const isEmail = (email) => {
const regexp = /^[^\\s]+[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?[.])+[a-z0-9](?:[a-z0-9-]*[a-z0-9])$/i;
return regexp.test(email);
};
const computeValidationType = (type) => {
switch (type) {
case "number":
return "number";
case "email":
return "email";
default:
return "none";
}
};
const hasBuiltInValidations = (required, validationType, minCharQuantity, maxCharQuantity, validation, inputProps) => required || validationType !== "none" || minCharQuantity != null || maxCharQuantity != null || validation != null || inputProps?.required != null || inputProps?.minLength != null || inputProps?.maxLength != null || inputProps?.min != null || inputProps?.max != null || inputProps?.type != null && inputProps?.type !== "text" && inputProps?.type !== "password" || inputProps?.pattern != null;
const computeValidationState = (inputValidity, isEmptyValue) => {
if (inputValidity.valid && isEmptyValue) {
return "standBy";
}
return inputValidity.valid ? "valid" : "invalid";
};
const computeValidationMessage = (inputValidity, errorMessages) => {
if (inputValidity.valid) {
return "";
}
if (inputValidity.valueMissing) {
return errorMessages.requiredError;
}
if (inputValidity.tooLong) {
return errorMessages.maxCharError;
}
if (inputValidity.tooShort) {
return errorMessages.minCharError;
}
if (inputValidity.typeMismatch) {
return errorMessages.typeMismatchError;
}
return errorMessages.error;
};
const validateInput = (input, required, minCharQuantity, maxCharQuantity, validationType, validation) => {
const inputValidity = {
valid: input?.validity?.valid ?? true,
badInput: input?.validity?.badInput,
customError: input?.validity?.customError,
patternMismatch: input?.validity?.patternMismatch,
rangeOverflow: input?.validity?.rangeOverflow,
rangeUnderflow: input?.validity?.rangeUnderflow,
stepMismatch: input?.validity?.stepMismatch,
tooLong: input?.validity?.tooLong,
tooShort: input?.validity?.tooShort,
typeMismatch: input?.validity?.typeMismatch,
valueMissing: input?.validity?.valueMissing
};
const value = input?.value;
if (!value) {
if (required) {
inputValidity.valueMissing = true;
inputValidity.valid = false;
}
} else {
if (minCharQuantity !== null && value.length < minCharQuantity) {
inputValidity.tooShort = true;
inputValidity.valid = false;
}
if (maxCharQuantity !== null && value.length > maxCharQuantity) {
inputValidity.tooLong = true;
inputValidity.valid = false;
}
switch (validationType) {
case "number":
if (!isNumeric(value)) {
inputValidity.typeMismatch = true;
inputValidity.valid = false;
}
break;
case "email":
if (!isEmail(value)) {
inputValidity.typeMismatch = true;
inputValidity.valid = false;
}
break;
}
if (validation != null && !validation(value)) {
inputValidity.customError = true;
inputValidity.valid = false;
}
}
return inputValidity;
};
const DEFAULT_ERROR_MESSAGES = {
error: "Invalid value",
requiredError: "The value is required",
minCharError: "The value is too short",
maxCharError: "The value is too long",
typeMismatchError: "Invalid value"
};
export {
DEFAULT_ERROR_MESSAGES,
computeValidationMessage,
computeValidationState,
computeValidationType,
hasBuiltInValidations,
validateInput
};