2024-02-16 15:53:44 +00:00
|
|
|
|
import { questionApi } from "@api/question";
|
|
|
|
|
import { devlog } from "@frontend/kitui";
|
|
|
|
|
import { QuizAnswerer } from "@frontend/squzanswerer";
|
|
|
|
|
import { rawQuestionToQuestion } from "@model/question/question";
|
2024-02-13 12:57:17 +00:00
|
|
|
|
import { Box } from "@mui/material";
|
2024-02-16 15:53:44 +00:00
|
|
|
|
import { useQuizes } from "@root/quizes/hooks";
|
|
|
|
|
import { isAxiosError } from "axios";
|
|
|
|
|
import { enqueueSnackbar } from "notistack";
|
2024-02-13 12:57:17 +00:00
|
|
|
|
import { useParams } from "react-router-dom";
|
2024-02-16 15:53:44 +00:00
|
|
|
|
import useSWR from "swr";
|
2024-02-13 12:57:17 +00:00
|
|
|
|
|
|
|
|
|
export default function ViewPublicationPage() {
|
|
|
|
|
const quizId = useParams().quizId;
|
2024-02-16 15:53:44 +00:00
|
|
|
|
const {
|
|
|
|
|
quizes,
|
|
|
|
|
error: quizesError,
|
|
|
|
|
isLoading: quizesIsLoading,
|
|
|
|
|
} = useQuizes();
|
2024-02-13 12:57:17 +00:00
|
|
|
|
|
|
|
|
|
if (!quizId) return null;
|
|
|
|
|
|
2024-02-16 15:53:44 +00:00
|
|
|
|
const quiz = quizes?.find((quiz) => quiz.qid === quizId);
|
|
|
|
|
|
|
|
|
|
const {
|
|
|
|
|
data: rawQuestions,
|
|
|
|
|
isLoading: questionsIsLoading,
|
|
|
|
|
error: questionsError,
|
|
|
|
|
} = useSWR(
|
|
|
|
|
["questions", quiz?.backendId],
|
|
|
|
|
([, id]) => questionApi.getList({ quiz_id: id }),
|
|
|
|
|
{
|
|
|
|
|
onError: (error) => {
|
|
|
|
|
const message = isAxiosError<string>(error)
|
|
|
|
|
? error.response?.data ?? ""
|
|
|
|
|
: "";
|
|
|
|
|
|
|
|
|
|
devlog("Error getting question list", error);
|
|
|
|
|
enqueueSnackbar(`Не удалось получить вопросы. ${message}`);
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if (quizesError) {
|
2024-04-16 20:23:42 +00:00
|
|
|
|
console.error(`Error fetching quiz ${quizId}`, quizesError);
|
2024-02-16 15:53:44 +00:00
|
|
|
|
return null;
|
|
|
|
|
}
|
2024-02-16 16:40:08 +00:00
|
|
|
|
if (questionsError) {
|
2024-04-16 20:23:42 +00:00
|
|
|
|
console.error(`Error fetching questions ${quizId}`, questionsError);
|
2024-02-16 16:40:08 +00:00
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (quizesIsLoading) return null;
|
|
|
|
|
if (questionsIsLoading) return null;
|
2024-02-16 15:53:44 +00:00
|
|
|
|
|
|
|
|
|
if (!quiz) throw new Error("Quiz not found");
|
|
|
|
|
if (!rawQuestions) throw new Error("Questions not found");
|
|
|
|
|
|
|
|
|
|
const questions = rawQuestions.map(rawQuestionToQuestion);
|
|
|
|
|
|
2024-02-13 12:57:17 +00:00
|
|
|
|
return (
|
|
|
|
|
<Box
|
|
|
|
|
sx={{
|
|
|
|
|
height: "100dvh",
|
|
|
|
|
}}
|
|
|
|
|
>
|
2024-02-16 15:53:44 +00:00
|
|
|
|
<QuizAnswerer
|
|
|
|
|
quizSettings={{
|
|
|
|
|
cnt: rawQuestions?.length,
|
|
|
|
|
questions,
|
|
|
|
|
recentlyCompleted: false,
|
|
|
|
|
settings: {
|
|
|
|
|
fp: quiz.fingerprinting,
|
|
|
|
|
delay: 0,
|
|
|
|
|
due: quiz.due_to,
|
|
|
|
|
lim: quiz.limit,
|
|
|
|
|
name: quiz.name,
|
|
|
|
|
pausable: quiz.pausable,
|
|
|
|
|
rep: quiz.repeatable,
|
|
|
|
|
cfg: quiz.config,
|
|
|
|
|
},
|
2024-04-16 19:31:51 +00:00
|
|
|
|
show_badge: true,
|
2024-02-16 15:53:44 +00:00
|
|
|
|
}}
|
|
|
|
|
quizId={quizId}
|
2024-04-06 17:23:01 +00:00
|
|
|
|
preview
|
2024-02-16 15:53:44 +00:00
|
|
|
|
/>
|
2024-02-13 12:57:17 +00:00
|
|
|
|
</Box>
|
|
|
|
|
);
|
|
|
|
|
}
|