import ScoreSaberLeaderboardToken from "@/common/model/token/scoresaber/score-saber-leaderboard-token"; import ScoreSaberScoreToken from "@/common/model/token/scoresaber/score-saber-score-token"; import { formatNumberWithCommas, formatPp } from "@/common/number-utils"; import { getScoreBadgeFromAccuracy } from "@/common/song-utils"; import StatValue from "@/components/stat-value"; import { XMarkIcon } from "@heroicons/react/24/solid"; import clsx from "clsx"; import Tooltip from "@/components/tooltip"; import { ScoreBadge } from "@/components/score/score-badge"; const badges: ScoreBadge[] = [ { name: "PP", color: () => { return "bg-pp"; }, create: (score: ScoreSaberScoreToken) => { const pp = score.pp; if (pp === 0) { return undefined; } return `${formatPp(pp)}pp`; }, }, { name: "Accuracy", color: (score: ScoreSaberScoreToken, leaderboard: ScoreSaberLeaderboardToken) => { const acc = (score.baseScore / leaderboard.maxScore) * 100; return getScoreBadgeFromAccuracy(acc).color; }, create: (score: ScoreSaberScoreToken, leaderboard: ScoreSaberLeaderboardToken) => { const acc = (score.baseScore / leaderboard.maxScore) * 100; const scoreBadge = getScoreBadgeFromAccuracy(acc); let accDetails = `Accuracy ${scoreBadge.name != "-" ? scoreBadge.name : ""}`; if (scoreBadge.max == null) { accDetails += ` (> ${scoreBadge.min}%)`; } else if (scoreBadge.min == null) { accDetails += ` (< ${scoreBadge.max}%)`; } else { accDetails += ` (${scoreBadge.min}% - ${scoreBadge.max}%)`; } return ( <>

{accDetails}

} >

{acc.toFixed(2)}%

); }, }, { name: "Score", create: (score: ScoreSaberScoreToken) => { return `${formatNumberWithCommas(score.baseScore)}`; }, }, { name: "", create: () => undefined, }, { name: "", create: () => undefined, }, { 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 ScoreStats({ score, leaderboard }: Props) { return (
{badges.map((badge, index) => { const toRender = badge.create(score, leaderboard); const color = badge.color?.(score, leaderboard); if (toRender === undefined) { return
; } return ; })}
); }