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