import type { LeaderboardEntry } from "../domain/types"; import { Avatar } from "./Avatar"; import { PlayerLink } from "./PlayerLink"; function pct(v: number | null | undefined): string { return v == null ? "—" : `${Math.round(v * 100)}%`; } function Row({ entry, provisional, profileLinks, }: { entry: LeaderboardEntry; provisional?: boolean; profileLinks: boolean; }) { const content = ( <>
{entry.rank ?? "—"}
{entry.nickname}
Игр: {entry.games} Побед: {entry.wins} WR: {pct(entry.win_rate)}
{entry.score ?? "—"}
); // Строка-ссылка на профиль — только там, где сама карточка никуда не ведёт // (на главной карточка топа целиком открывает общую статистику). if (!profileLinks) return
{content}
; return ( {content} ); } export function Leaderboard({ entries, provisional, inactive, profileLinks = true, }: { entries: LeaderboardEntry[]; provisional?: LeaderboardEntry[]; inactive?: LeaderboardEntry[]; profileLinks?: boolean; }) { const empty = entries.length === 0 && !provisional?.length && !inactive?.length; if (empty) { return
Сыгранных партий пока нет.
; } return (
{entries.map((e) => ( ))} {provisional && provisional.length > 0 && ( <>
Новички (мало игр)
{provisional.map((e) => ( ))} )} {inactive && inactive.length > 0 && ( <>
Ещё не играли
{inactive.map((e) => ( ))} )}
); }