import {useEffect, useRef, useState,} from "react"; import {Box, Button, Link, Typography, useTheme,} from "@mui/material"; import CustomCheckbox from "@ui_kit/CustomCheckbox.tsx"; import {DESIGN_LIST} from "@utils/designList.ts"; import {sendFC, SendFCParams} from "@api/quizRelase.ts"; import {useQuizData} from "@contexts/QuizDataContext.ts"; import {NameplateLogo} from "@icons/NameplateLogo.tsx"; import {QuizQuestionResult} from "@model/questionTypes/result.ts"; import {AnyTypedQuizQuestion} from "@model/questionTypes/shared.ts"; import {quizThemes} from "@utils/themes/Publication/themePublication.ts"; import {enqueueSnackbar} from "notistack"; import {useRootContainerSize} from "@contexts/RootContainerWidthContext.ts"; import { FormContactFieldData, FormContactFieldName, } from "@model/settingsData.ts"; import { Inputs } from "@/components/ViewPublicationPage/ContactForm/Inputs/Inputs.tsx"; import {EMAIL_REGEXP} from "@utils/emailRegexp.tsx"; type Props = { currentQuestion: AnyTypedQuizQuestion; onShowResult: () => void; }; export const ContactForm = ({ currentQuestion, onShowResult }: Props) => { const theme = useTheme(); const { settings, questions, quizId, show_badge, preview } = 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 [screenHeight, setScreenHeight] = useState(window.innerHeight); const fireOnce = useRef(true); const [fire, setFire] = useState(false); const isMobile = useRootContainerSize() < 850; const isTablet = useRootContainerSize() < 1000; useEffect(() => { function handleResize() { setScreenHeight(window.innerHeight); } window.addEventListener("resize", handleResize); return () => { window.removeEventListener("resize", handleResize); }; }, []); 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: SendFCParams["body"] = {}; 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, preview, }); const sessions = JSON.parse(localStorage.getItem("sessions") || "{}"); localStorage.setItem( "sessions", JSON.stringify({ ...sessions, [quizId]: new Date().getTime() }) ); } catch (e) { enqueueSnackbar("ответ не был засчитан"); } } }; const FCcopy: Record = settings.cfg.formContact.fields || settings.cfg.formContact; const filteredFC: Partial< Record > = {}; for (const i in FCcopy) { const field = FCcopy[i as keyof typeof FCcopy]; if (field.used) { filteredFC[i as FormContactFieldName] = field; } } async function handleShowResultsClick() { const FC = settings.cfg.formContact.fields; 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 = JSON.parse(localStorage.getItem("sessions") || "{}"); sessions[quizId] = Date.now(); localStorage.setItem("sessions", JSON.stringify(sessions)); enqueueSnackbar("Данные успешно отправлены"); } catch (e) { enqueueSnackbar("повторите попытку позже"); } if (settings.cfg.resultInfo.showResultForm === "after") { onShowResult(); } } setFire(false); } return ( 500 ? "100%" : "auto", overflow: "auto", "&::-webkit-scrollbar": { width: "0", display: "none", msOverflowStyle: "none", }, scrollbarWidth: "none", msOverflowStyle: "none", backgroundPosition: "center", backgroundSize: "cover", backgroundImage: settings.cfg.design && !isMobile ? quizThemes[settings.cfg.theme].isLight ? `url(${DESIGN_LIST[settings.cfg.theme]})` : `linear-gradient(90deg, #272626, transparent), url(${ DESIGN_LIST[settings.cfg.theme] })` : null, }} > {settings.cfg.formContact.title || "Заполните форму, чтобы получить результаты теста"} {settings.cfg.formContact.desc && ( {settings.cfg.formContact.desc} )} { setReady(target.checked); }} checked={ready} colorIcon={theme.palette.primary.main} sx={{marginRight: "0"}} /> С  Положением об обработке персональных данных{" "}  и  {" "} Политикой конфиденциальности{" "}  ознакомлен { // resultQuestion && // settings.cfg.resultInfo.when === "after" && } {show_badge && ( {/**/} {/* Сделано на PenaQuiz*/} {/**/} )} ); };