diff --git a/lib/api/quizRelase.ts b/lib/api/quizRelase.ts index e8ba0ca..2384489 100644 --- a/lib/api/quizRelase.ts +++ b/lib/api/quizRelase.ts @@ -71,7 +71,7 @@ export const publicationMakeRequest = ({ url, body }: PublicationMakeRequestPara method: "POST", }); }; - +let page = 0; export async function getData(quizId: string): Promise<{ data: GetQuizDataResponse | null; isRecentlyCompleted: boolean; @@ -92,16 +92,18 @@ export async function getData(quizId: string): Promise<{ }, data: { quiz_id: quizId, - limit: 100, - page: 0, - need_config: true, + limit: 1, + page, + need_config: page === 0, }, } ); + console.log(data); + if (data.items.length) page++; const sessions = JSON.parse(localStorage.getItem("sessions") || "{}"); //Тут ещё проверка на антифрод без парса конфига. Нам не интересно время если не нужно запрещать проходить чаще чем в сутки - if (typeof sessions[quizId] === "number" && data.settings.cfg.includes('antifraud":true')) { + if (!page && typeof sessions[quizId] === "number" && data.settings.cfg.includes('antifraud":true')) { // unix время. Если меньше суток прошло - выводить ошибку, иначе пустить дальше if (Date.now() - sessions[quizId] < 86400000) { return { data, isRecentlyCompleted: true }; @@ -118,28 +120,60 @@ export async function getData(quizId: string): Promise<{ } } -export async function getQuizData(quizId: string) { +export async function getQuizData(quizId: string, maxRetries = 3): Promise { if (!quizId) throw new Error("No quiz id"); - const response = await getData(quizId); - const quizDataResponse = response.data; + let retryCount = 0; + let lastError: Error | null = null; - if (response.error) { - throw response.error; - } - if (!quizDataResponse) { - throw new Error("Quiz not found"); + while (retryCount < maxRetries) { + try { + const response = await getData(quizId); + const quizDataResponse = response.data; + console.log("ф-я аналитики"); + console.log(response); + + if (response.error) { + throw response.error; + } + if (!quizDataResponse) { + throw new Error("Quiz not found"); + } + + // Проверка на AI result + const hasAiResult = quizDataResponse.items.some( + (item) => item.typ === "result" && quizDataResponse.settings.status === "ai" + ); + + if (hasAiResult && retryCount < maxRetries - 1) { + retryCount++; + continue; // Повторяем запрос + } + + const quizSettings = replaceSpacesToEmptyLines(parseQuizData(quizDataResponse)); + + const res = JSON.parse( + JSON.stringify({ data: quizSettings }) + .replaceAll(/\\" \\"/g, '""') + .replaceAll(/" "/g, '""') + ).data as QuizSettings; + + res.recentlyCompleted = response.isRecentlyCompleted; + return res; + } catch (error) { + lastError = error as Error; + retryCount++; + + if (retryCount >= maxRetries) { + break; + } + + // Добавляем небольшую задержку перед повторным запросом + await new Promise((resolve) => setTimeout(resolve, 1000 * retryCount)); + } } - const quizSettings = replaceSpacesToEmptyLines(parseQuizData(quizDataResponse)); - - const res = JSON.parse( - JSON.stringify({ data: quizSettings }) - .replaceAll(/\\" \\"/g, '""') - .replaceAll(/" "/g, '""') - ).data as QuizSettings; - res.recentlyCompleted = response.isRecentlyCompleted; - return res; + throw lastError || new Error("Failed to get quiz data after retries"); } type SendAnswerProps = { diff --git a/lib/components/QuizAnswerer.tsx b/lib/components/QuizAnswerer.tsx index 451a1b3..c733d39 100644 --- a/lib/components/QuizAnswerer.tsx +++ b/lib/components/QuizAnswerer.tsx @@ -77,12 +77,12 @@ function QuizAnswererInner({ if (error) return ; // if (!data) return ; quizSettings ??= data; - if (!quizSettings) return ; + if (!quizSettings) return ; if (quizSettings.questions.length === 1 && quizSettings?.settings.cfg.noStartPage) - return ; - // if (quizSettings.questions.length === 1) return ; - if (!quizId) return ; + return ; + // if (quizSettings.questions.length === 1) return ; + if (!quizId) return ; const quizContainer = ( { gap: "10px", }} > - {stepNumber !== null && ( + {stepNumber !== null && settings.status !== "ai" && ( Вопрос {stepNumber} из {questionsAmount} diff --git a/lib/components/ViewPublicationPage/ViewPublicationPage.tsx b/lib/components/ViewPublicationPage/ViewPublicationPage.tsx index 6d71ce7..bfa819a 100644 --- a/lib/components/ViewPublicationPage/ViewPublicationPage.tsx +++ b/lib/components/ViewPublicationPage/ViewPublicationPage.tsx @@ -106,7 +106,7 @@ export default function ViewPublicationPage() { } nextButton={ { moveToNextQuestion(); diff --git a/lib/contexts/QuizDataContext.ts b/lib/contexts/QuizDataContext.ts index 95d39fe..a2c3261 100644 --- a/lib/contexts/QuizDataContext.ts +++ b/lib/contexts/QuizDataContext.ts @@ -1,5 +1,6 @@ import { QuizSettings } from "@model/settingsData"; import { createContext, useContext } from "react"; +import { AnyTypedQuizQuestion } from ".."; export const QuizSettingsContext = createContext< | (QuizSettings & { diff --git a/lib/model/api/getQuizData.ts b/lib/model/api/getQuizData.ts index 21f685c..384ef1b 100644 --- a/lib/model/api/getQuizData.ts +++ b/lib/model/api/getQuizData.ts @@ -12,6 +12,7 @@ export interface GetQuizDataResponse { due: number; delay: number; pausable: boolean; + status: "start" | "stop" | "ai"; }; items: { id: number; @@ -49,6 +50,7 @@ export function parseQuizData(quizDataResponse: GetQuizDataResponse): Omit { + setQuestions((prev) => [...prev, question]); + }; + //Когда квиз линейный, не ветвящийся, мы идём по вопросам по их порядковому номеру. Это их page. //За корректность page отвечает конструктор квизов. Интересный факт, если в конструкторе удалить из середины вопрос, то случится куча запросов изменения вопросов с изменением этого page const sortedQuestions = useMemo(() => { @@ -200,7 +210,12 @@ export function useQuestionFlowControl() { }, [prevQuestion]); //рычаг управления из визуала в эту функцию - const moveToNextQuestion = useCallback(() => { + const moveToNextQuestion = useCallback(async () => { + if (isgetting) return; + isgetting = true; + const data = await getQuizData(quizId); + addQuestion(data.questions[0]); + isgetting = false; if (!nextQuestion) throw new Error("Next question not found"); // Засчитываем переход с вопроса дальше @@ -246,7 +261,8 @@ export function useQuestionFlowControl() { return { currentQuestion, - currentQuestionStepNumber: linearQuestionIndex === null ? null : linearQuestionIndex + 1, + currentQuestionStepNumber: + settings.status === "ai" ? null : linearQuestionIndex === null ? null : linearQuestionIndex + 1, nextQuestion, isNextButtonEnabled, isPreviousButtonEnabled,