"use client"; import { useEffect, useState } from "react"; import { Agent } from "@/types/agent"; import { Trophy, Star, User, Brain } from "lucide-react"; import { cn } from "@/lib/utils"; import { supabase } from "@/utils/supabase"; import Link from "next/link"; import { Header, LeaderboardHeader } from "@/components/header"; import { motion, useScroll, useTransform } from "framer-motion"; import { fetchAgentStats } from "@/lib/agents"; type Score = { agentId: string; vrm: number; chatbot: number; tts: number; stt: number; vision: number; amicaLife: number; talentShowScore: number; }; function AgentCard({ agent, rank, score }: { agent: Agent; rank: number; score: Score }) { const getRankStyle = (rank: number) => { switch (rank) { case 0: return { gradient: "from-amber-400 via-yellow-300 to-amber-400", border: "border-amber-300", shadow: "shadow-amber-200/50", icon: "text-amber-600", rank: "text-amber-700" }; case 1: return { gradient: "from-slate-300 via-gray-200 to-slate-300", border: "border-slate-300", shadow: "shadow-slate-200/50", icon: "text-slate-600", rank: "text-slate-700" }; case 2: return { gradient: "from-orange-300 via-amber-200 to-orange-300", border: "border-orange-300", shadow: "shadow-orange-200/50", icon: "text-orange-600", rank: "text-orange-700" }; default: return { gradient: "from-slate-50 to-white", border: "border-slate-200", shadow: "shadow-slate-100/50", icon: "text-slate-500", rank: "text-slate-600" }; } }; const getCategoryTitle = (category: string) => { switch (category.toLowerCase()) { case 'security': return 'Security'; case 'crypto': return 'Crypto'; case 'personalAssistant': return 'Personal Assistant'; case 'researcher': return 'Researcher'; case 'programmer': return 'Programmer'; default: return 'General'; } }; const getCategoryIcon = (category: string) => { switch (category.toLowerCase()) { case 'security': return '🛡️'; case 'crypto': return '₿'; case 'personalAssistant': return '👤'; case 'researcher': return '🔬'; case 'programmer': return '💻'; default: return '🤖'; } }; const style = getRankStyle(rank); const isTopThree = rank < 3; return (
{/* Rank Badge */}
#{rank + 1}
{/* Trophy for top 3 */} {isTopThree && (
)}
{/* Agent Profile */}
{agent.name} { (e.target as HTMLImageElement).src = `data:image/svg+xml,👤`; }} />
{getCategoryIcon(agent.category)}

{agent.name}

{agent.tier?.name} {getCategoryTitle(agent.category)}

{agent.description}

{/* Score Metrics */}
{/* Overall Score */}
Talent Score
{score.talentShowScore.toFixed(1)}
{/* Detailed Metrics Grid */}
{[ { label: "VRM", value: score.vrm, icon: "🎭" }, { label: "Vision", value: score.vision, icon: "👁️" }, { label: "TTS", value: score.tts, icon: "🗣️" }, { label: "STT", value: score.stt, icon: "👂" }, { label: "Chatbot", value: score.chatbot, icon: "💬" }, { label: "Amica Life", value: score.amicaLife, icon: "🌟" } ].map(({ label, value, icon }) => (
{icon}
{value.toFixed(0)}
{label}
))}
); } export default function LeaderboardPage() { const { scrollY } = useScroll(); const backgroundColor = useTransform(scrollY, [0, 300], ["rgb(26, 26, 46)", "rgb(255, 255, 255)"]); const [agents, setAgents] = useState(null); const [scores, setScores] = useState([]); const [loading, setLoading] = useState(true); const [checking, setChecking] = useState(true); const [error, setError] = useState(null); // Fetchs agent useEffect(() => { let isMounted = true; const loadAgents = async () => { console.log("Load agents..") setLoading(true); setError(null); try { const res = await fetch("/api/agents"); if (!res.ok) throw new Error("Failed to fetch agents. "); const data = await res.json(); const agents = await fetchAgentStats(data); if (isMounted) { setAgents(Array.isArray(agents) ? agents : [agents]); } } catch (err: any) { if (isMounted) { setError(err.message || "Error loading agents."); } } finally { if (isMounted) { setLoading(false); } } }; loadAgents(); return () => { isMounted = false; }; }, []); useEffect(() => { const fetchScores = async () => { console.log("Load scores..") const { data, error } = await supabase.from("agent-score").select("*"); if (error) { console.error("Error fetching scores:", error.message); setChecking(false); return; } if (data) { const sorted = data.sort( (a, b) => b.talentShowScore - a.talentShowScore ); setScores(sorted); setChecking(false); } }; fetchScores(); }, []); return ( {/* Hero Header */} {error ? (
Error loading agents: {error}
) : loading || checking ? (
) : ( <> {/* Leaderboard Content */}
{/* Stats Bar */}
{scores.length}
Active Agents
{Math.max(...scores.map(s => s.talentShowScore)).toFixed(1)}
Top Score
7
Categories
{/* Agent Cards */}
{scores.map((score, index) => { const agent = agents?.find(agent => agent.agentId === score.agentId); if (!agent) return null; return ( ); })}
{/* Footer */}

Rankings updated in real-time based on comprehensive AI capabilities assessment

)}
); }