diff --git a/shpe-app-web/app/(main)/tools/shirt-tracker/page.tsx b/shpe-app-web/app/(main)/tools/shirt-tracker/page.tsx index 9777c215..37dc32cf 100644 --- a/shpe-app-web/app/(main)/tools/shirt-tracker/page.tsx +++ b/shpe-app-web/app/(main)/tools/shirt-tracker/page.tsx @@ -3,7 +3,7 @@ import { useEffect, useState } from 'react'; import { useRouter } from 'next/navigation'; import { onAuthStateChanged } from 'firebase/auth'; import { db, auth } from '@/config/firebaseConfig'; -import { getMembers, getShirtsToVerify } from '@/api/firebaseUtils'; +import { getMembers, getShirtsToVerify, getUser } from '@/api/firebaseUtils'; import { PublicUserInfo, User } from '@/types/user'; import { SHPEEventLog } from '@/types/events'; import { doc, updateDoc, Timestamp } from 'firebase/firestore'; @@ -15,41 +15,45 @@ const ShirtTracker = () => { const [loading, setLoading] = useState(true); const [members, setMembers] = useState([]); const [shirtList, setShirtList] = useState([]); + const fetchShirts = async () => { const shirts = await getShirtsToVerify(); - const updatedShirtList: ShirtWithMember[] = shirts.map((shirt) => { - const shirtUid = shirt.uid?.trim().toLowerCase(); - const matchedMember = members.find((member) => - member.publicInfo?.uid?.trim().toLowerCase() === shirtUid - ); - - const email = matchedMember?.publicInfo?.email?.trim() - ? matchedMember.publicInfo.email - : matchedMember?.private?.privateInfo?.email || 'N/A'; - - const isOfficialMember = matchedMember - ? isMemberVerified( - matchedMember.publicInfo?.chapterExpiration, - matchedMember.publicInfo?.nationalExpiration - ) - ? 'Yes' - : 'No' - : 'No'; - - if (!matchedMember || !matchedMember.publicInfo?.name) { - console.log(`Shirt UID: ${shirt.uid}`); - console.log('Matched Member:', matchedMember); - console.log(`Name is missing for UID: ${shirt.uid}`); - } - - return { - ...shirt, - name: matchedMember?.publicInfo?.name || 'N/A', - email, - isOfficialMember, - shirtPickedUp: shirt.shirtPickedUp ?? false, - }; - }); + const updatedShirtList: ShirtWithMember[] = await Promise.all( + shirts.map(async (shirt) => { + const shirtUid = shirt.uid?.trim().toLowerCase(); + let matchedMember = members.find((member) => + member.publicInfo?.uid?.trim().toLowerCase() === shirtUid + ); + + // If not found, fetch the member data manually using getUser + if (!matchedMember) { + console.log(`Member not found locally for UID: ${shirt.uid}, fetching full user data from database...`); + matchedMember = await getUser(shirt.uid); + } + + const email = matchedMember?.publicInfo?.email?.trim() + ? matchedMember.publicInfo.email + : matchedMember?.private?.privateInfo?.email || 'N/A'; + + const isOfficialMember = matchedMember + ? isMemberVerified( + matchedMember.publicInfo?.chapterExpiration, + matchedMember.publicInfo?.nationalExpiration + ) + ? 'Yes' + : 'No' + : 'No'; + + + return { + ...shirt, + name: matchedMember?.publicInfo?.name || 'N/A', + email, + isOfficialMember, + shirtPickedUp: shirt.shirtPickedUp ?? false, + }; + }) + ); updatedShirtList.sort( (a, b) => a.shirtUploadDate.toDate().getTime() - b.shirtUploadDate.toDate().getTime() diff --git a/shpe-app-web/app/api/firebaseUtils.ts b/shpe-app-web/app/api/firebaseUtils.ts index d20e0a9b..f5e56b33 100644 --- a/shpe-app-web/app/api/firebaseUtils.ts +++ b/shpe-app-web/app/api/firebaseUtils.ts @@ -304,3 +304,28 @@ export const getPrivateUserData = async (uid: string = ""): Promise => { + if (!auth.currentUser?.uid) { + throw new Error("Authentication Error", { cause: "User uid is undefined" }); + } + const publicData = await getPublicUserData(uid); + const privateData = await getPrivateUserData(uid); + if (publicData == undefined) { + return undefined; + } + else { + return { + publicInfo: publicData, + private: { + privateInfo: privateData, + }, + }; + } +}; +