frontAnswerer/src/pages/ViewPublicationPage/index.tsx

130 lines
3.8 KiB
TypeScript
Raw Normal View History

2023-12-16 14:55:56 +00:00
import { useEffect, useState } from "react";
2023-12-29 00:58:19 +00:00
import { Box, Skeleton, ThemeProvider } from "@mui/material";
2023-12-16 14:55:56 +00:00
import { StartPageViewPublication } from "./StartPageViewPublication";
import { Question } from "./Question";
import { ApologyPage } from "./ApologyPage"
2023-12-16 14:55:56 +00:00
import { useQuestionsStore } from "@root/quizData/store"
import { getData } from "@api/quizRelase"
2023-12-16 14:55:56 +00:00
import type { AnyTypedQuizQuestion } from "@model/questionTypes/shared";
import { useGetSettings } from "../../utils/hooks/useGetSettings";
2023-12-29 00:58:19 +00:00
import { themesPublication } from "../../utils/themes/Publication/themePublication";
import { replaceSpacesToEmptyLines } from "./tools/replaceSpacesToEmptyLines";
2023-12-16 14:55:56 +00:00
const QID =
2023-12-29 00:58:19 +00:00
process.env.NODE_ENV === "production" ?
window.location.pathname.replace(/\//g, '')
:
"9fafc6c9-6ccf-42b6-b400-0ee9f5f0fa16"
export const ViewPage = () => {
const { settings, cnt, items } = useQuestionsStore()
console.log("КВИЗ ", settings)
2023-12-29 00:58:19 +00:00
console.log("ВОПРОСЫ ", items)
2023-12-16 14:55:56 +00:00
const [visualStartPage, setVisualStartPage] = useState<boolean>();
const [errormessage, setErrormessage] = useState<string>("");
2023-12-16 14:55:56 +00:00
useEffect(() => {
async function get() {
try {
const data = await getData(QID)
//@ts-ignore
const settings = data.settings
2024-01-11 13:13:42 +00:00
const parseData = replaceSpacesToEmptyLines({
2023-12-29 00:58:19 +00:00
settings: {
//@ts-ignore
2023-12-29 00:58:19 +00:00
qid: QID,
fp: settings.fp,
rep: settings.rep,
name: settings.name,
cfg: JSON.parse(settings?.cfg),
lim: settings.lim,
due: settings.due,
delay: settings.delay,
pausable: settings.pausable
},
//@ts-ignore
2024-01-11 13:13:42 +00:00
items:
//@ts-ignore
2023-12-29 00:58:19 +00:00
data.items.map((item) => {
const content = JSON.parse(item.c)
return {
description: item.desc,
id: item.id,
page: item.p,
required: item.req,
title: item.title,
type: item.typ,
content
}
2024-01-11 13:13:42 +00:00
}),
2023-12-29 00:58:19 +00:00
//@ts-ignore
cnt: data.cnt
2024-01-11 13:13:42 +00:00
})
parseData.items = parseData.items.map((question:any) => {
let data = question
for (let key in question) {
if (question[key] === " ") data[key] = ""
}
return data
})
2023-12-29 00:58:19 +00:00
useQuestionsStore.setState(parseData)
} catch (e) {
2023-12-29 00:58:19 +00:00
//@ts-ignore
if (e?.response?.status === 423) setErrormessage("квиз не активирован")
}
2023-12-29 00:58:19 +00:00
}
get()
}, [])
useEffect(() => {//установка фавиконки
if (Object.values(settings).length > 0) {
2023-12-16 14:55:56 +00:00
2023-12-29 00:58:19 +00:00
const link = document.querySelector('link[rel="icon"]');
if (link && settings?.cfg.startpage.favIcon) {
link.setAttribute("href", settings?.cfg.startpage.favIcon);
}
2023-12-29 00:58:19 +00:00
setVisualStartPage(!settings?.cfg.noStartPage);
}
}, [settings]);
2023-12-16 14:55:56 +00:00
const filteredQuestions = (
items.filter(({ type }) => type) as AnyTypedQuizQuestion[]
2023-12-16 14:55:56 +00:00
).sort((previousItem, item) => previousItem.page - item.page);
if (errormessage) return <ApologyPage message={errormessage} />
if (visualStartPage === undefined) return <Skeleton sx={{ bgcolor: 'grey', width: "100vw", height: "100vh" }} variant="rectangular" />;
if (cnt === 0 || (cnt === 1 && items[0].type === "result")) return <ApologyPage message="Нет созданных вопросов" />
2023-12-16 14:55:56 +00:00
return (
2023-12-29 00:58:19 +00:00
<ThemeProvider theme={themesPublication?.[settings?.cfg.theme || "StandardTheme"]}>
<Box>
{
visualStartPage ?
<StartPageViewPublication setVisualStartPage={setVisualStartPage} />
:
<Question questions={filteredQuestions} />
}
</Box>
</ThemeProvider>
2023-12-16 14:55:56 +00:00
);
};