UI: в топе игроков на главной ники некликабельны

Карточка топа целиком ведёт в общую статистику — вложенные ссылки на
профили конфликтовали с этим переходом. У Leaderboard появился флаг
profileLinks: на главной выключен, в «Списке игроков» группы (карточка
никуда не ведёт) строки-ссылки остаются, как и в общей статистике.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-15 17:28:21 +03:00
co-authored by Claude Fable 5
parent dbc32b7f4d
commit fc1b1fd912
2 changed files with 27 additions and 11 deletions
+24 -8
View File
@@ -6,11 +6,17 @@ function pct(v: number | null | undefined): string {
return v == null ? "—" : `${Math.round(v * 100)}%`;
}
function Row({ entry, provisional }: { entry: LeaderboardEntry; provisional?: boolean }) {
return (
// Вся строка — ссылка на профиль (на главной карточка-обёртка ведёт в общую
// статистику, а клик по строке игрока — в его профиль).
<PlayerLink userId={entry.user_id} className="lb-row">
function Row({
entry,
provisional,
profileLinks,
}: {
entry: LeaderboardEntry;
provisional?: boolean;
profileLinks: boolean;
}) {
const content = (
<>
<div className={"lb-rank" + (entry.rank && entry.rank <= 3 ? " top" : "")}>
{entry.rank ?? "—"}
</div>
@@ -24,6 +30,14 @@ function Row({ entry, provisional }: { entry: LeaderboardEntry; provisional?: bo
</div>
</div>
<div className={"lb-score" + (provisional ? " provisional" : "")}>{entry.score ?? "—"}</div>
</>
);
// Строка-ссылка на профиль — только там, где сама карточка никуда не ведёт
// (на главной карточка топа целиком открывает общую статистику).
if (!profileLinks) return <div className="lb-row">{content}</div>;
return (
<PlayerLink userId={entry.user_id} className="lb-row">
{content}
</PlayerLink>
);
}
@@ -32,10 +46,12 @@ 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;
@@ -45,7 +61,7 @@ export function Leaderboard({
return (
<div>
{entries.map((e) => (
<Row key={e.user_id} entry={e} />
<Row key={e.user_id} entry={e} profileLinks={profileLinks} />
))}
{provisional && provisional.length > 0 && (
<>
@@ -53,7 +69,7 @@ export function Leaderboard({
Новички (мало игр)
</div>
{provisional.map((e) => (
<Row key={e.user_id} entry={e} provisional />
<Row key={e.user_id} entry={e} provisional profileLinks={profileLinks} />
))}
</>
)}
@@ -63,7 +79,7 @@ export function Leaderboard({
Ещё не играли
</div>
{inactive.map((e) => (
<Row key={e.user_id} entry={e} />
<Row key={e.user_id} entry={e} profileLinks={profileLinks} />
))}
</>
)}
+3 -3
View File
@@ -15,15 +15,15 @@ export function HomePage() {
return (
<div>
{/* Карточка кликабельна целиком → общая статистика; клик по нику внутри
ведёт в профиль (Leaderboard останавливает всплытие на ссылках ников). */}
{/* Карточка кликабельна целиком → общая статистика; ники внутри — просто
текст, ссылки на профили есть в самой общей статистике. */}
<div className="card" style={{ cursor: "pointer" }} onClick={() => navigate("/stats")}>
<div className="row-between">
<h3 style={{ margin: 0 }}>Топ игроков</h3>
<span className="muted small">Вся статистика →</span>
</div>
<div style={{ marginTop: 10 }}>
<Leaderboard entries={data.leaderboard} provisional={data.provisional} />
<Leaderboard entries={data.leaderboard} provisional={data.provisional} profileLinks={false} />
</div>
</div>