{data && !quizSearchData ? (
diff --git a/components/quiz/QuizWinnerTable.tsx b/components/quiz/QuizWinnerTable.tsx
index 6ed34c1..aaff457 100644
--- a/components/quiz/QuizWinnerTable.tsx
+++ b/components/quiz/QuizWinnerTable.tsx
@@ -2,38 +2,192 @@
import { Queries } from '@/api/queries';
import { v4 } from 'uuid';
-import { useState, useEffect, useContext } from 'react';
+import { useState, useEffect, useContext, Dispatch, SetStateAction } from 'react';
import { IQuizQuestionsWinners } from '@/models/quizQuestionsWinners.model';
import QuizContext from '@/context/QuizContext';
+import { IQuizQuestions } from '@/models/quizQuestions.model';
+
+interface Message {
+ answer: string;
+ score: number;
+ date: string;
+ serial_number: number;
+ serial_number_for_correct: number;
+ starred_src: string;
+ quiz_id: number;
+ question_id: number;
+}
+
+interface Winner {
+ total_score_of_client: string;
+ correct_answers_time: string;
+ client_id: number;
+ client: {
+ id: number;
+ phone: string;
+ answers: {
+ id: number;
+ question_id: number;
+ score: number;
+ serial_number_for_correct: number;
+ client_id: number;
+ }[];
+ };
+}
interface IProps {
quizId: number;
quizFinished: boolean;
+ smsNumber: string;
}
-const QuizWinnerTable = ({ quizId, quizFinished }: IProps) => {
+const QuizWinnerTable = ({ quizId, quizFinished, smsNumber }: IProps) => {
// const [questionsData, setQuestionsData] = useState
();
const [winnersData, setWinnersData] = useState();
const { questionsData } = useContext(QuizContext).quizQuestionsContext;
- useEffect(() => {
- if (quizFinished) {
- // Queries.getQuizQuestions().then((res) => {
- // setQuestionsData(res);
- // });
- Queries.getQuizWinners(quizId).then((res) => {
- setWinnersData(res);
- });
- }
- }, []);
- // const { data, error, isFetching } = useQuery({
- // queryKey: ['quiz_questions_winners'],
- // queryFn: () => Queries.getQuizWinners(quizId),
- // keepPreviousData: true,
- // });
+ console.log('Questions:', questionsData);
- // if (isFetching) return ;
- // if (error) return {JSON.stringify(error)}
;
+ const [socket, setSocket] = useState(null);
+ const [isConnected, setIsConnected] = useState(false);
+
+ useEffect(() => {
+ Queries.getQuizWinners(quizId).then((res) => {
+ setWinnersData(res);
+ console.log(res);
+ });
+ }, [quizId]);
+
+ useEffect(() => {
+ let socket: WebSocket | null = null;
+ let reconnectTimeout: NodeJS.Timeout | null = null;
+ let pingInterval: NodeJS.Timeout | null = null;
+
+ const connectWebSocket = () => {
+ try {
+ socket = new WebSocket(`wss://sms.turkmentv.gov.tm/ws/quiz?dst=${smsNumber}`);
+ setSocket(socket);
+
+ socket.onopen = () => {
+ console.log('WebSocket is connected');
+ setIsConnected(true);
+
+ pingInterval = setInterval(() => {
+ if (socket?.readyState === WebSocket.OPEN) {
+ try {
+ socket.send(JSON.stringify({ type: 'ping' }));
+ } catch (error) {
+ console.error('Error sending ping:', error);
+ }
+ }
+ }, 25000); // Ping every 25 seconds
+ };
+
+ socket.onmessage = (event) => {
+ try {
+ console.log('Message received from WebSocket:', event.data);
+ const message = JSON.parse(event.data);
+ handleOnMessage(message);
+ } catch (error) {
+ console.error('Error processing message:', error);
+ }
+ };
+
+ socket.onerror = (error) => {
+ console.error('WebSocket error:', error);
+ };
+
+ socket.onclose = () => {
+ console.log('WebSocket is closed');
+ setIsConnected(false);
+
+ if (pingInterval) {
+ clearInterval(pingInterval);
+ }
+
+ if (!reconnectTimeout) {
+ reconnectTimeout = setTimeout(() => {
+ console.log('Attempting to reconnect WebSocket...');
+ connectWebSocket();
+ }, 5000); // Reconnect after 5 seconds
+ }
+ };
+ } catch (error) {
+ console.error('WebSocket connection error:', error);
+ }
+ };
+
+ if (smsNumber && winnersData) {
+ connectWebSocket();
+ }
+
+ return () => {
+ if (socket) {
+ socket.close();
+ }
+ if (reconnectTimeout) {
+ clearTimeout(reconnectTimeout);
+ }
+ if (pingInterval) {
+ clearInterval(pingInterval);
+ }
+ };
+ }, [smsNumber]);
+
+ // Function to handle incoming WebSocket message and update winnersData
+ const handleOnMessage = (message: Message) => {
+ if (!winnersData) {
+ console.error('winnersData is undefined');
+ return;
+ }
+
+ console.log('updating winnersData');
+
+ // Update the winnersData by matching phone with starred_src from the message
+ setWinnersData((prevWinnersData) => {
+ if (!prevWinnersData) {
+ return prevWinnersData;
+ }
+
+ return {
+ ...prevWinnersData,
+ data: prevWinnersData.data.map((winner) => {
+ if (winner.client.phone === message.starred_src) {
+ const updatedAnswers = [
+ ...winner.client.answers,
+ {
+ id: message.question_id,
+ question_id: message.question_id,
+ score: message.score,
+ serial_number_for_correct: message.serial_number_for_correct,
+ client_id: winner.client.id,
+ },
+ ];
+
+ // Calculate the new correct_answers_time by summing serial_number_for_correct
+ const updatedCorrectAnswersTime = updatedAnswers
+ .reduce((sum, answer) => sum + answer.serial_number_for_correct, 0)
+ .toString();
+
+ return {
+ ...winner,
+ client: {
+ ...winner.client,
+ answers: updatedAnswers,
+ },
+ total_score_of_client: (
+ parseInt(winner.total_score_of_client) + message.score
+ ).toString(),
+ correct_answers_time: updatedCorrectAnswersTime, // Update correct_answers_time
+ };
+ }
+ return winner;
+ }),
+ };
+ });
+
+ console.log('winnersData is updated');
+ };
return winnersData?.data.length !== 0 ? (
@@ -41,7 +195,10 @@ const QuizWinnerTable = ({ quizId, quizFinished }: IProps) => {
Bäsleşigiň jemi
+
+ {/* Desktop table */}
+ {/* Table Head */}
{winnersData?.data[0].client_id ? (
@@ -73,6 +230,7 @@ const QuizWinnerTable = ({ quizId, quizFinished }: IProps) => {
) : null}
+ {/* Table Body */}
{winnersData?.data.map((winner, id) => (
{
{questionsData
? questionsData.map((question) => {
const matchingAnswer = winner.client.answers.find(
- (answer) => answer.question_id === question.id,
+ (answer) => answer.question_id === question.id && answer.score !== 0,
);
+
return (
{
+ {/* Mobile table */}
+ {/* Table Head */}
{winnersData?.data[0].client_id ? (
@@ -163,6 +324,7 @@ const QuizWinnerTable = ({ quizId, quizFinished }: IProps) => {
) : null}
+ {/* Table Body */}
{winnersData?.data.map((winner, id) => (
{
+
+ {/* Rules block */}
Belgileriň düşündirilişi
diff --git a/models/quizQuestions.model.ts b/models/quizQuestions.model.ts
index 5f40cd6..467f40d 100644
--- a/models/quizQuestions.model.ts
+++ b/models/quizQuestions.model.ts
@@ -8,6 +8,7 @@ export interface Data {
title: string;
date: string;
banner: string;
+ sms_number: string;
banner_mobile: string;
description: string;
rules: Note[];