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)}%`;
|
return v == null ? "—" : `${Math.round(v * 100)}%`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function Row({ entry, provisional }: { entry: LeaderboardEntry; provisional?: boolean }) {
|
function Row({
|
||||||
return (
|
entry,
|
||||||
// Вся строка — ссылка на профиль (на главной карточка-обёртка ведёт в общую
|
provisional,
|
||||||
// статистику, а клик по строке игрока — в его профиль).
|
profileLinks,
|
||||||
<PlayerLink userId={entry.user_id} className="lb-row">
|
}: {
|
||||||
|
entry: LeaderboardEntry;
|
||||||
|
provisional?: boolean;
|
||||||
|
profileLinks: boolean;
|
||||||
|
}) {
|
||||||
|
const content = (
|
||||||
|
<>
|
||||||
<div className={"lb-rank" + (entry.rank && entry.rank <= 3 ? " top" : "")}>
|
<div className={"lb-rank" + (entry.rank && entry.rank <= 3 ? " top" : "")}>
|
||||||
{entry.rank ?? "—"}
|
{entry.rank ?? "—"}
|
||||||
</div>
|
</div>
|
||||||
@@ -24,6 +30,14 @@ function Row({ entry, provisional }: { entry: LeaderboardEntry; provisional?: bo
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className={"lb-score" + (provisional ? " provisional" : "")}>{entry.score ?? "—"}</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>
|
</PlayerLink>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -32,10 +46,12 @@ export function Leaderboard({
|
|||||||
entries,
|
entries,
|
||||||
provisional,
|
provisional,
|
||||||
inactive,
|
inactive,
|
||||||
|
profileLinks = true,
|
||||||
}: {
|
}: {
|
||||||
entries: LeaderboardEntry[];
|
entries: LeaderboardEntry[];
|
||||||
provisional?: LeaderboardEntry[];
|
provisional?: LeaderboardEntry[];
|
||||||
inactive?: LeaderboardEntry[];
|
inactive?: LeaderboardEntry[];
|
||||||
|
profileLinks?: boolean;
|
||||||
}) {
|
}) {
|
||||||
const empty =
|
const empty =
|
||||||
entries.length === 0 && !provisional?.length && !inactive?.length;
|
entries.length === 0 && !provisional?.length && !inactive?.length;
|
||||||
@@ -45,7 +61,7 @@ export function Leaderboard({
|
|||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
{entries.map((e) => (
|
{entries.map((e) => (
|
||||||
<Row key={e.user_id} entry={e} />
|
<Row key={e.user_id} entry={e} profileLinks={profileLinks} />
|
||||||
))}
|
))}
|
||||||
{provisional && provisional.length > 0 && (
|
{provisional && provisional.length > 0 && (
|
||||||
<>
|
<>
|
||||||
@@ -53,7 +69,7 @@ export function Leaderboard({
|
|||||||
Новички (мало игр)
|
Новички (мало игр)
|
||||||
</div>
|
</div>
|
||||||
{provisional.map((e) => (
|
{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>
|
</div>
|
||||||
{inactive.map((e) => (
|
{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 (
|
return (
|
||||||
<div>
|
<div>
|
||||||
{/* Карточка кликабельна целиком → общая статистика; клик по нику внутри
|
{/* Карточка кликабельна целиком → общая статистика; ники внутри — просто
|
||||||
ведёт в профиль (Leaderboard останавливает всплытие на ссылках ников). */}
|
текст, ссылки на профили есть в самой общей статистике. */}
|
||||||
<div className="card" style={{ cursor: "pointer" }} onClick={() => navigate("/stats")}>
|
<div className="card" style={{ cursor: "pointer" }} onClick={() => navigate("/stats")}>
|
||||||
<div className="row-between">
|
<div className="row-between">
|
||||||
<h3 style={{ margin: 0 }}>Топ игроков</h3>
|
<h3 style={{ margin: 0 }}>Топ игроков</h3>
|
||||||
<span className="muted small">Вся статистика →</span>
|
<span className="muted small">Вся статистика →</span>
|
||||||
</div>
|
</div>
|
||||||
<div style={{ marginTop: 10 }}>
|
<div style={{ marginTop: 10 }}>
|
||||||
<Leaderboard entries={data.leaderboard} provisional={data.provisional} />
|
<Leaderboard entries={data.leaderboard} provisional={data.provisional} profileLinks={false} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user