Группы: статистика игроков — все участники (несыгравшие отдельным блоком), строка кликабельна целиком

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-17 20:11:32 +03:00
co-authored by Claude Opus 4.8
parent 366742d6da
commit 87c7f48a3e
6 changed files with 83 additions and 14 deletions
+25 -11
View File
@@ -9,20 +9,20 @@ function pct(v: number | null | undefined): string {
function Row({ entry }: { entry: LeaderboardEntry }) {
return (
<div className="lb-row">
// Вся строка — ссылка на профиль. stopPropagation: на главной карточка-обёртка
// ведёт в общую статистику, а клик по строке игрока — в его профиль.
<Link
to={`/u/${entry.user_id}`}
className="lb-row"
style={{ color: "inherit" }}
onClick={(e) => e.stopPropagation()}
>
<div className={"lb-rank" + (entry.rank && entry.rank <= 3 ? " top" : "")}>
{entry.rank ?? "—"}
</div>
<Avatar url={entry.avatar_url} nickname={entry.nickname} size={32} />
<div>
<Link
to={`/u/${entry.user_id}`}
// stopPropagation: ник кликабелен даже когда вся карточка-обёртка кликабельна.
onClick={(e) => e.stopPropagation()}
style={{ fontWeight: 600, color: "inherit" }}
>
{entry.nickname}
</Link>
<div style={{ fontWeight: 600 }}>{entry.nickname}</div>
<div className="lb-metrics">
<span>Игр: {entry.games}</span>
<span>Побед: {entry.wins}</span>
@@ -30,18 +30,22 @@ function Row({ entry }: { entry: LeaderboardEntry }) {
</div>
</div>
<div className="lb-score">{entry.score ?? "—"}</div>
</div>
</Link>
);
}
export function Leaderboard({
entries,
provisional,
inactive,
}: {
entries: LeaderboardEntry[];
provisional?: LeaderboardEntry[];
inactive?: LeaderboardEntry[];
}) {
if (entries.length === 0 && (!provisional || provisional.length === 0)) {
const empty =
entries.length === 0 && !provisional?.length && !inactive?.length;
if (empty) {
return <div className="muted small">Пока нет сыгранных партий.</div>;
}
return (
@@ -59,6 +63,16 @@ export function Leaderboard({
))}
</>
)}
{inactive && inactive.length > 0 && (
<>
<div className="label" style={{ marginTop: 10 }}>
Ещё не играли
</div>
{inactive.map((e) => (
<Row key={e.user_id} entry={e} />
))}
</>
)}
</div>
);
}