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

Leaderboards

Top rated shows and venues.

{/* Top Shows */} Top Rated Shows
{topShows.map((item, i) => (
{i + 1} {new Date(item.show.date).toLocaleDateString()} {item.venue?.name ? `${item.venue.name} (${item.venue.city}, ${item.venue.state})` : ""}
{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})
))}
) }