import { useQuizData } from "@/api/hooks"; import { QuizViewContext, createQuizViewStore } from "@/stores/quizView"; import LoadingSkeleton from "@/ui_kit/LoadingSkeleton"; import { useVkMetricsGoals } from "@/utils/hooks/metrics/useVkMetricsGoals"; import { useYandexMetricsGoals } from "@/utils/hooks/metrics/useYandexMetricsGoals"; import { QuizSettingsContext, QuizSettingsContextValue } from "@contexts/QuizDataContext"; import { RootContainerWidthContext } from "@contexts/RootContainerWidthContext"; import type { QuizSettings } from "@model/settingsData"; import { Box, CssBaseline, ScopedCssBaseline, ThemeProvider } from "@mui/material"; import { LocalizationProvider } from "@mui/x-date-pickers"; import { AdapterMoment } from "@mui/x-date-pickers/AdapterMoment"; import { ruRU } from "@mui/x-date-pickers/locales"; import { handleComponentError } from "@utils/handleComponentError"; import lightTheme from "@utils/themes/light"; import moment from "moment"; import { SnackbarProvider } from "notistack"; import { startTransition, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react"; import { ErrorBoundary } from "react-error-boundary"; import { ApologyPage } from "./ViewPublicationPage/ApologyPage"; import ViewPublicationPage from "./ViewPublicationPage/ViewPublicationPage"; import { HelmetProvider } from "react-helmet-async"; import "moment/dist/locale/ru"; import { AnyTypedQuizQuestion } from ".."; import { produce } from "immer"; moment.locale("ru"); const localeText = ruRU.components.MuiLocalizationProvider.defaultProps.localeText; type Props = { quizSettings?: QuizSettings; quizId: string; preview?: boolean; changeFaviconAndTitle?: boolean; className?: string; disableGlobalCss?: boolean; }; function isQuizSettingsValid(data: any): data is QuizSettings { return ( data && Array.isArray(data.questions) && data.settings && typeof data.cnt === "number" && typeof data.recentlyCompleted === "boolean" && typeof data.show_badge === "boolean" ); } function QuizAnswererInner({ quizSettings, quizId, preview = false, changeFaviconAndTitle = true, className, disableGlobalCss = false, }: Props) { const [quizViewStore] = useState(createQuizViewStore); const [rootContainerWidth, setRootContainerWidth] = useState(() => window.innerWidth); const rootContainerRef = useRef(null); const { data, error, isLoading } = useQuizData(quizId, preview); const vkMetrics = useVkMetricsGoals(quizSettings?.settings.cfg.vkMetricsNumber); const yandexMetrics = useYandexMetricsGoals(quizSettings?.settings.cfg.yandexMetricsNumber); const [localQuizSettings, setLocalQuizSettings] = useState(quizSettings); // Добавляем эффект для обновления localQuizSettings при получении новых данных useEffect(() => { if (data && !quizSettings) { setLocalQuizSettings(data); } }, [data, quizSettings]); useEffect(() => { setTimeout(() => { vkMetrics.quizOpened(); yandexMetrics.quizOpened(); }, 4000); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useLayoutEffect(() => { if (rootContainerRef.current) setRootContainerWidth(rootContainerRef.current.clientWidth); }, []); useEffect(() => { const handleWindowResize = () => { startTransition(() => { if (rootContainerRef.current) setRootContainerWidth(rootContainerRef.current.clientWidth); }); }; window.addEventListener("resize", handleWindowResize); return () => { window.removeEventListener("resize", handleWindowResize); }; }, []); const finalQuizSettings = quizSettings || localQuizSettings; const contextValue = useMemo( () => ({ ...(finalQuizSettings as QuizSettings), quizId, preview, changeFaviconAndTitle, addQuestion: (newQuestion: AnyTypedQuizQuestion) => { setLocalQuizSettings((prev) => { if (!prev) return prev; return produce(prev, (draft) => { draft.questions.push(newQuestion); }); }); }, }), [quizId, preview, changeFaviconAndTitle, finalQuizSettings] ); if (isLoading) return ; if (error) return ; if (!finalQuizSettings) return ; if (!finalQuizSettings.questions || finalQuizSettings.questions.length === 0) return ; if (finalQuizSettings.questions.length === 1 && finalQuizSettings?.settings.cfg.noStartPage) return ; if (!quizId) return ; const quizContainer = ( ); return ( {disableGlobalCss ? ( {quizContainer} ) : ( {quizContainer} )} ); } export default function QuizAnswerer(props: Props) { return ( ); }