import AddressIcon from "@icons/ContactFormIcon/AddressIcon"; import EmailIcon from "@icons/ContactFormIcon/EmailIcon"; import NameIcon from "@icons/ContactFormIcon/NameIcon"; import PhoneIcon from "@icons/ContactFormIcon/PhoneIcon"; import TextIcon from "@icons/ContactFormIcon/TextIcon"; import { Box, Button, InputAdornment, Link, TextField as MuiTextField, TextFieldProps, Typography, useTheme } from "@mui/material"; import CustomCheckbox from "@ui_kit/CustomCheckbox"; import { FC, useRef, useState } from "react"; import { sendFC } from "@api/quizRelase"; import { NameplateLogo } from "@icons/NameplateLogo"; import { QuizQuestionResult } from "@model/questionTypes/result"; import { AnyTypedQuizQuestion } from "@model/questionTypes/shared"; import { quizThemes } from "@utils/themes/Publication/themePublication"; import { enqueueSnackbar } from "notistack"; import { useRootContainerSize } from "../../contexts/RootContainerWidthContext"; import { useQuizData } from "@contexts/QuizDataContext"; const TextField = MuiTextField as unknown as FC; // temporary fix ts(2590) const EMAIL_REGEXP = /^(([^<>()[\].,:\s@"]+(\.[^<>()[\].,:\s@"]+)*)|(".+"))@(([^<>()[\].,:\s@"]+\.)+[^<>()[\].,:\s@"]{2,})$/iu; type Props = { currentQuestion: AnyTypedQuizQuestion; onShowResult: () => void; }; export const ContactForm = ({ currentQuestion, onShowResult }: Props) => { const theme = useTheme(); const { settings, questions, quizId } = useQuizData(); const [ready, setReady] = useState(false); const [name, setName] = useState(""); const [email, setEmail] = useState(""); const [phone, setPhone] = useState(""); const [text, setText] = useState(""); const [adress, setAdress] = useState(""); const fireOnce = useRef(true); const [fire, setFire] = useState(false); const isMobile = useRootContainerSize() < 850; const resultQuestion = currentQuestion.type === "result" ? currentQuestion : questions.find((question): question is QuizQuestionResult => { if (settings?.cfg.haveRoot) { return ( question.type === "result" && question.content.rule.parentId === currentQuestion.content.id ); } else { return ( question.type === "result" && question.content.rule.parentId === "line" ); } }); if (!resultQuestion) throw new Error("Result question not found"); const inputHC = async () => { const FC = settings.cfg.formContact.fields || settings.cfg.formContact; const body = {} as any; if (name.length > 0) body.name = name; if (email.length > 0) body.email = email; if (phone.length > 0) body.phone = phone; if (adress.length > 0) body.address = adress; if (text.length > 0) body.customs = { [FC.text.text || "Фамилия"]: text }; if (Object.keys(body).length > 0) { try { await sendFC({ questionId: currentQuestion.id, body: body, qid: quizId, }); const sessions = JSON.parse(localStorage.getItem("sessions") || "{}"); localStorage.setItem( "sessions", JSON.stringify({ ...sessions, [quizId]: new Date().getTime() }) ); } catch (e) { enqueueSnackbar("ответ не был засчитан"); } } }; const FCcopy: any = settings.cfg.formContact.fields || settings.cfg.formContact; const filteredFC: any = {}; for (const i in FCcopy) { const field = FCcopy[i]; if (field.used) { filteredFC[i] = field; } } const isWide = Object.keys(filteredFC).length > 2; async function handleShowResultsClick() { //@ts-ignore const FC: any = settings.cfg.formContact.fields || settings.cfg.formContact; if (FC["email"].used !== EMAIL_REGEXP.test(email)) { return enqueueSnackbar("введена некорректная почта"); } if (fireOnce.current) { if ( name.length === 0 && email.length === 0 && phone.length === 0 && text.length === 0 && adress.length === 0 ) return enqueueSnackbar("Пожалуйста, заполните поля"); //почта валидна, хоть одно поле заполнено setFire(true); try { await inputHC(); fireOnce.current = false; const sessions: any = JSON.parse( localStorage.getItem("sessions") || "{}" ); sessions[quizId] = Date.now(); localStorage.setItem( "sessions", JSON.stringify(sessions) ); enqueueSnackbar("Данные успешно отправлены"); } catch (e) { enqueueSnackbar("повторите попытку позже"); } onShowResult(); } setFire(false); } return ( {settings.cfg.formContact.title || "Заполните форму, чтобы получить результаты теста"} {settings.cfg.formContact.desc && ( {settings.cfg.formContact.desc} )} { // resultQuestion && // settings.cfg.resultInfo.when === "after" && } { setReady(target.checked); }} checked={ready} colorIcon={theme.palette.primary.main} /> С  Положением об обработке персональных данных{" "}  и  {" "} Политикой конфиденциальности{" "}  ознакомлен Сделано на PenaQuiz ); }; const Inputs = ({ name, setName, email, setEmail, phone, setPhone, text, setText, adress, setAdress, }: any) => { const { settings } = useQuizData(); // @ts-ignore const FC = settings.cfg.formContact.fields || settings.cfg.formContact; if (!FC) return null; //@ts-ignore const Name = ( setName(target.value)} id={name} title={FC["name"].innerText || "Введите имя"} desc={FC["name"].text || "имя"} Icon={NameIcon} /> ); //@ts-ignore const Email = ( setEmail(target.value)} id={email} title={FC["email"].innerText || "Введите Email"} desc={FC["email"].text || "Email"} Icon={EmailIcon} /> ); const Phone = ( setPhone(target.value)} id={phone} title={FC["phone"].innerText || "Введите номер телефона"} desc={FC["phone"].text || "номер телефона"} Icon={PhoneIcon} /> ); //@ts-ignore const Text = ( setText(target.value)} id={text} title={FC["text"].text || "Введите фамилию"} desc={FC["text"].innerText || "фамилию"} Icon={TextIcon} /> ); //@ts-ignore const Adress = ( setAdress(target.value)} id={adress} title={FC["address"].innerText || "Введите адрес"} desc={FC["address"].text || "адрес"} Icon={AddressIcon} /> ); //@ts-ignore if (Object.values(FC).some((data) => data.used)) { return ( <> {FC["name"].used ? Name : <>} {FC["email"].used ? Email : <>} {FC["phone"].used ? Phone : <>} {FC["text"].used ? Text : <>} {FC["address"].used ? Adress : <>} ); } else { return ( <> {Name} {Email} {Phone} ); } }; const CustomInput = ({ title, desc, Icon, onChange }: any) => { const theme = useTheme(); const isMobile = useRootContainerSize() < 600; //@ts-ignore return ( {title} ), }} /> ); };