From d8c7ee4838aff2d16cd82d65ae6d57d779bce04d Mon Sep 17 00:00:00 2001 From: Bahugunajii Date: Tue, 2 Apr 2024 01:54:40 +0530 Subject: [PATCH 1/3] fetch quiz from dbservice --- api/afdb/session.ts | 10 +++++----- app/page.tsx | 48 +++++++++++++++++++++++++++++++-------------- utils/dateUtils.ts | 23 +++++++++++++++++++--- 3 files changed, 58 insertions(+), 23 deletions(-) diff --git a/api/afdb/session.ts b/api/afdb/session.ts index 7f4e242..8231f6a 100644 --- a/api/afdb/session.ts +++ b/api/afdb/session.ts @@ -85,12 +85,12 @@ export const getSessionSchedule = async (sessionId: number, batchId?: number) => } }; -export const getGroup = async (groupId: number) => { +export const getGroup = async (groupId?: number, childId?: number) => { try { - const queryParams = new URLSearchParams({ - id: groupId.toString(), - type: "batch" - }); + const queryParams = new URLSearchParams(); + if (groupId !== undefined) queryParams.append('id', groupId.toString()); + if (childId !== undefined) queryParams.append('child_id', childId.toString()); + queryParams.append('type', "batch") const urlWithParams = `${url}/group?${queryParams.toString()}`; const response = await fetch(urlWithParams, getFetchConfig(bearerToken)); diff --git a/app/page.tsx b/app/page.tsx index 70b2016..e0c7c53 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -3,13 +3,13 @@ import { useAuth } from "@/services/AuthContext"; import TopBar from "@/components/TopBar"; import BottomNavigationBar from "@/components/BottomNavigationBar"; -import { getGroupUser, getGroupSessions, getGroup, getQuizBatchData, getSessionSchedule } from "@/api/afdb/session"; +import { getGroupUser, getGroupSessions, getGroup, getSessions, getSessionSchedule } from "@/api/afdb/session"; import { useState, useEffect } from "react"; import { GroupUser, GroupSession, QuizSession, SessionSchedule, MessageDisplayProps } from "./types"; import Link from "next/link"; import PrimaryButton from "@/components/Button"; import Loading from "./loading"; -import { formatCurrentTime, formatSessionTime, formatQuizSessionTime, formatTime, isSessionActive } from "@/utils/dateUtils"; +import { formatCurrentTime, formatSessionTime, formatQuizSessionTime, formatTime, isSessionActive, format12HrQuizSessionTime } from "@/utils/dateUtils"; import { generateQuizLinks } from "@/utils/quizUtils"; import { api } from "@/services/url"; import { MixpanelTracking } from "@/services/mixpanel"; @@ -36,6 +36,10 @@ export default function Home() { const quizIds = group.map((quiz: any) => quiz.child_id.parent_id) + const quizGroup = await getGroup(undefined, quizIds[0]); + + const quizGroupIds = quizGroup.map((quizGroup: any) => quizGroup.id); + const batchId = group.map((groupData: any) => groupData.child_id.id) setBatchId(batchId[0]) @@ -43,15 +47,29 @@ export default function Home() { return await getGroupSessions(groupId); })); - const quizData = await Promise.all(quizIds.map(async (quizId: number) => { - return await getQuizBatchData(quizId); + const quizGroupSessionData = await Promise.all(quizGroupIds.map(async (quizGroupId: number) => { + return await getGroupSessions(quizGroupId); })); + const flattenedQuizGroupSessions = quizGroupSessionData.flat(); + + const sessionsData = await Promise.all(flattenedQuizGroupSessions.map(async (groupSession: GroupSession) => { + const sessionData = await getSessions(groupSession.session_id); + if (!sessionData) { + return null; + } + const isActive = sessionData.is_active; + const repeatSchedule = sessionData.repeat_schedule; + + if (isActive && repeatSchedule && repeatSchedule.type === 'weekly' && repeatSchedule.params.includes(currentDay)) { + return sessionData; + } + return null; + })); + const filteredSessions = sessionsData.filter(session => session !== null); + const quizzesData = filteredSessions.filter((session: any) => session.platform === 'quiz'); const flattenedGroupSessions = groupSessionData.flat(); - const flattenedQuizData = quizData.flat(); - const quizzesData = await generateQuizLinks(flattenedQuizData); setQuizzes(quizzesData); - return flattenedGroupSessions; })); @@ -110,10 +128,10 @@ export default function Home() { ); } } - else if (data.redirectPlatform === 'quiz') { - if (minutesUntilSessionStart <= 5 && sessionEndTime.getTime() > currentTimeObj.getTime()) { + else if (data.platform === 'quiz') { + if (minutesUntilSessionStart <= 5 && hasSessionNotEnded) { return ( - + START @@ -122,7 +140,7 @@ export default function Home() { return (

Starts at
- {formatTime(sessionStartTimeStr)} + {format12HrQuizSessionTime(data.start_time)}

); } @@ -200,14 +218,14 @@ export default function Home() {

Tests

{quizzes.length > 0 ? (
- {quizzes.map((data, index) => (isSessionActive(formatSessionTime(data.end_time)) && + {quizzes.map((data, index) => (isSessionActive(formatQuizSessionTime(data.end_time)) &&

- {formatQuizSessionTime(data.start_time)} + {format12HrQuizSessionTime(data.start_time)}

- {formatQuizSessionTime(data.end_time)} + {format12HrQuizSessionTime(data.end_time)}

@@ -224,7 +242,7 @@ export default function Home() {
))} - {quizzes.filter((data) => isSessionActive(formatSessionTime(data.end_time))).length === 0 && ( + {quizzes.filter((data) => isSessionActive(formatQuizSessionTime(data.end_time))).length === 0 && ( )}
) : ( diff --git a/utils/dateUtils.ts b/utils/dateUtils.ts index 83e35cf..3d03aef 100644 --- a/utils/dateUtils.ts +++ b/utils/dateUtils.ts @@ -13,6 +13,9 @@ export function formatSessionTime(dateTimeStr: string) { } date = new Date(2000, 0, 1, hours, minutes); + } else if (dateTimeStr.includes('T') && dateTimeStr.includes('Z')) { + const isoDate = new Date(dateTimeStr); + date = new Date(2000, 0, 1, isoDate.getUTCHours(), isoDate.getUTCMinutes()); } else { const [hours, minutes, seconds] = dateTimeStr.split(':').map(Number); date = new Date(2000, 0, 1, hours, minutes, seconds); @@ -29,9 +32,12 @@ export function formatCurrentTime(dateTimeStr: string) { return `${hours}:${minutes}`; } -export function formatQuizSessionTime(dateTimeStr: string) { - const time = new Date(`01/01/2000 ${dateTimeStr}`); - return time.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' }); +export function formatQuizSessionTime(dateTimeString: string): string { + const dateTime = new Date(dateTimeString); + const hours = dateTime.getUTCHours().toString().padStart(2, '0'); + const minutes = dateTime.getUTCMinutes().toString().padStart(2, '0'); + const time = hours + ':' + minutes; + return time; } export function formatTime(dateTimeStr: string) { @@ -39,6 +45,17 @@ export function formatTime(dateTimeStr: string) { return time.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit', hour12: true }); } +export function format12HrQuizSessionTime(time: string): string { + const isoDate = new Date(time); + const hours = isoDate.getUTCHours(); + const minutes = isoDate.getUTCMinutes(); + const period = hours >= 12 ? 'PM' : 'AM'; + let formattedHours = hours % 12; + formattedHours = formattedHours ? formattedHours : 12; + const formattedMinutes = String(minutes).padStart(2, '0'); + return `${formattedHours}:${formattedMinutes} ${period}`; +} + export function isSessionActive(endTime: string): boolean { const currentTime = new Date(); const currentTimeStr = formatCurrentTime(currentTime.toISOString()); From 5e81bec340bdec0a7ff87d186b99749471923307 Mon Sep 17 00:00:00 2001 From: Bahugunajii Date: Tue, 2 Apr 2024 01:57:06 +0530 Subject: [PATCH 2/3] optimizations --- app/page.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/page.tsx b/app/page.tsx index e0c7c53..4bde499 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -10,7 +10,6 @@ import Link from "next/link"; import PrimaryButton from "@/components/Button"; import Loading from "./loading"; import { formatCurrentTime, formatSessionTime, formatQuizSessionTime, formatTime, isSessionActive, format12HrQuizSessionTime } from "@/utils/dateUtils"; -import { generateQuizLinks } from "@/utils/quizUtils"; import { api } from "@/services/url"; import { MixpanelTracking } from "@/services/mixpanel"; @@ -34,9 +33,9 @@ export default function Home() { const groupIds = group.map((type: any) => type.id); - const quizIds = group.map((quiz: any) => quiz.child_id.parent_id) + const quizId = group.map((quiz: any) => quiz.child_id.parent_id) - const quizGroup = await getGroup(undefined, quizIds[0]); + const quizGroup = await getGroup(undefined, quizId[0]); const quizGroupIds = quizGroup.map((quizGroup: any) => quizGroup.id); From 280a6ea544175502566e112c9e7875d78423bf37 Mon Sep 17 00:00:00 2001 From: Bahugunajii Date: Tue, 2 Apr 2024 02:23:21 +0530 Subject: [PATCH 3/3] removed quizUtils file --- utils/quizUtils.tsx | 53 --------------------------------------------- 1 file changed, 53 deletions(-) delete mode 100644 utils/quizUtils.tsx diff --git a/utils/quizUtils.tsx b/utils/quizUtils.tsx deleted file mode 100644 index 273d9a4..0000000 --- a/utils/quizUtils.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { collection, query, where, getDocs } from "firebase/firestore"; -import { db } from "@/app/firebaseConfig"; -import { QuizSession } from "@/app/types"; - -export const generateQuizLinks = async (batchData: any): Promise => { - try { - const sessionsCollection = collection(db, "Sessions"); - - const quizObjectsArray = await Promise.all(batchData.map(async (batchItem: any) => { - const batchId = batchItem.batch_id; - - const batchQuery = query(sessionsCollection, where("batch", "==", batchId)); - const querySnapshot = await getDocs(batchQuery); - const sessionsDataArray = querySnapshot.docs.map((doc) => doc.data()); - - const today = new Date().toISOString().split("T")[0]; - - const quizSessionObject = sessionsDataArray - .filter((sessionData: any) => today >= sessionData.startDate && today <= sessionData.endDate) - .map((sessionData: any) => { - const redirectParams = sessionData.redirectPlatformParams; - if (redirectParams && redirectParams.id) { - return { - batch: sessionData.batch, - end_date: sessionData.endDate, - end_time: sessionData.endTime, - redirectPlatformParams: { - id: redirectParams.id, - }, - start_date: sessionData.startDate, - start_time: sessionData.startTime, - redirectPlatform: sessionData.redirectPlatform, - name: sessionData.name, - stream: sessionData.stream, - id: sessionData.id, - testFormat: sessionData.testFormat - }; - } - return null; - }) - .filter((quizSessionObject) => quizSessionObject !== null) as QuizSession[]; - - return quizSessionObject; - })); - - const flattenedQuizObjectsArray = quizObjectsArray.flat(); - - return flattenedQuizObjectsArray; - } catch (error) { - console.error("Error fetching quiz data from Firestore:", error); - throw error; - } -}; \ No newline at end of file