frontAnswerer/lib/components/ViewPublicationPage/ViewPublicationPage.tsx

152 lines
4.5 KiB
TypeScript
Raw Normal View History

import {sendAnswer} from "@api/quizRelase";
import {useQuizData} from "@contexts/QuizDataContext";
import {ThemeProvider, Typography} from "@mui/material";
import {useQuizViewStore} from "@stores/quizView";
import {useQuestionFlowControl} from "@utils/hooks/useQuestionFlowControl";
import {notReachable} from "@utils/notReachable";
import {quizThemes} from "@utils/themes/Publication/themePublication";
import {enqueueSnackbar} from "notistack";
import {ReactElement, useEffect} from "react";
import {Question} from "./Question";
import {ResultForm} from "./ResultForm";
import {StartPageViewPublication} from "./StartPageViewPublication";
2024-03-26 00:06:54 +00:00
import NextButton from "./tools/NextButton";
2024-04-02 13:09:13 +00:00
import PrevButton from "./tools/PrevButton";
2024-04-11 14:11:43 +00:00
import QuestionSelect from "./QuestionSelect";
import {useYandexMetrics} from "@/utils/hooks/useYandexMetrics";
import {useVKMetrics} from "@/utils/hooks/useVKMetrics";
import {
ContactForm
} from "@/components/ViewPublicationPage/ContactForm/ContactForm.tsx";
2023-12-16 14:55:56 +00:00
export default function ViewPublicationPage() {
2024-04-22 08:55:19 +00:00
const {
settings,
recentlyCompleted,
quizId,
preview,
changeFaviconAndTitle,
} = useQuizData();
const answers = useQuizViewStore((state) => state.answers);
let currentQuizStep = useQuizViewStore((state) => state.currentQuizStep);
const {
currentQuestion,
currentQuestionStepNumber,
isNextButtonEnabled,
isPreviousButtonEnabled,
moveToPrevQuestion,
moveToNextQuestion,
showResultAfterContactForm,
setQuestion,
} = useQuestionFlowControl();
useYandexMetrics(settings?.cfg?.yandexMetricNumber);
2024-04-22 14:13:43 +00:00
useVKMetrics(settings?.cfg?.vkMetricNumber);
2024-04-22 08:55:19 +00:00
const isAnswer = answers.some(
(ans) => ans.questionId === currentQuestion?.id
);
2024-04-22 08:55:19 +00:00
useEffect(
function setFaviconAndTitle() {
if (!changeFaviconAndTitle) return;
2024-04-18 15:23:27 +00:00
2024-04-22 08:55:19 +00:00
const link = document.querySelector('link[rel="icon"]');
if (link && settings.cfg.startpage.favIcon) {
link.setAttribute("href", settings.cfg.startpage.favIcon);
}
2024-02-02 14:35:02 +00:00
2024-04-22 08:55:19 +00:00
document.title = settings.name;
},
[changeFaviconAndTitle, settings.cfg.startpage.favIcon, settings.name]
);
2024-04-22 08:55:19 +00:00
if (recentlyCompleted) throw new Error("Quiz already completed");
if (currentQuizStep === "startpage" && settings.cfg.noStartPage)
currentQuizStep = "question";
2024-04-22 08:55:19 +00:00
if (!currentQuestion)
return (
<ThemeProvider
theme={quizThemes[settings.cfg.theme || "StandardTheme"].theme}
>
<Typography textAlign={"center"} mt="50px">
Вопрос не выбран
</Typography>
</ThemeProvider>
);
2024-04-22 08:55:19 +00:00
let quizStepElement: ReactElement;
switch (currentQuizStep) {
case "startpage": {
quizStepElement = <StartPageViewPublication />;
break;
}
case "question": {
if (currentQuestion.type === "result") {
quizStepElement = <ResultForm resultQuestion={currentQuestion} />;
break;
}
2024-04-22 08:55:19 +00:00
quizStepElement = (
<Question
currentQuestion={currentQuestion}
currentQuestionStepNumber={currentQuestionStepNumber}
prevButton={
<PrevButton
isPreviousButtonEnabled={isPreviousButtonEnabled}
moveToPrevQuestion={moveToPrevQuestion}
/>
}
nextButton={
<NextButton
isNextButtonEnabled={isNextButtonEnabled}
moveToNextQuestion={async () => {
if (!isAnswer) {
try {
await sendAnswer({
questionId: currentQuestion.id,
body: "",
qid: quizId,
preview,
});
} catch (e) {
enqueueSnackbar("ответ не был засчитан");
}
}
moveToNextQuestion();
}}
/>
}
questionSelect={
<QuestionSelect
selectedQuestion={currentQuestion}
setQuestion={setQuestion}
/>
}
/>
);
break;
}
2024-04-22 08:55:19 +00:00
case "contactform": {
quizStepElement = (
<ContactForm
currentQuestion={currentQuestion}
onShowResult={showResultAfterContactForm}
/>
);
break;
}
default:
notReachable(currentQuizStep);
}
2024-04-22 08:55:19 +00:00
return (
<ThemeProvider
theme={quizThemes[settings.cfg.theme || "StandardTheme"].theme}
>
{quizStepElement}
</ThemeProvider>
);
2024-02-28 14:10:50 +00:00
}