2024-05-31 17:56:17 +00:00
|
|
|
|
import useSWR from "swr";
|
2025-06-18 13:05:14 +00:00
|
|
|
|
import { getAndParceData } from "./quizRelase";
|
2025-06-15 09:58:15 +00:00
|
|
|
|
import { useEffect, useState } from "react";
|
|
|
|
|
import { initDataManager, statusOfQuiz } from "@/utils/hooks/useQuestionFlowControl";
|
|
|
|
|
import { addQuestions, setQuizData, useQuizStore } from "@/stores/useQuizStore";
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
У хука есть три режмиа работы: "line" | "branch" | "ai"
|
|
|
|
|
Для branch и line единовременно запрашиваются ВСЕ данные (пока что это количество на 100 штук. Позже нужно впилить доп запросы чтобы получить все вопросы.)
|
|
|
|
|
Для ai идёт последовательный запрос данных. При первом попадании на result - блокируется возможность запрашивать новые данные
|
|
|
|
|
*/
|
2024-05-31 17:56:17 +00:00
|
|
|
|
|
2024-07-17 00:08:20 +00:00
|
|
|
|
export function useQuizData(quizId: string, preview: boolean = false) {
|
2025-06-18 13:05:14 +00:00
|
|
|
|
const { quizStep, questions } = useQuizStore();
|
2025-06-15 09:58:15 +00:00
|
|
|
|
|
|
|
|
|
const [page, setPage] = useState(0);
|
|
|
|
|
const [needFullLoad, setNeedFullLoad] = useState(false);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (quizStep > page) setPage(quizStep);
|
|
|
|
|
}, [quizStep]);
|
|
|
|
|
|
|
|
|
|
return useSWR(
|
|
|
|
|
preview ? null : ["quizData", quizId, page, needFullLoad],
|
|
|
|
|
async ([, id, currentPage, fullLoad]) => {
|
|
|
|
|
// Первый запрос - получаем статус
|
|
|
|
|
if (currentPage === 0 && !fullLoad) {
|
2025-06-18 13:05:14 +00:00
|
|
|
|
const firstData = await getAndParceData({
|
2025-06-15 09:58:15 +00:00
|
|
|
|
quizId: id,
|
|
|
|
|
limit: 1,
|
|
|
|
|
page: currentPage,
|
|
|
|
|
needConfig: true,
|
|
|
|
|
});
|
2025-06-30 02:07:32 +00:00
|
|
|
|
//firstData.settings.status = "ai";
|
2025-07-01 13:49:30 +00:00
|
|
|
|
console.log("useQuizData: firstData received:", firstData);
|
|
|
|
|
console.log("useQuizData: firstData.settings:", firstData.settings);
|
|
|
|
|
|
2025-06-15 09:58:15 +00:00
|
|
|
|
initDataManager({
|
|
|
|
|
status: firstData.settings.status,
|
|
|
|
|
haveRoot: firstData.settings.cfg.haveRoot,
|
|
|
|
|
});
|
2025-07-01 13:49:30 +00:00
|
|
|
|
console.log("useQuizData: calling setQuizData with firstData");
|
2025-06-15 09:58:15 +00:00
|
|
|
|
setQuizData(firstData);
|
|
|
|
|
|
|
|
|
|
// Определяем нужно ли загружать все данные
|
2025-06-30 02:07:32 +00:00
|
|
|
|
console.log("Определяем нужно ли загружать все данные");
|
|
|
|
|
console.log(firstData.settings.status);
|
|
|
|
|
if (!["ai"].includes(firstData.settings.status)) {
|
2025-06-15 09:58:15 +00:00
|
|
|
|
setNeedFullLoad(true); // Триггерит новый запрос через изменение ключа
|
|
|
|
|
return firstData;
|
|
|
|
|
}
|
|
|
|
|
return firstData;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Полная загрузка для line/branch
|
|
|
|
|
if (fullLoad) {
|
2025-06-18 13:05:14 +00:00
|
|
|
|
const data = await getAndParceData({
|
2025-06-15 09:58:15 +00:00
|
|
|
|
quizId: id,
|
|
|
|
|
limit: 100,
|
|
|
|
|
page: 0,
|
|
|
|
|
needConfig: false,
|
|
|
|
|
});
|
|
|
|
|
|
2025-06-18 13:05:14 +00:00
|
|
|
|
addQuestions(data.questions.slice(1));
|
|
|
|
|
return data;
|
2025-06-15 09:58:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
2025-06-30 02:07:32 +00:00
|
|
|
|
if (currentPage >= questions.length) {
|
2025-06-18 13:05:14 +00:00
|
|
|
|
try {
|
|
|
|
|
// Для AI режима - последовательная загрузка
|
|
|
|
|
const data = await getAndParceData({
|
|
|
|
|
quizId: id,
|
|
|
|
|
page: currentPage,
|
|
|
|
|
limit: 1,
|
|
|
|
|
needConfig: false,
|
|
|
|
|
});
|
|
|
|
|
addQuestions(data.questions);
|
|
|
|
|
return data;
|
|
|
|
|
} catch (_) {
|
|
|
|
|
setPage(questions.length);
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-06-15 09:58:15 +00:00
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
revalidateOnFocus: false,
|
|
|
|
|
revalidateOnReconnect: false,
|
|
|
|
|
shouldRetryOnError: false,
|
|
|
|
|
refreshInterval: 0,
|
|
|
|
|
}
|
|
|
|
|
);
|
2024-05-31 17:56:17 +00:00
|
|
|
|
}
|