diff --git a/lib/components/QuizAnswerer.tsx b/lib/components/QuizAnswerer.tsx index 376c87d..4ef9619 100644 --- a/lib/components/QuizAnswerer.tsx +++ b/lib/components/QuizAnswerer.tsx @@ -13,19 +13,22 @@ import { ApologyPage } from "./ViewPublicationPage/ApologyPage"; import ViewPublicationPage from "./ViewPublicationPage/ViewPublicationPage"; import { RootContainerWidthContext } from "@contexts/RootContainerWidthContext"; import { startTransition, useEffect, useLayoutEffect, useRef, useState } from "react"; +import { getQuizData } from "@/api/quizRelase"; +import LoadingSkeleton from "@/ui_kit/LoadingSkeleton"; moment.locale("ru"); const localeText = ruRU.components.MuiLocalizationProvider.defaultProps.localeText; type Props = { - quizSettings: QuizSettings; + quizSettings?: QuizSettings | {}; quizId: string; preview?: boolean; }; -export default function QuizAnswerer({ quizSettings, quizId, preview = false }: Props) { +export default function QuizAnswerer({ quizSettings = {}, quizId, preview = false }: Props) { const [rootContainerWidth, setRootContainerWidth] = useState(() => window.innerWidth); + const [quizData, setQuizData] = useState(quizSettings); const rootContainerRef = useRef(null); useLayoutEffect(() => { @@ -33,6 +36,10 @@ export default function QuizAnswerer({ quizSettings, quizId, preview = false }: }, []); useEffect(() => { + if (Object.values(quizSettings).length === 0) { + const data = (async()=>await getQuizData(quizId))() + setQuizData(data) + } const handleWindowResize = () => { startTransition(() => { if (rootContainerRef.current) setRootContainerWidth(rootContainerRef.current.clientWidth); @@ -45,9 +52,10 @@ export default function QuizAnswerer({ quizSettings, quizId, preview = false }: }; }, []); + if (Object.values(quizData).length === 0) return ; return ( - + ans.questionId === currentQuestion.id) - + useEffect( function setFaviconAndTitle() { - const link = document.querySelector('link[rel="icon"]'); - if (link && settings.cfg.startpage.favIcon) { - link.setAttribute("href", settings.cfg.startpage.favIcon); + if (settings.cfg !== undefined) { + const link = document.querySelector('link[rel="icon"]'); + if (link && settings.cfg.startpage.favIcon) { + link.setAttribute("href", settings.cfg.startpage.favIcon); + } + + document.title = settings.name; } - document.title = settings.name; }, [settings] ); @@ -64,24 +68,24 @@ export default function ViewPublicationPage() { } + prevButton={} nextButton={ { - if (!isAnswer) { - try { - await sendAnswer({ - questionId: currentQuestion.id, - body: "", - qid: quizId, - }); - } catch (e) { - enqueueSnackbar("ответ не был засчитан"); - } + isNextButtonEnabled={isNextButtonEnabled} + moveToNextQuestion={async () => { + if (!isAnswer) { + try { + await sendAnswer({ + questionId: currentQuestion.id, + body: "", + qid: quizId, + }); + } catch (e) { + enqueueSnackbar("ответ не был засчитан"); } - moveToNextQuestion() - }} + } + moveToNextQuestion() + }} />} /> ); diff --git a/lib/contexts/QuizDataContext.ts b/lib/contexts/QuizDataContext.ts index c87f447..03b47a8 100644 --- a/lib/contexts/QuizDataContext.ts +++ b/lib/contexts/QuizDataContext.ts @@ -1,13 +1,19 @@ import { QuizSettings } from "@model/settingsData"; import { createContext, useContext } from "react"; -type QuizData = QuizSettings & { quizId: string; preview: boolean; }; +type QuizSettingsFull = QuizSettings | {}; +type QuizData = QuizSettingsFull & { quizId: string; preview: boolean; }; +type QuizDataClean = QuizSettings & { quizId: string; preview: boolean; }; export const QuizDataContext = createContext(null); -export const useQuizData = () => { +export const useQuizData = ():QuizDataClean => { const quizData = useContext(QuizDataContext); - if (quizData === null) throw new Error("QuizData context is null"); + if ( + quizData === null || + !("settings" in quizData) || + !("recentlyCompleted" in quizData) + ) throw new Error("QuizData context is null"); return quizData; };