"use client"; import { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import DarkThemeLayout from "../components/DarkThemeLayout"; import Navbar from "../components/Navbar"; import PointsDisplay from "../components/PointsDisplay"; import TransactionHistory from "../components/TransactionHistory"; import BadgeCard from "../components/BadgeCard"; interface User { id: string; username: string; email: string; points: number; createdAt: string; } interface Badge { id: string; name: string; description: string; icon: string; earnedDate?: string; progress?: number; requirement?: number; } export default function ProfilePage() { const router = useRouter(); const [user, setUser] = useState(null); const [badges, setBadges] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { const token = localStorage.getItem("token"); if (!token) { router.push("/login"); return; } fetchData(); }, [router]); const fetchData = async () => { try { const token = localStorage.getItem("token"); const headers = { Authorization: `Bearer ${token}` }; const [userRes, badgesRes] = await Promise.all([ fetch("/api/users/me", { headers }), fetch("/api/users/me/badges", { headers }) ]); if (!userRes.ok || !badgesRes.ok) { throw new Error("Failed to fetch data"); } const userData = await userRes.json(); const badgesData = await badgesRes.json(); if (userData.success && userData.data) { setUser({ id: userData.data.id, username: userData.data.name, email: userData.data.email, points: userData.data.pointsBalance || 0, createdAt: userData.data.createdAt, }); } if (badgesData.success && badgesData.data) { setBadges(badgesData.data.badges || []); } } catch (error) { console.error("Error fetching data:", error); localStorage.removeItem("token"); router.push("/login"); } finally { setLoading(false); } }; if (loading) { return (
); } if (!user) { return null; } const joinedDate = new Date(user.createdAt).toLocaleDateString("en-US", { year: "numeric", month: "long", day: "numeric" }); const earnedBadges = badges.filter(b => b.earnedDate); const inProgressBadges = badges.filter(b => !b.earnedDate); return ( <>

Profile

Manage your account and view your achievements

{user.username[0].toUpperCase()}

{user.username}

{user.email}

Joined {joinedDate}
User ID {user.id.slice(0, 8)}...

Transaction History

Badges Earned ({earnedBadges.length})

{earnedBadges.length === 0 ? (

No badges earned yet

Complete tasks to earn your first badge!

) : (
{earnedBadges.map(badge => ( ))}
)}
{inProgressBadges.length > 0 && (

Badges In Progress ({inProgressBadges.length})

{inProgressBadges.map(badge => ( ))}
)}
); }