2024-09-11 22:10:16 +00:00
|
|
|
import ScoreSaberPlayer from "@/common/data-fetcher/types/scoresaber/scoresaber-player";
|
|
|
|
import { formatNumberWithCommas } from "@/common/number-utils";
|
2024-09-09 11:08:24 +00:00
|
|
|
import { GlobeAmericasIcon } from "@heroicons/react/24/solid";
|
2024-09-11 14:38:04 +00:00
|
|
|
import Card from "../card";
|
2024-09-09 11:08:24 +00:00
|
|
|
import CountryFlag from "../country-flag";
|
|
|
|
import { Avatar, AvatarImage } from "../ui/avatar";
|
|
|
|
import ClaimProfile from "./claim-profile";
|
2024-09-11 14:38:04 +00:00
|
|
|
import PlayerDataPoint from "./player-data-point";
|
2024-09-09 11:08:24 +00:00
|
|
|
|
|
|
|
const playerSubNames = [
|
|
|
|
{
|
|
|
|
icon: () => {
|
|
|
|
return <GlobeAmericasIcon className="h-5 w-5" />;
|
|
|
|
},
|
|
|
|
render: (player: ScoreSaberPlayer) => {
|
|
|
|
return <p>#{formatNumberWithCommas(player.rank)}</p>;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
icon: (player: ScoreSaberPlayer) => {
|
2024-09-11 17:33:16 +00:00
|
|
|
return <CountryFlag country={player.country.toLowerCase()} size={15} />;
|
2024-09-09 11:08:24 +00:00
|
|
|
},
|
|
|
|
render: (player: ScoreSaberPlayer) => {
|
|
|
|
return <p>#{formatNumberWithCommas(player.countryRank)}</p>;
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
render: (player: ScoreSaberPlayer) => {
|
2024-09-11 14:38:04 +00:00
|
|
|
return <p className="text-pp">{formatNumberWithCommas(player.pp)}pp</p>;
|
2024-09-09 11:08:24 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
];
|
|
|
|
|
|
|
|
type Props = {
|
|
|
|
player: ScoreSaberPlayer;
|
|
|
|
};
|
|
|
|
|
|
|
|
export default function PlayerHeader({ player }: Props) {
|
|
|
|
return (
|
2024-09-11 14:38:04 +00:00
|
|
|
<Card>
|
2024-09-09 11:08:24 +00:00
|
|
|
<div className="flex gap-3 flex-col items-center text-center sm:flex-row sm:items-start sm:text-start relative select-none">
|
|
|
|
<Avatar className="w-32 h-32 pointer-events-none">
|
|
|
|
<AvatarImage fetchPriority="high" src={player.profilePicture} />
|
|
|
|
</Avatar>
|
|
|
|
<div>
|
|
|
|
<p className="font-bold text-2xl">{player.name}</p>
|
|
|
|
<div className="flex gap-2">
|
|
|
|
{playerSubNames.map((subName, index) => {
|
|
|
|
return (
|
2024-09-11 14:38:04 +00:00
|
|
|
<PlayerDataPoint icon={subName.icon && subName.icon(player)} key={index}>
|
2024-09-09 11:08:24 +00:00
|
|
|
{subName.render(player)}
|
2024-09-11 14:38:04 +00:00
|
|
|
</PlayerDataPoint>
|
2024-09-09 11:08:24 +00:00
|
|
|
);
|
|
|
|
})}
|
|
|
|
</div>
|
|
|
|
<div className="absolute top-0 right-0">
|
|
|
|
<ClaimProfile playerId={player.id} />
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
2024-09-11 14:38:04 +00:00
|
|
|
</Card>
|
2024-09-09 11:08:24 +00:00
|
|
|
);
|
|
|
|
}
|