import { useState, useEffect } from "react"; import { Box, Button, useTheme } from "@mui/material"; import { useQuizViewStore } from "@root/quizView"; import type { AnyTypedQuizQuestion, QuizQuestionBase, } from "../../model/questionTypes/shared"; import { getQuestionByContentId } from "@root/questions/actions"; import { enqueueSnackbar } from "notistack"; type FooterProps = { questions: AnyTypedQuizQuestion[]; setCurrentQuestion: (step: AnyTypedQuizQuestion) => void; question: QuizQuestionBase; }; export const Footer = ({ setCurrentQuestion, questions, question, }: FooterProps) => { const [disabledQuestionsId, setDisabledQuestionsId] = useState>( new Set() ); const [disablePreviousButton, setDisablePreviousButton] = useState(false); const [disableNextButton, setDisableNextButton] = useState(false); const { answers } = useQuizViewStore(); const theme = useTheme(); const linear = !questions.find( ({ content }) => content.rule.parentId === "root" ); useEffect(() => { // Логика для аргумента disabled у кнопки "Назад" if (linear) { const questionIndex = questions.findIndex(({ id }) => id === question.id); const previousQuestion = questions[questionIndex - 1]; if (previousQuestion) { setDisablePreviousButton(false); } else { setDisablePreviousButton(true); } } else { if (question?.content.rule.parentId === "root") { setDisablePreviousButton(true); } else { setDisablePreviousButton(false); } } // Логика для аргумента disabled у кнопки "Далее" const answer = answers.find( ({ questionId }) => questionId === question.content.id ); if (question.required && answer?.changed) { setDisableNextButton(false); } if (question.required && !answer?.changed) { setDisableNextButton(true); return; } if (linear) { const questionIndex = questions.findIndex(({ id }) => id === question.id); const nextQuestion = questions[questionIndex + 1]; if (nextQuestion) { setDisableNextButton(false); } else { setDisableNextButton(true); } } else { const nextQuestionId = getNextQuestionId(); if (nextQuestionId) { setDisableNextButton(false); } else { const nextQuestion = getQuestionByContentId( question.content.rule.default ); if (nextQuestion?.type) { setDisableNextButton(false); } else { setDisableNextButton(true); } } } }, [question, answers]); const getNextQuestionId = () => { if (answers.length) { const answer = answers.find( ({ questionId }) => questionId === question.content.id ); let readyBeNextQuestion = ""; question.content.rule.main.forEach(({ next, rules }) => { let longerArray = Math.max( rules[0].answers.length, [answer?.answer].length ); for ( var i = 0; i < longerArray; i++ // Цикл по всем эле­мен­там бОльшего массива ) { if (rules[0].answers[i] === answer?.answer) { readyBeNextQuestion = next; // Ес­ли хоть один эле­мент от­ли­ча­ет­ся, мас­си­вы не рав­ны } } }); return readyBeNextQuestion; } }; const followPreviousStep = () => { if (linear) { const questionIndex = questions.findIndex(({ id }) => id === question.id); const previousQuestion = questions[questionIndex - 1]; if (previousQuestion) { setCurrentQuestion(previousQuestion); } return; } if (question?.content.rule.parentId !== "root") { const parent = getQuestionByContentId(question?.content.rule.parentId); if (parent?.type) { setCurrentQuestion(parent); } else { enqueueSnackbar("не могу получить предыдущий вопрос"); } } else { enqueueSnackbar("вы находитесь на первом вопросе"); } }; const followNextStep = () => { if (linear) { const questionIndex = questions.findIndex(({ id }) => id === question.id); const nextQuestion = questions[questionIndex + 1]; if (nextQuestion) { setCurrentQuestion(nextQuestion); } return; } const nextQuestionId = getNextQuestionId(); if (nextQuestionId) { const nextQuestion = getQuestionByContentId(nextQuestionId); if (nextQuestion?.type) { setCurrentQuestion(nextQuestion); return; } else { enqueueSnackbar("не могу получить последующий вопрос"); } } else { const nextQuestion = getQuestionByContentId( question.content.rule.default ); if (nextQuestion?.type) { setCurrentQuestion(nextQuestion); } else { enqueueSnackbar("не могу получить последующий вопрос (дефолтный)"); } } }; return ( {/* Шаг {stepNumber} */} {/* */} {/* Из {questions.length} */} ); };