frontPanel/src/pages/ViewPublicationPage/ContactForm.tsx

194 lines
5.6 KiB
TypeScript
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 { Box, Typography, Button, Paper, TextField, Link, InputAdornment } from "@mui/material";
import NameIcon from "@icons/ContactFormIcon/NameIcon";
import EmailIcon from "@icons/ContactFormIcon/EmailIcon";
import PhoneIcon from "@icons/ContactFormIcon/PhoneIcon";
import TextIcon from "@icons/ContactFormIcon/TextIcon";
import AddressIcon from "@icons/ContactFormIcon/AddressIcon";
import { useCurrentQuiz } from "@root/quizes/hooks";
import { NameplateLogo } from "@icons/NameplateLogo";
import CustomCheckbox from "@ui_kit/CustomCheckbox";
import { useState } from "react";
import { useQuestionsStore } from "@root/questions/store";
import type { AnyTypedQuizQuestion } from "../../model/questionTypes/shared";
type ContactFormProps = {
currentQuestion: AnyTypedQuizQuestion;
showResultForm: boolean;
setShowContactForm: (show: boolean) => void;
setShowResultForm: (show: boolean) => void;
};
const icons = [
{ type: "name", icon: NameIcon, defaultText: "Введите имя", defaultTitle: "имя" },
{ type: "email", icon: EmailIcon, defaultText: "Введите Email", defaultTitle: "Email" },
{ type: "phone", icon: PhoneIcon, defaultText: "Введите номер телефона", defaultTitle: "номер телефона" },
{ type: "text", icon: TextIcon, defaultText: "Введите фамилию", defaultTitle: "фамилию" },
{ type: "address", icon: AddressIcon, defaultText: "Введите адрес", defaultTitle: "адрес" },
]
export const ContactForm = ({
currentQuestion,
showResultForm,
setShowContactForm,
setShowResultForm,
}: ContactFormProps) => {
const quiz = useCurrentQuiz();
const { questions } = useQuestionsStore();
const [ready, setReady] = useState(false)
const followNextForm = () => {
setShowContactForm(false);
setShowResultForm(true);
};
const resultQuestion = questions.find(
(question) =>
question.type === "result" &&
question.content.rule.parentId === currentQuestion.content.id
);
return (
<Box
sx={{
display: "flex",
alignItems: "center",
justifyContent: "center",
height: "100vh"
}}
>
<Box
sx={{
width: "800px"
}}
>
<Box>
<Typography
sx={{
textAlign: "center",
m: "20px 0",
fontSize: "28px"
}}
>
{quiz?.config.formContact.title || "Заполните форму, чтобы получить результаты теста"}
</Typography>
{
quiz?.config.formContact.desc &&
<Typography
sx={{
textAlign: "center",
m: "20px 0",
fontSize: "18px"
}}
>
{quiz?.config.formContact.desc}
</Typography>
}
</Box>
<Paper
sx={{
display: "flex",
alignItems: "center",
justifyContent: "center",
flexDirection: "column",
p: "30px"
}}>
<Box
sx={{
display: "flex",
flexDirection: "column",
my: "20px"
}}
>
<Inputs />
</Box>
{
// resultQuestion &&
// quiz?.config.resultInfo.when === "after" &&
(
<Button
disabled={!ready}
variant="contained" onClick={() => {
if (quiz?.config.resultInfo.when === "after") followNextForm()
}}>
Получить результаты
</Button>
)}
<Box
sx={{
display: "flex",
mt: "20px",
width: "450px",
}}
>
<CustomCheckbox label="" handleChange={({ target }) => { setReady(target.checked) }} checked={ready} />
<Typography>
С
<Link> Положением об обработке персональных данных </Link>
и
<Link> Политикой конфиденциальности </Link>
ознакомлен
</Typography>
</Box>
<Box
sx={{
display: "flex",
alignItems: "center",
mt: "20px"
}}
>
<NameplateLogo style={{ fontSize: "34px" }} />
<Typography sx={{ fontSize: "20px", color: "#4D4D4D", whiteSpace: "nowrap" }}>Сделано на PenaQuiz</Typography>
</Box>
</Paper>
</Box >
</Box >
);
};
const Inputs = () => {
const quiz = useCurrentQuiz();
let someUsed = []
const Icons = icons.map((data) => {
const FC = quiz?.config.formContact[data.type]
if (FC.used) someUsed.push(<CustomInput title={FC.innerText || data.defaultText} desc={FC.text || data.defaultTitle} Icon={data.icon} />)
return <CustomInput title={FC.innerText || data.defaultText} desc={FC.text || data.defaultTitle} Icon={data.icon} />
})
if (someUsed.length) {
return <>{someUsed}</>
} else {
return <>
{Icons[0]}
{Icons[1]}
{Icons[2]}
</>
}
}
const CustomInput = ({ title, desc, Icon }: any) => {
return <Box m="15px 0">
<Typography mb="7px">{title}</Typography>
<TextField
sx={{
width: "350px",
}}
placeholder={desc}
InputProps={{
startAdornment: <InputAdornment position="start"><Icon color="gray" /></InputAdornment>,
}}
/>
</Box>
}