UI: единый PlayerLink — ники игроков кликабельны во всех местах просмотра
Новый компонент PlayerLink (ссылка на /u/:id, кликабельно всё поле строки, stopPropagation для вложенности в кликабельные карточки). Применён: - Leaderboard и общая статистика (рефакторинг ручных Link); - страница партии: результаты и состав; - настройки группы: список участников; - список партий и незавершённые на главной (карточки button -> div, т.к. ссылки внутри button — невалидная разметка). «пригласил: X» в приглашениях остаётся текстом — в API нет id пригласившего. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -3,6 +3,7 @@ import { useNavigate } from "react-router-dom";
|
||||
|
||||
import { formatTime } from "../domain/format";
|
||||
import type { HomeInProgressMatch } from "../domain/types";
|
||||
import { PlayerLink } from "./PlayerLink";
|
||||
|
||||
export function InProgressMatches({ items }: { items: HomeInProgressMatch[] }) {
|
||||
const navigate = useNavigate();
|
||||
@@ -13,7 +14,9 @@ export function InProgressMatches({ items }: { items: HomeInProgressMatch[] }) {
|
||||
<h3 style={{ color: "var(--accent-2)" }}>Незавершённые партии</h3>
|
||||
<div className="stack">
|
||||
{items.map((m) => (
|
||||
<button
|
||||
// div, а не button: внутри лежат ссылки на профили игроков,
|
||||
// а интерактивные элементы внутри <button> — невалидная разметка.
|
||||
<div
|
||||
key={m.id}
|
||||
className="row-between"
|
||||
onClick={() => navigate(`/match/${m.id}`)}
|
||||
@@ -25,6 +28,7 @@ export function InProgressMatches({ items }: { items: HomeInProgressMatch[] }) {
|
||||
borderRadius: "var(--radius-sm)",
|
||||
padding: 12,
|
||||
color: "var(--text)",
|
||||
cursor: "pointer",
|
||||
}}
|
||||
>
|
||||
<div style={{ minWidth: 0 }}>
|
||||
@@ -39,13 +43,18 @@ export function InProgressMatches({ items }: { items: HomeInProgressMatch[] }) {
|
||||
className="small"
|
||||
style={{ overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}
|
||||
>
|
||||
{m.participants.map((p) => p.nickname).join(", ")}
|
||||
{m.participants.map((p, i) => (
|
||||
<span key={p.user_id}>
|
||||
{i > 0 && ", "}
|
||||
<PlayerLink userId={p.user_id}>{p.nickname}</PlayerLink>
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
<div className="row" style={{ gap: 4, color: "var(--accent-2)", flexShrink: 0 }}>
|
||||
Завершить <ChevronRight size={18} />
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user