"use client" import { useEffect, useState } from "react" import { Button } from "@/components/ui/button" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Trophy, Calendar, Settings, User, Edit } from "lucide-react" import Link from "next/link" import { BadgeList } from "@/components/profile/badge-list" import { getApiUrl } from "@/lib/api-config" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { UserAttendanceList } from "@/components/profile/user-attendance-list" import { UserReviewsList } from "@/components/profile/user-reviews-list" import { UserGroupsList } from "@/components/profile/user-groups-list" import { ChaseSongsList } from "@/components/profile/chase-songs-list" import { AttendanceSummary } from "@/components/profile/attendance-summary" import { LevelProgressCard } from "@/components/gamification/level-progress" import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" import { motion } from "framer-motion" // Types interface UserProfile { id: number email: string username: string avatar: string | null bio: string | null created_at: string } interface UserBadge { id: number badge: { id: number name: string description: string icon: string slug: string } awarded_at: string } export default function ProfilePage() { const [user, setUser] = useState(null) const [badges, setBadges] = useState([]) const [loading, setLoading] = useState(true) const [stats, setStats] = useState({ attendance_count: 0, review_count: 0, group_count: 0 }) useEffect(() => { const token = localStorage.getItem("token") if (!token) { setLoading(false) return } // Fetch User Data fetch(`${getApiUrl()}/auth/users/me`, { headers: { Authorization: `Bearer ${token}` } }) .then(res => { if (res.ok) return res.json() throw new Error("Failed to fetch user") }) .then(data => { setUser(data) // Fetch Badges fetch(`${getApiUrl()}/badges/me`, { headers: { Authorization: `Bearer ${token}` } }) .then(res => res.ok ? res.json() : []) .then(data => setBadges(data)) // Fetch Stats fetch(`${getApiUrl()}/users/${data.id}/stats`, { headers: { Authorization: `Bearer ${token}` } }) .then(res => res.ok ? res.json() : { attendance_count: 0, review_count: 0, group_count: 0 }) .then((statsData: { attendance_count: number; review_count: number; group_count: number }) => setStats(statsData)) }) .catch(err => console.error(err)) .finally(() => setLoading(false)) }, []) if (loading) { return
Loading profile...
} if (!user) { return (

Please Log In

You need to be logged in to view your dashboard.

) } // Transform badges for the list component const displayBadges = badges.map(b => b.badge) const displayName = user.username || user.email.split('@')[0] return (
{/* Header Section */}

{displayName}

{/* Optional: display role badge */}

Member since {new Date(user.created_at || Date.now()).toLocaleDateString()}

{user.bio ? (

{user.bio}

) : ( + Add a bio to your profile )}
{stats.attendance_count} Shows
{stats.review_count} Reviews
{stats.group_count} Groups
Overview My Shows Reviews Communities {/* Level Progress */} {/* Attendance Summary */} {/* Chase Songs */} Achievements {displayBadges.length === 0 && (

No badges earned yet. Keep active!

)}
) }