import { useCallback, useDebugValue, useEffect, useMemo, useState } from "react"; import { enqueueSnackbar } from "notistack"; import moment from "moment"; import { isResultQuestionEmpty } from "@/components/ViewPublicationPage/tools/checkEmptyData"; import { changeNextLoading, quizStepDec, quizStepInc, useQuizStore } from "@/stores/useQuizStore"; import { useQuizViewStore } from "@stores/quizView"; import { useVkMetricsGoals } from "@/utils/hooks/metrics/useVkMetricsGoals"; import { useYandexMetricsGoals } from "@/utils/hooks/metrics/useYandexMetricsGoals"; export function useAIQuiz() { //Получаем инфо о квизе и список вопросов. const { settings, questions, quizId, cnt, quizStep } = useQuizStore(); useEffect(() => { console.log("useQuestionFlowControl useEffect"); console.log(questions); }, [questions]); //Список ответов на вопрос. Мы записываем ответы локально, параллельно отправляя на бек информацию о ответах const answers = useQuizViewStore((state) => state.answers); //Текущий шаг "startpage" | "question" | "contactform" const setCurrentQuizStep = useQuizViewStore((state) => state.setCurrentQuizStep); //Получение возможности управлять состоянием метрик const vkMetrics = useVkMetricsGoals(settings.cfg.vkMetricsNumber); const yandexMetrics = useYandexMetricsGoals(settings.cfg.yandexMetricsNumber); const currentQuestion = useMemo(() => { console.log("выбор currentQuestion"); console.log("quizStep ", quizStep); console.log("questions[quizStep] ", questions[quizStep]); const calcQuestion = questions[quizStep]; if (calcQuestion) { vkMetrics.questionPassed(calcQuestion.id); yandexMetrics.questionPassed(calcQuestion.id); return calcQuestion; } else return questions[questions.length - 1]; }, [questions, quizStep]); useEffect(() => { if (currentQuestion.type === "result") showResult(); if (currentQuestion) changeNextLoading(false); console.log("questions"); console.log(questions); }, [currentQuestion, questions]); //Показать визуалом юзеру результат const showResult = useCallback(() => { if (currentQuestion?.type !== "result") throw new Error("Current question is not result"); //Смотрим по настройкам показывать ли вообще форму контактов. Показывать ли страницу результатов до или после формы контактов (ФК) if ( settings.cfg.showfc !== false && (settings.cfg.resultInfo.showResultForm === "after" || isResultQuestionEmpty(currentQuestion)) ) setCurrentQuizStep("contactform"); }, [currentQuestion, setCurrentQuizStep, settings.cfg.resultInfo.showResultForm, settings.cfg.showfc]); //рычаг управления из визуала в этот контроллер const showResultAfterContactForm = useCallback(() => { if (currentQuestion?.type !== "result") throw new Error("Current question is not result"); if (isResultQuestionEmpty(currentQuestion)) return; setCurrentQuizStep("question"); }, [currentQuestion, setCurrentQuizStep]); //рычаг управления из визуала в этот контроллер const moveToPrevQuestion = useCallback(() => { if (quizStep > 0 && !questions[quizStep - 1]) throw new Error("Previous question not found"); if (settings.status === "ai" && quizStep > 0) quizStepDec(); }, [quizStep]); //рычаг управления из визуала в этот контроллер const moveToNextQuestion = useCallback(async () => { changeNextLoading(true); quizStepInc(); }, [quizStep, changeNextLoading, quizStepInc]); //рычаг управления из визуала в этот контроллер const setQuestion = useCallback((_: string) => {}, []); //Анализ дисаблить ли кнопки навигации const isPreviousButtonEnabled = quizStep > 0; //Анализ дисаблить ли кнопки навигации const isNextButtonEnabled = useMemo(() => { const hasAnswer = answers.some(({ questionId }) => questionId === currentQuestion.id); if ("required" in currentQuestion.content && currentQuestion.content.required) { return hasAnswer; } return quizStep < cnt; }, [answers, currentQuestion]); useDebugValue({ CurrentQuestionIndex: quizStep, currentQuestion: currentQuestion, prevQuestion: questions[quizStep + 1], nextQuestion: questions[quizStep - 1], }); return { currentQuestion, currentQuestionStepNumber: null, nextQuestion: undefined, isNextButtonEnabled, isPreviousButtonEnabled, moveToPrevQuestion, moveToNextQuestion, showResultAfterContactForm, setQuestion, }; }