Группы: статистика игроков — все участники (несыгравшие отдельным блоком), строка кликабельна целиком
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Vendored
+5
@@ -1286,6 +1286,11 @@ export interface components {
|
||||
* @default []
|
||||
*/
|
||||
provisional: components["schemas"]["LeaderboardEntry"][];
|
||||
/**
|
||||
* Inactive
|
||||
* @default []
|
||||
*/
|
||||
inactive: components["schemas"]["LeaderboardEntry"][];
|
||||
/**
|
||||
* Faction Meta
|
||||
* @default []
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -56,8 +56,14 @@ export function GroupPage() {
|
||||
<GroupInvitations />
|
||||
|
||||
<div className="card">
|
||||
<h3>Топ в группе</h3>
|
||||
{stats && <Leaderboard entries={stats.leaderboard} provisional={stats.provisional} />}
|
||||
<h3>Статистика игроков</h3>
|
||||
{stats && (
|
||||
<Leaderboard
|
||||
entries={stats.leaderboard}
|
||||
provisional={stats.provisional}
|
||||
inactive={stats.inactive}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<GroupSwitcher />
|
||||
|
||||
Reference in New Issue
Block a user