frontPanel/src/pages/startPage/EditPage.tsx
2025-04-02 05:26:55 +03:00

171 lines
5.3 KiB
TypeScript
Executable File

import { Box, Skeleton, useMediaQuery, useTheme } from "@mui/material";
import { updateQuiz, setCurrentStep } from "@root/quizes/actions";
import { useCurrentQuiz } from "@root/quizes/hooks";
import { useQuizStore } from "@root/quizes/store";
import Stepper from "@ui_kit/Stepper";
import SwitchStepPages from "@ui_kit/switchStepPages";
import { useEffect, useRef } from "react";
import { useNavigate } from "react-router-dom";
import { useDebouncedCallback } from "use-debounce";
import { cleanQuestions } from "@root/questions/actions";
import {
updateCanCreatePublic,
updateModalInfoWhyCantCreate,
setShowConfirmLeaveModal,
updateSomeWorkBackend,
} from "@root/uiTools/actions";
import { useQuestionsStore } from "@root/questions/store";
import { useUiTools } from "@root/uiTools/store";
import { AnyTypedQuizQuestion } from "@frontend/squzanswerer";
import { ModalInfoWhyCantCreate } from "./ModalInfoWhyCantCreate";
import { ConfirmLeaveModal } from "./ConfirmLeaveModal";
import { checkQuestionHint } from "@utils/checkQuestionHint";
import AmoTokenExpiredDialog from "../IntegrationsPage/IntegrationsModal/Amo/AmoTokenExpiredDialog";
import { useAmoAccount } from "@/api/integration";
interface Props {
openBranchingPage: boolean;
setOpenBranchingPage: (a: boolean) => void;
widthMain: number;
mobileSidebar: boolean;
heightSidebar: number;
scrollDown: boolean;
setScrollDown: (a: boolean) => void;
}
export default function EditPage({
openBranchingPage,
setOpenBranchingPage,
widthMain,
mobileSidebar,
heightSidebar,
scrollDown,
setScrollDown,
}: Props) {
const quiz = useCurrentQuiz();
const { editQuizId } = useQuizStore();
const { questions } = useQuestionsStore();
const { showConfirmLeaveModal, nextStep } = useUiTools();
const theme = useTheme();
const navigate = useNavigate();
const currentStep = useQuizStore((state) => state.currentStep);
const isBranchingLogic = useMediaQuery(theme.breakpoints.down(1100));
const isMobile = useMediaQuery(theme.breakpoints.down(650));
const quizConfig = quiz?.config;
const mainBlock = useRef(0);
const heightBar = heightSidebar + 51 + 88;
useEffect(() => {
if (editQuizId === null) navigate("/list");
}, [navigate, editQuizId]);
useEffect(
() => () => {
cleanQuestions();
updateModalInfoWhyCantCreate(false);
updateSomeWorkBackend(false);
},
[]
);
const updateQuestionHint = useDebouncedCallback((questions: AnyTypedQuizQuestion[]) => {
const problems = checkQuestionHint(questions, quiz);
useUiTools.setState({ whyCantCreatePublic: problems });
if (Object.keys(problems).length > 0) {
updateQuiz(quiz?.id, (state) => {
state.status = "stop";
});
updateCanCreatePublic(false);
} else {
updateCanCreatePublic(true);
}
}, 600);
useEffect(() => {
updateQuestionHint(questions);
}, [questions, quiz]);
const followNewPage = () => {
setShowConfirmLeaveModal(false);
setCurrentStep(nextStep);
};
let lastScroll = mainBlock.current.scrollTop;
const onScroll = (e) => {
if ((mainBlock.current.scrollTop > lastScroll && !scrollDown) || null) {
setScrollDown(true);
}
if (mainBlock.current.scrollTop < lastScroll && scrollDown) {
setScrollDown(false);
}
lastScroll = mainBlock.current.scrollTop;
};
if (!quizConfig) return <Skeleton sx={{width: "100vw", height: "100vh"}}></Skeleton>;
const isConditionMet = [1].includes(currentStep) && quizConfig.type !== "form";
return (
<>
<Box
sx={{
display: isMobile ? "block" : "flex",
position: "relative",
}}
>
<Box
sx={{
background: theme.palette.background.default,
width: "100%",
overflow: "hidden",
}}
>
<Box
onScroll={onScroll}
ref={mainBlock}
sx={{
padding: isMobile
? mobileSidebar
? `${heightBar}px 16px 70px 16px`
: "67px 16px 70px 16px"
: "25px 25px 20px 25px",
overflow: "auto",
height: isMobile
? "100vh"
: isConditionMet
? isBranchingLogic
? `calc(100vh - 166px)`
: `calc(100vh - 186px)`
: `calc(100vh - 166px)`,
boxSizing: "border-box",
transition: "transform 0.3s",
paddingBottom: scrollDown && isMobile ? "120px" : undefined,
}}
>
{quizConfig && (
<>
<Stepper activeStep={currentStep} />
<SwitchStepPages
activeStep={currentStep}
quizType={quizConfig.type}
quizResults={quizConfig.results}
quizStartPageType={quizConfig.startpageType}
openBranchingPage={openBranchingPage}
setOpenBranchingPage={setOpenBranchingPage}
widthMain={widthMain}
/>
</>
)}
</Box>
</Box>
</Box>
<ModalInfoWhyCantCreate />
<ConfirmLeaveModal
open={showConfirmLeaveModal}
follow={followNewPage}
cancel={() => setShowConfirmLeaveModal(false)}
/>
</>
);
}