guild_front/src/hooks/useFormValidation.js
Victor Batischev 882bdfcc24 small fixes
2024-03-18 18:47:31 +03:00

129 lines
3.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { useState } from "react";
import { apiRequest } from "@api/request";
export const useFormValidation = (
apiEndpoint,
fields,
showNotificationError,
showNotificationTrue,
isPartner,
setLoader,
closeModal
) => {
// Состояние формы, содержащее значения полей
const [formData, setFormData] = useState(fields);
// Состояние ошибок валидации
const [validationErrors, setValidationErrors] = useState({});
// Функция для обработки изменений в полях ввода
const handleChange = (e) => {
const { id, value } = e.target;
setFormData((prevData) => ({ ...prevData, [id]: value }));
};
// Функция для валидации формы
const validateForm = () => {
const errors = {};
if (formData.username != undefined) {
if (formData.username.trim() === "") {
errors.username = "Имя обязательно к заполнению";
}
}
if (formData.email != undefined) {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (formData.email.trim() === "") {
errors.email = "E-mail обязателен к заполнению";
} else if (!emailRegex.test(formData.email)) {
errors.email = "Неверный адрес электронной почты";
}
}
if (formData.tg != undefined) {
if (formData.tg.trim() === "") {
errors.tg = "Telegram обязателен к заполнению";
}
}
if (formData.password != undefined) {
if (formData.password.trim() === "") {
errors.password = "Пароль обязателен к заполнению";
} else if (formData.password.length < 8) {
errors.password = "Пароль должен содержать более 8 символов";
}
}
if (formData.secondPassword != undefined) {
if (formData.secondPassword.trim() === "") {
errors.secondPassword = "Повторите пароль";
} else if (formData.secondPassword !== formData.password) {
errors.secondPassword = "Пароли должны совпадать";
}
}
setValidationErrors(errors);
// Возвращаем true, если ошибок нет, иначе - false
return Object.keys(errors).length === 0;
};
// Функция отчистки формы
const handleClearForm = () => {
const clearedFormData = Object.fromEntries(
Object.keys(formData).map((key) => [key, ""])
);
setFormData(clearedFormData);
const clearedValidationErrors = Object.fromEntries(
Object.keys(validationErrors).map((key) => [key, ""])
);
setValidationErrors(clearedValidationErrors);
};
// Функция для обработки отправки формы
const handleSubmit = async (e) => {
e.preventDefault();
// Проверка валидации формы
if (validateForm()) {
setLoader(true);
let newformData = { ...formData, is_partner: isPartner ? 1 : 0 };
delete newformData.secondPassword;
try {
apiRequest(apiEndpoint, {
method: "POST",
data: newformData
}).then((data) => {
setLoader(false);
if ("errors" in data) {
return showNotificationError(
"Аккаунт с таким логином или email уже существует"
);
}
if (!data.id) {
return showNotificationError("Ошибка");
}
handleClearForm();
showNotificationTrue();
closeModal();
});
} catch (error) {
console.error("Error submitting form:", error);
}
return true;
} else {
return false;
}
};
return {
formData,
validationErrors,
handleChange,
handleSubmit,
handleClearForm
};
};