This repository has been archived on 2024-10-29. You can view files and clone it, but cannot push or open issues or pull requests.
Files
Liam 0317eae926
All checks were successful
Deploy Backend / deploy (push) Successful in 3m46s
Deploy Website / deploy (push) Successful in 4m46s
fix beatsaver map causing page to not load if it's unknown
2024-10-18 08:13:26 +01:00

106 lines
2.6 KiB
TypeScript

import { formatNumberWithCommas } from "@ssr/common/utils/number-utils";
import StatValue from "@/components/stat-value";
import ScoreSaberPlayer from "@ssr/common/player/impl/scoresaber-player";
import { formatDate } from "@ssr/common/utils/time-utils";
import { ReactNode } from "react";
import Tooltip from "@/components/tooltip";
type Badge = {
name: string;
color?: string;
create: (player: ScoreSaberPlayer) => {
tooltip?: string | ReactNode;
value: string | ReactNode;
};
};
const badges: Badge[] = [
{
name: "Ranked Play Count",
color: "bg-pp",
create: (player: ScoreSaberPlayer) => {
return {
value: formatNumberWithCommas(player.statistics.rankedPlayCount),
};
},
},
{
name: "Total Ranked Score",
color: "bg-pp",
create: (player: ScoreSaberPlayer) => {
return {
value: formatNumberWithCommas(player.statistics.totalRankedScore),
};
},
},
{
name: "Average Ranked Accuracy",
color: "bg-pp",
create: (player: ScoreSaberPlayer) => {
return {
value: player.statistics.averageRankedAccuracy.toFixed(2) + "%",
};
},
},
{
name: "Total Play Count",
create: (player: ScoreSaberPlayer) => {
return {
value: formatNumberWithCommas(player.statistics.totalPlayCount),
};
},
},
{
name: "Total Score",
create: (player: ScoreSaberPlayer) => {
return {
value: formatNumberWithCommas(player.statistics.totalScore),
};
},
},
{
name: "Total Replays Watched",
create: (player: ScoreSaberPlayer) => {
return {
value: formatNumberWithCommas(player.statistics.replaysWatched),
};
},
},
{
name: "Joined Date",
create: (player: ScoreSaberPlayer) => {
return {
tooltip: formatDate(player.joinedDate, "DD MMMM YYYY HH:mm"),
value: formatDate(player.joinedDate),
};
},
},
];
type Props = {
player: ScoreSaberPlayer;
};
export default function PlayerStats({ player }: Props) {
return (
<div className={`flex flex-wrap gap-2 w-full justify-center lg:justify-start`}>
{badges.map((badge, index) => {
const toRender = badge.create(player);
if (toRender === undefined) {
return <div key={index} />;
}
const { tooltip, value } = toRender;
const stat = <StatValue key={index} color={badge.color} name={badge.name} value={value} />;
return tooltip ? (
<Tooltip asChild={false} display={tooltip} key={index}>
{stat}
</Tooltip>
) : (
stat
);
})}
</div>
);
}