'use client' import { useTranslation } from 'react-i18next' type LeaderboardEntry = { rank: number player_name: string score: number elapsed_ms?: number tokens_total?: number judge_rating?: number created_at: string is_current_user?: boolean } type Props = { entries: LeaderboardEntry[] strategy?: string } export default function Leaderboard({ entries, strategy = 'highest_rating' }: Props) { const { t } = useTranslation() if (entries.length === 0) { return (
{t('challenges.leaderboard.empty')}
) } return (

{t('challenges.leaderboard.title')}

{strategy === 'fastest' && ( )} {strategy === 'fewest_tokens' && ( )} {strategy === 'highest_rating' && ( )} {entries.map((entry, idx) => ( {strategy === 'fastest' && entry.elapsed_ms !== undefined && ( )} {strategy === 'fewest_tokens' && entry.tokens_total !== undefined && ( )} {strategy === 'highest_rating' && entry.judge_rating !== undefined && ( )} ))}
{t('challenges.leaderboard.rank')} {t('challenges.leaderboard.player')} {t('challenges.leaderboard.score')} {t('challenges.leaderboard.time')} {t('challenges.leaderboard.tokens')} {t('challenges.leaderboard.rating')}
{entry.rank <= 3 ? ( {entry.rank === 1 && '🥇'} {entry.rank === 2 && '🥈'} {entry.rank === 3 && '🥉'} ) : ( #{entry.rank} )}
{entry.player_name} {entry.is_current_user && ( {t('challenges.leaderboard.yourBest')} )}
{entry.score.toFixed(1)} {(entry.elapsed_ms / 1000).toFixed(2)}s {entry.tokens_total}
{entry.judge_rating}/10
) }