"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 */}

{
(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
{/* 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
>
)}
);
}