frontAnswerer/lib/utils/hooks/useQuestionFlowControl.ts

83 lines
2.6 KiB
TypeScript
Raw Normal View History

2025-06-15 09:58:15 +00:00
import { useBranchingQuiz } from "./FlowControlLogic/useBranchingQuiz";
import { useLinearQuiz } from "./FlowControlLogic/useLinearQuiz";
import { useAIQuiz } from "./FlowControlLogic/useAIQuiz";
2025-11-13 21:53:02 +00:00
import { useFirstFCQuiz } from "./FlowControlLogic/useFirstFCQuiz";
2025-06-15 09:58:15 +00:00
import { Status } from "@/model/settingsData";
import { useQuizStore } from "@/stores/useQuizStore";
2025-06-15 09:58:15 +00:00
interface StatusData {
status: Status;
haveRoot: string | null;
}
2024-05-06 13:47:19 +00:00
2025-06-15 09:58:15 +00:00
// выбор способа управления в зависимости от статуса
let cachedManager: () => ReturnType<typeof useLinearQuiz>;
2025-11-13 21:53:02 +00:00
export let statusOfQuiz: "line" | "branch" | "ai" | "FC";
let isInitialized = false;
2025-06-15 09:58:15 +00:00
function analyicStatus({ status, haveRoot }: StatusData) {
2025-11-13 21:53:02 +00:00
let isCrutch13112025 = window.location.pathname === "/d557133f-26b6-4b0b-93da-c538758a65d4";
if (isCrutch13112025) {
statusOfQuiz = "FC";
console.log("statusOfQuiz: " + statusOfQuiz);
return;
}
if (status === "ai") {
statusOfQuiz = "ai";
2025-11-13 21:53:02 +00:00
console.log("statusOfQuiz: " + statusOfQuiz);
return;
}
2025-06-15 09:58:15 +00:00
if (status === "start") {
// Если есть ветвление, то settings.cfg.haveRoot будет заполнен
if (haveRoot) statusOfQuiz = "branch";
else statusOfQuiz = "line";
2025-11-13 21:53:02 +00:00
console.log("statusOfQuiz: " + statusOfQuiz);
return;
}
throw new Error("quiz is inactive");
2025-06-15 09:58:15 +00:00
}
2025-06-15 09:58:15 +00:00
export const initDataManager = (data: StatusData) => {
analyicStatus(data);
switch (statusOfQuiz) {
case "line":
cachedManager = useLinearQuiz;
break;
case "branch":
cachedManager = useBranchingQuiz;
break;
case "ai":
cachedManager = useAIQuiz;
break;
2025-11-13 21:53:02 +00:00
case "FC":
cachedManager = useFirstFCQuiz;
break;
2024-05-06 13:47:19 +00:00
}
isInitialized = true;
2025-06-15 09:58:15 +00:00
};
2025-06-15 09:58:15 +00:00
// Главный хук (интерфейс для потребителей)
export const useQuestionFlowControl = () => {
if (!cachedManager || !isInitialized) {
// Попытка автоматической инициализации на основе текущих настроек
const { settings } = useQuizStore.getState();
if (settings && settings.status) {
initDataManager({
status: settings.status,
haveRoot: settings.cfg.haveRoot,
});
} else {
throw new Error("DataManager not initialized! Call initDataManager() first.");
}
2025-06-15 09:58:15 +00:00
}
return cachedManager();
};
// Функция для сброса состояния (полезна для HMR)
export const resetDataManager = () => {
cachedManager = null as any;
isInitialized = false;
statusOfQuiz = null as any;
};