frontPanel/src/pages/main.tsx

281 lines
9.5 KiB
TypeScript
Executable File

import { Header } from "@ui_kit/Header/Header";
import Sidebar from "@ui_kit/Sidebar/Sidebar";
import Box from "@mui/material/Box";
import { useTheme, useMediaQuery, IconButton } from "@mui/material";
import HeaderFull from "@ui_kit/Header/HeaderFull";
import { useEffect, useRef, useState } from "react";
import { SidebarMobile } from "../ui_kit/Sidebar/SidebarMobile";
import { setShowConfirmLeaveModal } from "@root/uiTools/actions";
import { setCurrentStep, setQuizes } from "@root/quizes/actions";
import { useQuizStore } from "@root/quizes/store";
import { SmallSwitchQuestionListGraph } from "@ui_kit/Toolbars/SmallSwitchQuestionListGraph";
import { PanelSwitchQuestionListGraph } from "@ui_kit/Toolbars/PanelSwitchQuestionListGraph";
import { ButtonTestPublication } from "@ui_kit/Toolbars/ButtonTestPublication";
import { ButtonRecallQuiz } from "@ui_kit/Toolbars/ButtonRecallQuiz";
import { Link } from "react-router-dom";
import { LinkSimple } from "@icons/LinkSimple";
import { useCurrentQuiz } from "@root/quizes/hooks";
import { deleteTimeoutedQuestions } from "@utils/deleteTimeoutedQuestions";
import { useQuestionsStore } from "@root/questions/store";
import { quizApi } from "@api/quiz";
import { questionApi } from "@api/question";
import { createResult, setQuestions } from "@root/questions/actions";
import { toggleQuizPreview } from "@root/quizPreview";
import VisibilityIcon from "@mui/icons-material/Visibility";
interface Props {
sidebar: boolean;
header?: boolean;
footer?: boolean;
Page?: React.Component;
}
export default function Main({ sidebar, header, footer, Page }: Props) {
const theme = useTheme();
const quiz = useCurrentQuiz();
const quizConfig = quiz?.config;
const { questions } = useQuestionsStore();
const { editQuizId } = useQuizStore();
const currentStep = useQuizStore((state) => state.currentStep);
useEffect(() => {
const getData = async () => {
const quizes = await quizApi.getList();
setQuizes(quizes);
if (editQuizId) {
const questions = await questionApi.getList({ quiz_id: editQuizId });
setQuestions(questions);
//Всегда должен существовать хоть 1 резулт - "line"
if (
!questions?.find(
(q) =>
(q.type === "result" && q.content.includes(':"line"')) ||
q.content.includes(":'line'"),
)
) {
createResult(quiz?.backendId, "line");
}
}
};
getData();
}, []);
const isMobile = useMediaQuery(theme.breakpoints.down(650));
const isMobileSm = useMediaQuery(theme.breakpoints.down(370));
const isBranchingLogicSmall = useMediaQuery(theme.breakpoints.down(1100));
const isBranchingLogicBig = useMediaQuery(theme.breakpoints.down(1446));
const isLinkButton = useMediaQuery(theme.breakpoints.down(708));
const [mobileSidebar, setMobileSidebar] = useState<boolean>(false);
const [nextStep, setNextStep] = useState<number>(0);
const [openBranchingPage, setOpenBranchingPage] = useState<boolean>(false);
const openBranchingPageHC = () => {
if (!openBranchingPage) {
deleteTimeoutedQuestions(questions, quiz);
}
setOpenBranchingPage((old) => !old);
};
const isConditionMet =
[1].includes(currentStep) && quizConfig?.type !== "form";
const changePage = (index: number) => {
if (currentStep === 2) {
setNextStep(index);
setShowConfirmLeaveModal(true);
return;
}
setCurrentStep(index);
};
const [widthMain, setWidthMain] = useState(null);
const mainBlock = useRef(0);
const observer = useRef(
new ResizeObserver((entries) => {
const { width } = entries[0].contentRect;
setWidthMain(width);
}),
);
useEffect(() => {
if (mainBlock.current) observer.current.observe(mainBlock.current);
}, [mainBlock, observer]);
if (!quizConfig) return <></>;
return (
<>
<Header setMobileSidebar={setMobileSidebar} />
<Box
sx={{
display: "flex",
flexDirection: isMobile ? "column" : "row",
}}
>
{sidebar ? (
<>
{isMobile ? (
<SidebarMobile open={mobileSidebar} changePage={changePage} />
) : (
<Sidebar changePage={changePage} />
)}
</>
) : (
<></>
)}
<Box
sx={{
width: "100%",
height: isMobile ? "calc(100vh - 51px)" : "calc(100vh - 80px)",
display: "flex",
flexDirection: "column",
justifyContent: "space-between",
overflow: "hidden",
}}
>
<Box
ref={mainBlock}
sx={{
background: theme.palette.background.default,
width: "100%",
// overflow: "auto",
boxSizing: "border-box",
}}
>
<Page
openBranchingPage={openBranchingPage}
setOpenBranchingPage={openBranchingPageHC}
widthMain={widthMain}
/>
</Box>
{footer && (
<Box
sx={{
width: "100%",
padding: isMobile ? "20px 16px" : "20px 20px",
display: "flex",
justifyContent: isMobile
? isMobileSm
? "center"
: "flex-end"
: "flex-start",
flexDirection: isMobile ? "row-reverse" : "-moz-initial",
alignItems: "center",
gap: isMobile ? "5px" : "15px",
background: "#FFF",
borderTop: "#f2f3f7 2px solid",
}}
>
{isConditionMet &&
(isBranchingLogicSmall ? (
<SmallSwitchQuestionListGraph
openBranchingPage={openBranchingPage}
setOpenBranchingPage={openBranchingPageHC}
/>
) : widthMain < 1216 || !openBranchingPage ? (
<PanelSwitchQuestionListGraph
openBranchingPage={openBranchingPage}
setOpenBranchingPage={openBranchingPageHC}
hideText
/>
) : (
<></>
))}
{/* Кнопка тестового просмотра */}
<ButtonTestPublication />
{/* Кнопка отозвать */}
<ButtonRecallQuiz />
{/* Ссылка */}
{quiz?.status === "start" &&
(!isLinkButton ? (
<Box
data-cy="link-test"
component={Link}
sx={{
whiteSpace: "nowrap",
textOverflow: "ellipsis",
overflow: "hidden",
display: isMobile ? "none" : "block",
color: "#7E2AEA",
fontSize: "14px",
}}
target="_blank"
to={"https://s.hbpn.link/" + quiz.qid}
>
https://s.hbpn.link/{quiz.qid}
</Box>
) : (
<Box
data-cy="link-test"
component={Link}
sx={{
cursor: "pointer",
minWidth: "34px",
height: "34px",
color: "#7E2AEA",
fontSize: "14px",
display: isMobile ? "none" : "flex",
justifyContent: "center",
alignItems: "Center",
background: "#EEE4FC",
borderRadius: "8px",
}}
target="_blank"
to={"https://s.hbpn.link/" + quiz.qid}
>
<LinkSimple />
</Box>
))}
{/* Маленькая кнопка ссылки */}
{isMobile && quiz?.status === "start" && (
<Box
data-cy="link-test"
component={Link}
sx={{
cursor: "pointer",
width: "34px",
height: "34px",
color: "#7E2AEA",
fontSize: "14px",
display: "flex",
justifyContent: "center",
alignItems: "Center",
background: "#EEE4FC",
borderRadius: "8px",
}}
target="_blank"
to={"https://s.hbpn.link/" + quiz.qid}
>
<LinkSimple />
</Box>
)}
{currentStep <= 1 && (
<Box sx={{ textAlign: "end", width: "100%" }}>
<IconButton
data-cy="button-preview"
onClick={toggleQuizPreview}
sx={{
pointerEvents: "auto",
marginLeft: "auto",
position: "relative",
zIndex: "999999",
alignItems: "end",
}}
>
<VisibilityIcon sx={{ height: "30px", width: "30px" }} />
</IconButton>
</Box>
)}
</Box>
)}
</Box>
</Box>
</>
);
}