119 lines
4.9 KiB
TypeScript
119 lines
4.9 KiB
TypeScript
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,
|
||
};
|
||
}
|