From f2821db65a362ce27aa75e6709110cdb073c1625 Mon Sep 17 00:00:00 2001 From: Gubar Nikita Date: Thu, 16 May 2024 05:31:48 +0300 Subject: [PATCH] add functional AutstaffingForm and buttonInputFile --- src/assets/icons/fileUploadIcon.svg | 3 + src/pages/Stack/Stack.jsx | 104 ++++++++++++++++++++++------ src/pages/Stack/stack.scss | 49 ++++++++----- 3 files changed, 118 insertions(+), 38 deletions(-) create mode 100644 src/assets/icons/fileUploadIcon.svg diff --git a/src/assets/icons/fileUploadIcon.svg b/src/assets/icons/fileUploadIcon.svg new file mode 100644 index 00000000..ff4b6f26 --- /dev/null +++ b/src/assets/icons/fileUploadIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/pages/Stack/Stack.jsx b/src/pages/Stack/Stack.jsx index 926159f3..6d20f6b0 100644 --- a/src/pages/Stack/Stack.jsx +++ b/src/pages/Stack/Stack.jsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useRef, useState } from "react"; import SVG from "react-inlinesvg"; import { AuthHeader } from "@components/Common/AuthHeader/AuthHeader"; @@ -6,6 +6,7 @@ import { Footer } from "@components/Common/Footer/Footer"; import arrowReviewsLeft from "assets/icons/arrows/arrowReviewsLeft.png"; import arrowReviewsRight from "assets/icons/arrows/arrowReviewsRight.png"; +import fileUploadIcon from "assets/icons/fileUploadIcon.svg"; import Ellipse from "assets/images/EllipseIntro.svg"; import backgroundOpp from "assets/images/backgroundOpportunity.png"; import cat from "assets/images/cat.png"; @@ -103,8 +104,14 @@ export const Stack = () => { const [error, setError] = useState({ name: false, companyName: false, - email: false, - phoneNumber: false, + email: { + state: false, + text: "" + }, + phoneNumber: { + state: false, + text: "" + }, requestDescription: false, agreement: false }); @@ -119,6 +126,24 @@ export const Stack = () => { agreement: false }); + // Создаем ссылку на скрытый элемент input для файла + const hiddenFileInput = useRef(null); + + // Программно нажимаем на скрытый элемент input для файла + // когда компонент Button будет нажат + const handleClick = () => { + hiddenFileInput.current.click(); + }; + + // Вызываем функцию для обработки выбранного пользователем файла + const handleChangeFile = (event) => { + const fileUploaded = event.target.files[0]; + setFormData((prevState) => ({ + ...prevState, + file: fileUploaded + })); + }; + const handleChange = (e) => { const { name, value, type, checked } = e.target; setFormData((prevState) => ({ @@ -130,17 +155,41 @@ export const Stack = () => { const handleSubmit = (e) => { e.preventDefault(); + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + const phoneRegex = /^\+?\d+$/; + const newError = { name: !formData.name.trim(), companyName: !formData.companyName.trim(), - email: !formData.email.trim(), - phoneNumber: !formData.phoneNumber.trim(), + email: { + state: !formData.email.trim() || !emailRegex.test(formData.email), + text: !formData.email.trim() + ? "поле обязательно для заполнения" + : !emailRegex.test(formData.email) + ? "e-mail не соответствует формату" + : "" + }, + phoneNumber: { + state: + !formData.phoneNumber.trim() || + !phoneRegex.test(formData.phoneNumber), + text: !formData.phoneNumber.trim() + ? "поле обязательно для заполнения" + : !phoneRegex.test(formData.phoneNumber) + ? "введите корректный номер телефона" + : "" + }, requestDescription: !formData.requestDescription.trim(), agreement: !formData.agreement }; setError(newError); - const isValid = !Object.values(newError).some((err) => err); + const isValid = Object.values(newError).every((err) => { + if (typeof err === "object") { + return !err.state; + } + return !err; + }); if (isValid) { // Данные формы валидны, можно отправлять форму console.log("Форма отправлена", formData); @@ -155,7 +204,7 @@ export const Stack = () => { }); } else { // Данные формы невалидны, показываем ошибки - console.log("Форма содержит ошибки"); + console.log("Форма содержит ошибки", newError); } }; @@ -431,6 +480,7 @@ export const Stack = () => {
{ /> {error.name && ( - Поле обязательно для заполнения + поле обязательно для заполнения )}
{ /> {error.companyName && ( - Поле обязательно для заполнения + поле обязательно для заполнения )}
- {error.email && ( - - Поле обязательно для заполнения - + {error.email.state && ( + {error.email.text} )}
- {error.phoneNumber && ( - - Поле обязательно для заполнения - + {error.phoneNumber.state && ( + {error.phoneNumber.text} )}