Files
ax3Client/src/Utils/Form.js
Kenneth Jannette 771687a108 more
2024-02-03 16:47:36 -06:00

109 lines
2.6 KiB
JavaScript

import { objectMap } from "./Object";
import {
isValidDateString,
isValidEmailString,
isValidTelephoneString,
isValidZipCodeString,
} from "./String";
export const getFormDataDefaults = (fields, defaults) =>
objectMap(
(field, key) => ({
value:
(typeof defaults === "undefined" ? field.default : defaults[key]) || "",
error: false,
message: "",
}),
fields
);
export const getValidatedFormData = (data, fields) =>
objectMap((state, key) => {
const field = fields[key];
const value = state.value.trim();
let error = false;
let message = "";
if (!error && field.required && value === "") {
error = true;
message = "This field is required";
}
if (
!error &&
typeof field.minLength !== "undefined" &&
((!field.required && value === "") || value.length < field.minLength)
) {
error = true;
message = `Must be at least ${field.minLength} characters`;
}
if (
!error &&
field.type === "date" &&
((!field.required && value === "") || !isValidDateString(value))
) {
error = true;
message = "Date format must be MM/DD/YYYY";
}
if (
!error &&
field.type === "email" &&
((!field.required && value === "") || !isValidEmailString(value))
) {
error = true;
message = "Invalid email format";
}
if (
!error &&
field.type === "phone" &&
((!field.required && value === "") || !isValidTelephoneString(value))
) {
error = true;
message = "Telephone format must be (###) ###-####";
}
if (
!error &&
field.type === "zip" &&
((!field.required && value === "") || !isValidZipCodeString(value))
) {
error = true;
message = "Zip Code must be 5 Digit";
}
if (
!error &&
field.type === "confirmPassword" &&
data[field.compareTo].value !== value
) {
error = true;
message = "Passwords do not match";
}
return {
...state,
value,
error,
message,
};
}, data);
export const handleFormDataChange = (e, name, data, fields) => {
if (!fields) {
return;
}
const value =
(typeof e?.target?.value === "undefined" ? e.value : e.target.value) || "";
const field = fields[name];
if (
typeof field.maxLength === "undefined" ||
value.length <= field.maxLength
) {
return { ...data, [name]: { ...data[name], value } };
}
return null;
};
export const isFormDataHasErrors = (data) => {
return Object.values(data).reduce(
(hasErrors, { error }) => hasErrors || error,
false
);
};