fix fields
This commit is contained in:
parent
f13df84fec
commit
9e301e694f
@ -45,6 +45,8 @@ export const ContactForm = ({ currentQuestion, onShowResult }: Props) => {
|
|||||||
const [text, setText] = useState("");
|
const [text, setText] = useState("");
|
||||||
const [adress, setAdress] = useState("");
|
const [adress, setAdress] = useState("");
|
||||||
const [screenHeight, setScreenHeight] = useState<number>(window.innerHeight);
|
const [screenHeight, setScreenHeight] = useState<number>(window.innerHeight);
|
||||||
|
const [emailError, setEmailError] = useState("");
|
||||||
|
const [phoneError, setPhoneError] = useState("");
|
||||||
|
|
||||||
const fireOnce = useRef(true);
|
const fireOnce = useRef(true);
|
||||||
const [fire, setFire] = useState(false);
|
const [fire, setFire] = useState(false);
|
||||||
@ -200,12 +202,66 @@ export const ContactForm = ({ currentQuestion, onShowResult }: Props) => {
|
|||||||
const minDigits = isRussianNumber ? 11 : 10;
|
const minDigits = isRussianNumber ? 11 : 10;
|
||||||
const isPhoneValid = phone.trim().length === 0 || digitsOnly.length >= minDigits;
|
const isPhoneValid = phone.trim().length === 0 || digitsOnly.length >= minDigits;
|
||||||
|
|
||||||
// Проверяем валидность email - не должен быть пустым
|
// Проверяем валидность email - должен быть заполнен и соответствовать формату
|
||||||
const isEmailValid = email.trim().length === 0;
|
const validateEmail = (emailValue: string) => {
|
||||||
|
if (emailValue.trim().length === 0) return false;
|
||||||
|
|
||||||
|
// Проверяем наличие @ и .
|
||||||
|
const atIndex = emailValue.indexOf("@");
|
||||||
|
const dotIndex = emailValue.lastIndexOf(".");
|
||||||
|
|
||||||
|
if (atIndex === -1 || dotIndex === -1) return false;
|
||||||
|
|
||||||
|
// Точка должна быть после @
|
||||||
|
if (dotIndex <= atIndex) return false;
|
||||||
|
|
||||||
|
// Между @ и . должно быть минимум 3 символа
|
||||||
|
const domainPart = emailValue.substring(atIndex + 1, dotIndex);
|
||||||
|
if (domainPart.length < 3) return false;
|
||||||
|
|
||||||
|
// После точки должно быть минимум 2 символа
|
||||||
|
const tldPart = emailValue.substring(dotIndex + 1);
|
||||||
|
if (tldPart.length < 2) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
const isEmailValid = validateEmail(email);
|
||||||
|
|
||||||
// Обработчик изменения телефона
|
// Обработчик изменения телефона
|
||||||
const handlePhoneChange = (newPhone: string) => {
|
const handlePhoneChange = (newPhone: string) => {
|
||||||
setPhone(newPhone);
|
setPhone(newPhone);
|
||||||
|
// Очищаем ошибку если поле стало пустым
|
||||||
|
if (newPhone.trim().length === 0) {
|
||||||
|
setPhoneError("");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Обработчик изменения email
|
||||||
|
const handleEmailChange = (newEmail: string) => {
|
||||||
|
setEmail(newEmail);
|
||||||
|
// Очищаем ошибку если поле стало пустым
|
||||||
|
if (newEmail.trim().length === 0) {
|
||||||
|
setEmailError("");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Обработчик потери фокуса для email
|
||||||
|
const handleEmailBlur = () => {
|
||||||
|
if (email.trim().length > 0 && !validateEmail(email)) {
|
||||||
|
setEmailError(t("Please enter a valid email"));
|
||||||
|
} else {
|
||||||
|
setEmailError("");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Обработчик потери фокуса для телефона
|
||||||
|
const handlePhoneBlur = () => {
|
||||||
|
if (phone.trim().length > 0 && !isPhoneValid) {
|
||||||
|
setPhoneError(t("Please enter a valid phone number"));
|
||||||
|
} else {
|
||||||
|
setPhoneError("");
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -281,13 +337,17 @@ export const ContactForm = ({ currentQuestion, onShowResult }: Props) => {
|
|||||||
name={name}
|
name={name}
|
||||||
setName={setName}
|
setName={setName}
|
||||||
email={email}
|
email={email}
|
||||||
setEmail={setEmail}
|
setEmail={handleEmailChange}
|
||||||
phone={phone}
|
phone={phone}
|
||||||
setPhone={setPhone}
|
setPhone={handlePhoneChange}
|
||||||
text={text}
|
text={text}
|
||||||
setText={setText}
|
setText={setText}
|
||||||
adress={adress}
|
adress={adress}
|
||||||
setAdress={setAdress}
|
setAdress={setAdress}
|
||||||
|
emailError={emailError}
|
||||||
|
phoneError={phoneError}
|
||||||
|
onEmailBlur={handleEmailBlur}
|
||||||
|
onPhoneBlur={handlePhoneBlur}
|
||||||
crutch={{
|
crutch={{
|
||||||
disableEmail: isDisableEmail,
|
disableEmail: isDisableEmail,
|
||||||
}}
|
}}
|
||||||
|
@ -13,13 +13,17 @@ type InputsProps = {
|
|||||||
name: string;
|
name: string;
|
||||||
setName: Dispatch<SetStateAction<string>>;
|
setName: Dispatch<SetStateAction<string>>;
|
||||||
email: string;
|
email: string;
|
||||||
setEmail: Dispatch<SetStateAction<string>>;
|
setEmail: (email: string) => void;
|
||||||
phone: string;
|
phone: string;
|
||||||
setPhone: Dispatch<SetStateAction<string>>;
|
setPhone: (phone: string) => void;
|
||||||
text: string;
|
text: string;
|
||||||
setText: Dispatch<SetStateAction<string>>;
|
setText: Dispatch<SetStateAction<string>>;
|
||||||
adress: string;
|
adress: string;
|
||||||
setAdress: Dispatch<SetStateAction<string>>;
|
setAdress: Dispatch<SetStateAction<string>>;
|
||||||
|
emailError?: string;
|
||||||
|
phoneError?: string;
|
||||||
|
onEmailBlur?: () => void;
|
||||||
|
onPhoneBlur?: () => void;
|
||||||
crutch: {
|
crutch: {
|
||||||
disableEmail: boolean;
|
disableEmail: boolean;
|
||||||
};
|
};
|
||||||
@ -39,6 +43,10 @@ export const Inputs = ({
|
|||||||
setText,
|
setText,
|
||||||
adress,
|
adress,
|
||||||
setAdress,
|
setAdress,
|
||||||
|
emailError,
|
||||||
|
phoneError,
|
||||||
|
onEmailBlur,
|
||||||
|
onPhoneBlur,
|
||||||
crutch,
|
crutch,
|
||||||
}: InputsProps) => {
|
}: InputsProps) => {
|
||||||
const { settings } = useQuizStore();
|
const { settings } = useQuizStore();
|
||||||
@ -64,11 +72,13 @@ export const Inputs = ({
|
|||||||
onChange={({ target }) => {
|
onChange={({ target }) => {
|
||||||
setEmail(target.value.replaceAll(/\s/g, ""));
|
setEmail(target.value.replaceAll(/\s/g, ""));
|
||||||
}}
|
}}
|
||||||
|
onBlur={onEmailBlur}
|
||||||
id={email}
|
id={email}
|
||||||
title={FC["email"].innerText || `${t("Enter")} Email`}
|
title={FC["email"].innerText || `${t("Enter")} Email`}
|
||||||
desc={FC["email"].text || "Email"}
|
desc={FC["email"].text || "Email"}
|
||||||
Icon={EmailIcon}
|
Icon={EmailIcon}
|
||||||
type="email"
|
type="email"
|
||||||
|
error={emailError}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
const Phone = (
|
const Phone = (
|
||||||
@ -77,12 +87,14 @@ export const Inputs = ({
|
|||||||
onChangePhone={(phone: string) => {
|
onChangePhone={(phone: string) => {
|
||||||
setPhone(phone);
|
setPhone(phone);
|
||||||
}}
|
}}
|
||||||
|
onBlur={onPhoneBlur}
|
||||||
value={phone}
|
value={phone}
|
||||||
id={phone}
|
id={phone}
|
||||||
title={FC["phone"].innerText || `${t("Enter")} ${t("Phone number").toLowerCase()}`}
|
title={FC["phone"].innerText || `${t("Enter")} ${t("Phone number").toLowerCase()}`}
|
||||||
desc={FC["phone"].text || t("Phone number")}
|
desc={FC["phone"].text || t("Phone number")}
|
||||||
Icon={PhoneIcon}
|
Icon={PhoneIcon}
|
||||||
isPhone={true}
|
isPhone={true}
|
||||||
|
error={phoneError}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
const Text = (
|
const Text = (
|
||||||
|
@ -56,5 +56,8 @@
|
|||||||
"Step": "Шаг",
|
"Step": "Шаг",
|
||||||
"questions are not ready yet": "Вопросы для аудитории ещё не созданы. Пожалуйста, подождите",
|
"questions are not ready yet": "Вопросы для аудитории ещё не созданы. Пожалуйста, подождите",
|
||||||
"Add your image": "Добавьте своё изображение",
|
"Add your image": "Добавьте своё изображение",
|
||||||
"select emoji": "выберите смайлик"
|
"select emoji": "выберите смайлик",
|
||||||
|
"Please complete the phone number": "Пожалуйста, завершите номер телефона",
|
||||||
|
"Please enter a valid email": "Пожалуйста, введите корректную почту",
|
||||||
|
"Please enter a valid phone number": "Пожалуйста, введите корректный номер телефона"
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user