frontAnswerer/lib/api/hooks.ts

79 lines
2.7 KiB
TypeScript
Raw Normal View History

import useSWR from "swr";
2025-06-15 09:58:15 +00:00
import { getQuizData, getFirstQuizData } from "./quizRelase";
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 - блокируется возможность запрашивать новые данные
*/
export function useQuizData(quizId: string, preview: boolean) {
const { quizStep } = useQuizStore();
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) {
const firstData = await getQuizData({
quizId: id,
limit: 1,
page: currentPage,
needConfig: true,
});
initDataManager({
status: firstData.settings.status,
haveRoot: firstData.settings.cfg.haveRoot,
});
setQuizData(firstData);
// Определяем нужно ли загружать все данные
if (["line", "branch"].includes(firstData.status)) {
setNeedFullLoad(true); // Триггерит новый запрос через изменение ключа
return firstData;
}
return firstData;
}
// Полная загрузка для line/branch
if (fullLoad) {
const allQuestions = await getQuestionsData({
quizId: id,
limit: 100,
page: 0,
needConfig: false,
});
addQuestions(allQuestions);
return allQuestions;
}
// Для AI режима - последовательная загрузка
const allQuestions = await getQuestionsData({
quizId: id,
page: currentPage,
limit: 1,
needConfig: false,
});
return allQuestions;
},
{
revalidateOnFocus: false,
revalidateOnReconnect: false,
shouldRetryOnError: false,
refreshInterval: 0,
}
);
}