2024-02-08 13:42:31 +00:00
|
|
|
|
import { Button, ThemeProvider } from "@mui/material";
|
2024-02-12 10:58:51 +00:00
|
|
|
|
import { useQuizViewStore } from "@stores/quizView";
|
2024-02-08 13:42:31 +00:00
|
|
|
|
import { useQuestionFlowControl } from "@utils/hooks/useQuestionFlowControl";
|
2024-02-02 14:35:02 +00:00
|
|
|
|
import { useQuizData } from "@utils/hooks/useQuizData";
|
2024-02-08 13:42:31 +00:00
|
|
|
|
import { notReachable } from "@utils/notReachable";
|
2024-01-30 16:49:33 +00:00
|
|
|
|
import { quizThemes } from "@utils/themes/Publication/themePublication";
|
2024-02-08 13:42:31 +00:00
|
|
|
|
import { ReactElement, useEffect } from "react";
|
|
|
|
|
import { useRootContainerSize } from "../../contexts/RootContainerWidthContext";
|
|
|
|
|
import { ContactForm } from "./ContactForm";
|
2023-12-16 14:55:56 +00:00
|
|
|
|
import { Question } from "./Question";
|
2024-02-08 13:42:31 +00:00
|
|
|
|
import { ResultForm } from "./ResultForm";
|
2024-01-30 16:49:33 +00:00
|
|
|
|
import { StartPageViewPublication } from "./StartPageViewPublication";
|
2023-12-16 14:55:56 +00:00
|
|
|
|
|
2023-12-17 22:20:52 +00:00
|
|
|
|
|
2024-02-08 13:42:31 +00:00
|
|
|
|
export default function ViewPublicationPage() {
|
|
|
|
|
const { settings, recentlyCompleted } = useQuizData();
|
|
|
|
|
let currentQuizStep = useQuizViewStore(state => state.currentQuizStep);
|
|
|
|
|
const isMobileMini = useRootContainerSize() < 382;
|
|
|
|
|
const {
|
|
|
|
|
currentQuestion,
|
|
|
|
|
currentQuestionStepNumber,
|
2024-02-10 10:46:13 +00:00
|
|
|
|
isNextButtonEnabled,
|
|
|
|
|
isPreviousButtonEnabled,
|
2024-02-08 13:42:31 +00:00
|
|
|
|
moveToPrevQuestion,
|
|
|
|
|
moveToNextQuestion,
|
|
|
|
|
showResultAfterContactForm,
|
|
|
|
|
} = useQuestionFlowControl();
|
2024-01-30 16:49:33 +00:00
|
|
|
|
|
2024-02-08 13:42:31 +00:00
|
|
|
|
useEffect(function setFaviconAndTitle() {
|
2024-01-30 16:49:33 +00:00
|
|
|
|
const link = document.querySelector('link[rel="icon"]');
|
|
|
|
|
if (link && settings.cfg.startpage.favIcon) {
|
2024-02-08 13:42:31 +00:00
|
|
|
|
link.setAttribute("href", settings.cfg.startpage.favIcon);
|
2023-12-17 18:15:59 +00:00
|
|
|
|
}
|
2024-02-02 14:35:02 +00:00
|
|
|
|
|
2024-01-31 12:57:07 +00:00
|
|
|
|
document.title = settings.name;
|
2024-01-30 16:49:33 +00:00
|
|
|
|
}, [settings]);
|
2024-01-15 17:41:15 +00:00
|
|
|
|
|
2024-02-08 13:42:31 +00:00
|
|
|
|
if (recentlyCompleted) throw new Error("Quiz already completed");
|
|
|
|
|
if (currentQuizStep === "startpage" && settings.cfg.noStartPage) currentQuizStep = "question";
|
2024-02-10 10:46:13 +00:00
|
|
|
|
|
|
|
|
|
let quizStepElement: ReactElement;
|
2024-02-08 13:42:31 +00:00
|
|
|
|
switch (currentQuizStep) {
|
|
|
|
|
case "startpage": {
|
|
|
|
|
quizStepElement = <StartPageViewPublication />;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case "question": {
|
|
|
|
|
if (currentQuestion.type === "result") {
|
|
|
|
|
quizStepElement = <ResultForm resultQuestion={currentQuestion} />;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
quizStepElement = (
|
|
|
|
|
<Question
|
|
|
|
|
currentQuestion={currentQuestion}
|
|
|
|
|
currentQuestionStepNumber={currentQuestionStepNumber}
|
|
|
|
|
prevButton={
|
|
|
|
|
<Button
|
2024-02-10 10:46:13 +00:00
|
|
|
|
disabled={!isPreviousButtonEnabled}
|
2024-02-08 13:42:31 +00:00
|
|
|
|
variant="contained"
|
|
|
|
|
sx={{ fontSize: "16px", padding: "10px 15px" }}
|
|
|
|
|
onClick={moveToPrevQuestion}
|
|
|
|
|
>
|
|
|
|
|
{isMobileMini ? "←" : "← Назад"}
|
|
|
|
|
</Button>
|
|
|
|
|
}
|
|
|
|
|
nextButton={
|
|
|
|
|
<Button
|
2024-02-10 10:46:13 +00:00
|
|
|
|
disabled={!isNextButtonEnabled}
|
2024-02-08 13:42:31 +00:00
|
|
|
|
variant="contained"
|
|
|
|
|
sx={{ fontSize: "16px", padding: "10px 15px" }}
|
|
|
|
|
onClick={moveToNextQuestion}
|
|
|
|
|
>
|
|
|
|
|
Далее →
|
|
|
|
|
</Button>
|
|
|
|
|
}
|
|
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case "contactform": {
|
|
|
|
|
quizStepElement = (
|
|
|
|
|
<ContactForm
|
|
|
|
|
currentQuestion={currentQuestion}
|
|
|
|
|
onShowResult={showResultAfterContactForm}
|
|
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
default: notReachable(currentQuizStep);
|
|
|
|
|
}
|
2024-01-30 16:49:33 +00:00
|
|
|
|
|
|
|
|
|
return (
|
2024-02-08 13:42:31 +00:00
|
|
|
|
<ThemeProvider theme={quizThemes[settings.cfg.theme || "StandardTheme"].theme}>
|
|
|
|
|
{quizStepElement}
|
2024-01-30 16:49:33 +00:00
|
|
|
|
</ThemeProvider>
|
|
|
|
|
);
|
2024-02-08 13:42:31 +00:00
|
|
|
|
}
|