import ScoreSaberLeaderboardToken from "@/common/model/token/scoresaber/score-saber-leaderboard-token"; import ScoreSaberScoreToken from "@/common/model/token/scoresaber/score-saber-score-token"; import { formatNumberWithCommas } from "@/common/number-utils"; import StatValue from "@/components/stat-value"; import { XMarkIcon } from "@heroicons/react/24/solid"; import clsx from "clsx"; type Badge = { name: string; create: ( score: ScoreSaberScoreToken, leaderboard: ScoreSaberLeaderboardToken ) => string | React.ReactNode | undefined; }; const badges: Badge[] = [ { name: "PP", create: (score: ScoreSaberScoreToken) => { const pp = score.pp; if (pp === 0) { return undefined; } return `${score.pp.toFixed(2)}pp`; }, }, { name: "Accuracy", create: (score: ScoreSaberScoreToken, leaderboard: ScoreSaberLeaderboardToken) => { const acc = (score.baseScore / leaderboard.maxScore) * 100; return `${acc.toFixed(2)}%`; }, }, { name: "Full Combo", create: (score: ScoreSaberScoreToken) => { const fullCombo = score.missedNotes === 0; return ( <>

{fullCombo ? FC : formatNumberWithCommas(score.missedNotes)}

); }, }, ]; type Props = { score: ScoreSaberScoreToken; leaderboard: ScoreSaberLeaderboardToken; }; export default function LeaderboardScoreStats({ score, leaderboard }: Props) { return (
{badges.map((badge, index) => { const toRender = badge.create(score, leaderboard); if (toRender === undefined) { return
; } return ; })}
); }