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) => (
|
))}
>
)}
);
}