turkmentv_front/components/quiz/QuizQuestionList.tsx

121 lines
4.1 KiB
TypeScript
Raw Normal View History

2025-03-07 10:18:56 +00:00
"use client";
import QuizQuestion from "./QuizQuestion";
import { Queries } from "@/api/queries";
import { v4 } from "uuid";
import { Dispatch, useContext, useEffect, useState } from "react";
import { IQuizQuestions, Question } from "@/models/quizQuestions.model";
import QuizContext from "@/context/QuizContext";
import { useSteps } from "@/store/store";
2024-08-19 12:44:56 +00:00
interface IProps {
setQuizFinished: Dispatch<boolean>;
quizFinished: boolean;
initialQuestionsData: IQuizQuestions;
2024-09-10 12:35:21 +00:00
paramsId?: string;
2024-08-19 12:44:56 +00:00
}
const QuizQuestionList = ({
setQuizFinished,
quizFinished,
initialQuestionsData,
2024-09-10 12:35:21 +00:00
paramsId,
2024-08-19 12:44:56 +00:00
}: IProps) => {
const { quizSearchData } = useContext(QuizContext).quizSearchContext;
2025-03-07 10:18:56 +00:00
const { step } = useSteps();
const [questionData, setQuestionsData] = useState<Question[] | undefined>(
initialQuestionsData.data.questions
? initialQuestionsData.data.questions
: initialQuestionsData.data.steps
? initialQuestionsData.data.steps[0].questions
: []
);
2024-08-19 12:44:56 +00:00
useEffect(() => {
2024-09-10 12:35:21 +00:00
if (paramsId && !quizFinished) {
const interval = setInterval(() => {
Queries.getQuiz(paramsId).then((res) => {
2025-03-07 10:18:56 +00:00
if (res.data.questions) {
setQuestionsData(res.data.questions);
res.data.questions.map((question) =>
question.status === "active" || question.status === "new"
? setQuizFinished(false)
: setQuizFinished(true)
);
} else if (res.data.steps && res.data.steps?.length > 0) {
setQuestionsData(res.data.steps[0].questions);
for (let i = 0; i < res.data.steps.length; i++) {
res.data.steps[i].questions.map((question) =>
question.status === "active" || question.status === "new"
? setQuizFinished(false)
: setQuizFinished(true)
);
}
}
2024-09-10 12:35:21 +00:00
});
}, 60000);
return () => clearInterval(interval);
}
2024-09-10 12:35:21 +00:00
if (!paramsId && !quizFinished) {
const interval = setInterval(() => {
Queries.getQuizQuestions().then((res) => {
2025-03-07 10:18:56 +00:00
if (res.data.questions) {
setQuestionsData(res.data.questions);
res.data.questions.map((question) =>
question.status === "active" || question.status === "new"
? setQuizFinished(false)
: setQuizFinished(true)
);
} else if (res.data.steps && res.data.steps?.length > 0) {
setQuestionsData(res.data.steps[0].questions);
for (let i = 0; i < res.data.steps.length; i++) {
res.data.steps[i].questions.map((question) =>
question.status === "active" || question.status === "new"
? setQuizFinished(false)
: setQuizFinished(true)
);
}
}
2024-09-10 12:35:21 +00:00
});
}, 60000);
return () => clearInterval(interval);
2024-08-19 12:44:56 +00:00
}
}, [quizFinished]);
2025-03-07 10:18:56 +00:00
useEffect(() => {
if (initialQuestionsData.data.steps) {
const tapgyrQuestions = initialQuestionsData.data.steps.find(
(item) => item.tapgyr === step
);
setQuestionsData(tapgyrQuestions?.questions);
}
}, [step]);
2024-08-19 12:44:56 +00:00
return (
<div className="flex flex-col gap-[40px] md:gap-[160px]">
2025-03-07 10:18:56 +00:00
{quizSearchData && Object.values(quizSearchData.data).length === 0 ? (
2024-08-19 12:44:56 +00:00
<h2 className="text-textDarkt text-center text-[28px] ms:text-[32px] flex items-center justify-center bg-fillBGBlockbg px-[20px] py-[40px] md:px-[40px] md:py-[80px] rounded-[24px]">
Вы не участвовали ни в одном вопросе
</h2>
2025-03-07 10:18:56 +00:00
) : questionData ? (
questionData.map((question, id) =>
question.status !== "new" ? (
2024-08-19 12:44:56 +00:00
<QuizQuestion
score={question.score}
questionId={question.id}
questionNumber={id}
finished={question.status}
question={question.question}
key={v4()}
startsAt={question.starts_at}
endsAt={question.ends_at}
/>
2025-03-07 10:18:56 +00:00
) : null
2024-08-19 12:44:56 +00:00
)
) : null}
</div>
);
};
export default QuizQuestionList;