diff --git a/app/(main)/quiz/page.tsx b/app/(main)/quiz/page.tsx index b59bf61..0d27c99 100644 --- a/app/(main)/quiz/page.tsx +++ b/app/(main)/quiz/page.tsx @@ -1,197 +1,12 @@ -"use client"; +import QuizMainPage from "@/components/quiz/QuizMainPage"; +import React, { Suspense } from "react"; -import { Queries } from "@/api/queries"; -import Loader from "@/components/Loader"; -import QuizQuestionList from "@/components/quiz/QuizQuestionList"; -import QuizSearch from "@/components/quiz/QuizSearch"; -import QuizTable from "@/components/quiz/QuizTable"; -import QuizWinnerTable from "@/components/quiz/QuizWinnerTable"; -import GradientTitle from "@/components/vote/GradientTitle"; -import { IQuizQuestions } from "@/models/quizQuestions.model"; -import QuizProvider from "@/providers/QuizProvider"; -import { useQuizSearchActive, useSteps } from "@/store/store"; -import { Validator } from "@/utils/validator"; -import Image from "next/image"; -import Link from "next/link"; -import { useRouter, useSearchParams } from "next/navigation"; -import { useEffect, useState } from "react"; -import { useMediaQuery } from "usehooks-ts"; - -const page = () => { - const searchParams = useSearchParams(); - const router = useRouter(); - const [quizFinished, setQuizFinished] = useState(false); - const [data, setData] = useState(); - const { active } = useQuizSearchActive(); - const { step, setStep } = useSteps(); - const id = searchParams.get("d"); - - useEffect(() => { - if (id) { - Queries.getQuizByUUID(id).then((res) => { - setData(res); - if (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) { - setStep(res.data.steps[0].tapgyr); - 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) - ); - } - } - }); - } else { - router.push("/quiz/active"); - } - }, []); - - const mobile = useMediaQuery("(max-width: 768px)"); - - if (data) { - if (!data.data) { - return ( -
-
- -
-
- ); - } - - return ( -
- {typeof data !== "string" ? ( -
- -
-
-
-

- {data ? Validator.reveseDate(data?.data.date) : null} -

-

- {data?.data.title} -

-

- {data?.data.description} -

-
- {data?.data.banner ? ( -
- {mobile ? ( - {"banner"} - ) : ( - {"banner"} - )} -
- ) : null} -
- - {data?.data.rules && data.data.notes ? ( - - ) : null} -
- -
- {data.data.has_steps !== 0 && - data.data.steps && - data.data.steps?.length > 0 && ( -
-

- Tapgyr -

-
- {data.data.steps.map((item) => ( - - ))} - - Netije - -
-
- )} - - {data?.data && !active ? ( - - ) : null} - - {data?.data.id && quizFinished && data.data.has_steps === 0 ? ( - - ) : null} - - {data?.data.id && data.data.has_steps === 0 && ( - - )} -
-
-
- ) : ( -
- Непредвиденная ошибка. Нет активной викторины. -
- )} -
- ); - } else { - return ( -
-
- -
-
- ); - } -}; +function page() { + return ( + + + + ); +} export default page; diff --git a/app/(main)/vote/active/page.tsx b/app/(main)/vote/active/page.tsx index 1cac8dc..2d0cc39 100644 --- a/app/(main)/vote/active/page.tsx +++ b/app/(main)/vote/active/page.tsx @@ -1,5 +1,6 @@ -import ParticipantsList from '@/components/vote/ParticipantsList'; -import VoteProvider from '@/providers/VoteProvider'; +import ParticipantsList from "@/components/vote/ParticipantsList"; +import VoteProvider from "@/providers/VoteProvider"; +import { Suspense } from "react"; const page = () => { return ( @@ -7,7 +8,9 @@ const page = () => {
- + + +
diff --git a/app/(main)/vote/page.tsx b/app/(main)/vote/page.tsx index a57ffb6..0c6c408 100644 --- a/app/(main)/vote/page.tsx +++ b/app/(main)/vote/page.tsx @@ -1,5 +1,7 @@ +"use client"; import ParticipantsList from "@/components/vote/ParticipantsList"; import VoteProvider from "@/providers/VoteProvider"; +import { Suspense } from "react"; const page = () => { return ( @@ -7,7 +9,9 @@ const page = () => {
- + + +
@@ -15,4 +19,4 @@ const page = () => { ); }; -export default page; \ No newline at end of file +export default page; diff --git a/components/quiz/QuizMainPage.tsx b/components/quiz/QuizMainPage.tsx new file mode 100644 index 0000000..37f23bf --- /dev/null +++ b/components/quiz/QuizMainPage.tsx @@ -0,0 +1,197 @@ +"use client"; + +import { Queries } from "@/api/queries"; +import Loader from "@/components/Loader"; +import QuizQuestionList from "@/components/quiz/QuizQuestionList"; +import QuizSearch from "@/components/quiz/QuizSearch"; +import QuizTable from "@/components/quiz/QuizTable"; +import QuizWinnerTable from "@/components/quiz/QuizWinnerTable"; +import GradientTitle from "@/components/vote/GradientTitle"; +import { IQuizQuestions } from "@/models/quizQuestions.model"; +import QuizProvider from "@/providers/QuizProvider"; +import { useQuizSearchActive, useSteps } from "@/store/store"; +import { Validator } from "@/utils/validator"; +import Image from "next/image"; +import Link from "next/link"; +import { useRouter, useSearchParams } from "next/navigation"; +import { useEffect, useState } from "react"; +import { useMediaQuery } from "usehooks-ts"; + +const QuizMainPage = () => { + const searchParams = useSearchParams(); + const router = useRouter(); + const [quizFinished, setQuizFinished] = useState(false); + const [data, setData] = useState(); + const { active } = useQuizSearchActive(); + const { step, setStep } = useSteps(); + const id = searchParams.get("d"); + + useEffect(() => { + if (id) { + Queries.getQuizByUUID(id).then((res) => { + setData(res); + if (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) { + setStep(res.data.steps[0].tapgyr); + 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) + ); + } + } + }); + } else { + router.push("/quiz/active"); + } + }, []); + + const mobile = useMediaQuery("(max-width: 768px)"); + + if (data) { + if (!data.data) { + return ( +
+
+ +
+
+ ); + } + + return ( +
+ {typeof data !== "string" ? ( +
+ +
+
+
+

+ {data ? Validator.reveseDate(data?.data.date) : null} +

+

+ {data?.data.title} +

+

+ {data?.data.description} +

+
+ {data?.data.banner ? ( +
+ {mobile ? ( + {"banner"} + ) : ( + {"banner"} + )} +
+ ) : null} +
+ + {data?.data.rules && data.data.notes ? ( + + ) : null} +
+ +
+ {data.data.has_steps !== 0 && + data.data.steps && + data.data.steps?.length > 0 && ( +
+

+ Tapgyr +

+
+ {data.data.steps.map((item) => ( + + ))} + + Netije + +
+
+ )} + + {data?.data && !active ? ( + + ) : null} + + {data?.data.id && quizFinished && data.data.has_steps === 0 ? ( + + ) : null} + + {data?.data.id && data.data.has_steps === 0 && ( + + )} +
+
+
+ ) : ( +
+ Непредвиденная ошибка. Нет активной викторины. +
+ )} +
+ ); + } else { + return ( +
+
+ +
+
+ ); + } +}; + +export default QuizMainPage; diff --git a/components/vote/ParticipantsList.tsx b/components/vote/ParticipantsList.tsx index 3efabac..d8ce53e 100644 --- a/components/vote/ParticipantsList.tsx +++ b/components/vote/ParticipantsList.tsx @@ -17,6 +17,7 @@ import { useRouter, useSearchParams } from "next/navigation"; interface IParams { vote_id?: string; + all?: boolean; } interface ISocketMessage { @@ -27,7 +28,7 @@ interface ISocketMessage { date: string; } -const ParticipantsList = ({ vote_id }: IParams) => { +const ParticipantsList = ({ vote_id, all }: IParams) => { const searchParams = useSearchParams(); const router = useRouter(); const [data, setData] = useState(); @@ -65,7 +66,16 @@ const ParticipantsList = ({ vote_id }: IParams) => { setVoteStatus(res.data.status); setSmsNumber(res.data.sms_number); }); - } else { + } else if (all) { + Queries.getAllVotes().then((res) => { + setData(res); + setParticipantsData([...res.data.voting_items]); + setVoteDescription(res.data.description); + setVoteStatus(res.data.status); + setSmsNumber(res.data.sms_number); + }); + } + { router.push("/vote/active"); }