"use client"; import BackgroundWrapper from "@/components/BackgroundWrapper"; import Header from "@/components/Header"; import { Avatar, AvatarFallback } from "@/components/ui/avatar"; import { API_URL, getToken } from "@/lib/auth"; import { BoardData, getLeaderboard } from "@/lib/leaderboard"; import { UserData } from "@/types/auth"; import React, { useEffect, useState } from "react"; const LeaderboardPage = () => { const [boardError, setBoardError] = useState(null); const [boardData, setBoardData] = useState([]); const [userData, setUserData] = useState({ name: "", institution: "", sscRoll: "", hscRoll: "", email: "", phone: "", }); const [loading, setLoading] = useState(true); useEffect(() => { async function fetchUser() { try { const token = await getToken(); if (!token) throw new Error("User is not authenticated"); const response = await fetch(`${API_URL}/me`, { method: "get", headers: { Authorization: `Bearer ${token}` }, }); if (!response.ok) throw new Error("Failed to fetch user data"); const fetchedUserData = await response.json(); setLoading(false); setUserData(fetchedUserData); } catch (error) { console.error(error); setUserData(undefined); } } async function fetchBoardData() { try { const boardResponse = await fetch(`${API_URL}/leaderboard`, { method: "GET", }); if (!boardResponse.ok) { throw new Error("Failed to fetch leaderboard data"); } const fetchedBoardData = await boardResponse.json(); if (Array.isArray(fetchedBoardData) && fetchedBoardData.length > 0) { setBoardData(fetchedBoardData); } else { setBoardError("No leaderboard data available."); setBoardData([]); } } catch (error) { console.error(error); setBoardError("Something went wrong. Please try again."); setBoardData([]); } } fetchUser(); fetchBoardData(); }, []); const getTopThree = (boardData: BoardData[]) => { if (!boardData || !Array.isArray(boardData)) return []; const sortedData = boardData .filter((player) => player?.points !== undefined) // Ensure `points` exists .sort((a, b) => b.points - a.points); const topThree = sortedData.slice(0, 3).map((player, index) => ({ ...player, rank: index + 1, height: index === 0 ? 280 : index === 1 ? 250 : 220, })); return [topThree[1], topThree[0], topThree[2]].filter(Boolean); // Handle missing players }; const getUserData = (boardData: BoardData[], name: string) => { if (!boardData || !Array.isArray(boardData)) return []; const sortedData = boardData .filter((player) => player?.name && player?.points !== undefined) .sort((a, b) => b.points - a.points); const result = sortedData.find((player) => player.name === name); return result ? [{ ...result, rank: sortedData.indexOf(result) + 1 }] : []; }; return (
{getTopThree(boardData).map((student, idx) => student ? (

{student.rank}

{student.name.charAt(0).toUpperCase()}

{student.name}

({student.points}pt)

) : null )}
{getUserData(boardData, userData.name).map((user, idx) => (

{user.rank}

{user.name.charAt(0).toUpperCase()}

You

{user.points}pt

))}
{getLeaderboard(boardData) .slice(0, 10) .map((user, idx) => (

{idx + 1}

{user.name.charAt(0).toUpperCase()}

{user.name.split(" ").slice(0, 2).join(" ")}

{user.points}pt

))}
); }; export default LeaderboardPage;