UI: в топе игроков на главной ники некликабельны
Карточка топа целиком ведёт в общую статистику — вложенные ссылки на профили конфликтовали с этим переходом. У Leaderboard появился флаг profileLinks: на главной выключен, в «Списке игроков» группы (карточка никуда не ведёт) строки-ссылки остаются, как и в общей статистике. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -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} />
|
||||
))}
|
||||
</>
|
||||
)}
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user