frontAnswerer/lib/utils/hooks/FlowControlLogic/useAIQuiz.ts

119 lines
4.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
}, [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,
};
}