2024-01-30 16:49:33 +00:00
|
|
|
|
import { getData } from "@api/quizRelase";
|
|
|
|
|
import { QuizSettings } from "@model/settingsData";
|
|
|
|
|
import { Box, ThemeProvider } from "@mui/material";
|
|
|
|
|
import { setQuizData } from "@stores/quizData/actions";
|
|
|
|
|
import { useQuestionsStore } from "@stores/quizData/store";
|
|
|
|
|
import LoadingSkeleton from "@ui_kit/LoadingSkeleton";
|
|
|
|
|
import { quizThemes } from "@utils/themes/Publication/themePublication";
|
|
|
|
|
import { enqueueSnackbar } from "notistack";
|
2023-12-16 14:55:56 +00:00
|
|
|
|
import { useEffect, useState } from "react";
|
2024-01-30 16:49:33 +00:00
|
|
|
|
import useSWR from "swr";
|
|
|
|
|
import { ApologyPage } from "./ApologyPage";
|
2023-12-16 14:55:56 +00:00
|
|
|
|
import { Question } from "./Question";
|
2024-01-30 16:49:33 +00:00
|
|
|
|
import { StartPageViewPublication } from "./StartPageViewPublication";
|
2023-12-16 14:55:56 +00:00
|
|
|
|
|
2024-01-31 12:57:07 +00:00
|
|
|
|
import { parseQuizData } from "@model/api/getQuizData";
|
2023-12-29 00:58:19 +00:00
|
|
|
|
import { replaceSpacesToEmptyLines } from "./tools/replaceSpacesToEmptyLines";
|
2023-12-16 14:55:56 +00:00
|
|
|
|
|
2024-01-31 14:39:50 +00:00
|
|
|
|
type Props = {
|
|
|
|
|
quizId: string;
|
|
|
|
|
};
|
2023-12-17 22:20:52 +00:00
|
|
|
|
|
2024-01-31 14:39:50 +00:00
|
|
|
|
export const ViewPage = ({ quizId }: Props) => {
|
|
|
|
|
const { isLoading, error } = useSWR(["quizData", quizId], params => getQuizData(params[1]), {
|
2024-01-30 16:49:33 +00:00
|
|
|
|
onSuccess: setQuizData,
|
|
|
|
|
});
|
|
|
|
|
const { settings, items, recentlyСompleted } = useQuestionsStore();
|
|
|
|
|
const [visualStartPage, setVisualStartPage] = useState<boolean>();
|
|
|
|
|
|
|
|
|
|
useEffect(() => {//установка фавиконки
|
|
|
|
|
if (!settings) return;
|
|
|
|
|
|
|
|
|
|
const link = document.querySelector('link[rel="icon"]');
|
|
|
|
|
if (link && settings.cfg.startpage.favIcon) {
|
|
|
|
|
link.setAttribute("href", settings?.cfg.startpage.favIcon);
|
2023-12-17 18:15:59 +00:00
|
|
|
|
}
|
2024-01-31 12:57:07 +00:00
|
|
|
|
//установка заголовка страницы
|
|
|
|
|
document.title = settings.name;
|
2024-01-15 17:41:15 +00:00
|
|
|
|
|
2024-01-30 16:49:33 +00:00
|
|
|
|
setVisualStartPage(!settings.cfg.noStartPage);
|
|
|
|
|
}, [settings]);
|
2024-01-15 17:41:15 +00:00
|
|
|
|
|
2024-01-30 16:49:33 +00:00
|
|
|
|
const questionsCount = items.filter(({ type }) => type !== null && type !== "result").length;
|
2023-12-17 21:28:57 +00:00
|
|
|
|
|
2024-01-30 16:49:33 +00:00
|
|
|
|
if (error) {
|
|
|
|
|
console.log(error);
|
|
|
|
|
return <ApologyPage message="Что-то пошло не так" />;
|
2023-12-29 00:58:19 +00:00
|
|
|
|
}
|
2024-01-30 16:49:33 +00:00
|
|
|
|
if (isLoading || !settings) return <LoadingSkeleton />;
|
|
|
|
|
if (questionsCount === 0) return <ApologyPage message="Нет созданных вопросов" />;
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<ThemeProvider theme={quizThemes[settings.cfg.theme || "StandardTheme"]}>
|
|
|
|
|
{recentlyСompleted ? (
|
|
|
|
|
<ApologyPage message="Вы уже прошли этот опрос" />
|
|
|
|
|
) : (
|
|
|
|
|
<Box>
|
|
|
|
|
{visualStartPage ? (
|
|
|
|
|
<StartPageViewPublication setVisualStartPage={setVisualStartPage} />
|
|
|
|
|
) : (
|
|
|
|
|
<Question />
|
|
|
|
|
)}
|
|
|
|
|
</Box>
|
|
|
|
|
)}
|
|
|
|
|
</ThemeProvider>
|
|
|
|
|
);
|
|
|
|
|
};
|
2023-12-16 14:55:56 +00:00
|
|
|
|
|
2024-01-30 16:49:33 +00:00
|
|
|
|
async function getQuizData(quizId: string) {
|
|
|
|
|
const response = await getData(quizId);
|
|
|
|
|
const quizDataResponse = response.data;
|
2023-12-17 13:22:21 +00:00
|
|
|
|
|
2024-01-30 16:49:33 +00:00
|
|
|
|
if (response.error) {
|
|
|
|
|
enqueueSnackbar(response.error);
|
|
|
|
|
throw new Error(response.error);
|
|
|
|
|
}
|
|
|
|
|
if (!quizDataResponse) {
|
|
|
|
|
throw new Error("Quiz not found");
|
2023-12-29 00:58:19 +00:00
|
|
|
|
}
|
2023-12-16 14:55:56 +00:00
|
|
|
|
|
2024-01-30 16:49:33 +00:00
|
|
|
|
const quizSettings = replaceSpacesToEmptyLines(parseQuizData(quizDataResponse, quizId));
|
2023-12-17 13:22:21 +00:00
|
|
|
|
|
2024-01-30 16:49:33 +00:00
|
|
|
|
return JSON.parse(JSON.stringify({ data: quizSettings }).replaceAll(/\\" \\"/g, '""').replaceAll(/" "/g, '""')).data as QuizSettings & { recentlyСompleted: boolean; };
|
|
|
|
|
}
|