"use client" import { useEffect, useState } from "react" import { getApiUrl } from "@/lib/api-config" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import Link from "next/link" import { Star, Trophy, Users, MapPin, Music } from "lucide-react" interface TopShow { show: { id: number date: string venue_id: number } avg_score: number review_count: number } interface TopVenue { venue: { id: number name: string city: string state: string } avg_score: number review_count: number } interface ActiveUser { profile: { id: number username: string display_name: string } review_count: number } export default function LeaderboardsPage() { const [topShows, setTopShows] = useState([]) const [topVenues, setTopVenues] = useState([]) const [activeUsers, setActiveUsers] = useState([]) const [loading, setLoading] = useState(true) useEffect(() => { const fetchData = async () => { try { const [showsRes, venuesRes, usersRes] = await Promise.all([ fetch(`${getApiUrl()}/leaderboards/shows/top`), fetch(`${getApiUrl()}/leaderboards/venues/top`), fetch(`${getApiUrl()}/leaderboards/users/active`) ]) setTopShows(await showsRes.json()) setTopVenues(await venuesRes.json()) setActiveUsers(await usersRes.json()) } catch (error) { console.error("Failed to fetch leaderboards:", error) } finally { setLoading(false) } } fetchData() }, []) if (loading) return
Loading leaderboards...
return (

Leaderboards

Top rated shows, venues, and our most active community members.

{/* Top Shows */} Top Rated Shows
{topShows.map((item, i) => (
{i + 1} {new Date(item.show.date).toLocaleDateString()}
{item.avg_score} ({item.review_count})
))}
{/* Top Venues */} Top Venues
{topVenues.map((item, i) => (
{i + 1} {item.venue.name}
{item.avg_score} ({item.review_count})
))}
{/* Active Users */} Most Active Fans
{activeUsers.map((item, i) => (
{i + 1} {item.profile.display_name || item.profile.username}
{item.review_count} reviews
))}
) }