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:
2026-07-13 17:37:19 +03:00
co-authored by Claude Fable 5
parent d81f5d8964
commit cbf3cfc6e6
7 changed files with 68 additions and 28 deletions
+31
View File
@@ -0,0 +1,31 @@
import type { CSSProperties, ReactNode } from "react";
import { Link } from "react-router-dom";
/**
* Ссылка на профиль игрока (/u/:id). Оборачивает всё поле с ником (строку с аватаром,
* местом, фракцией…), а не голый текст. stopPropagation — строки часто лежат внутри
* кликабельных карточек (список партий, топ на главной), и клик по игроку должен
* вести в профиль, а не срабатывать навигацией карточки.
*/
export function PlayerLink({
userId,
className,
style,
children,
}: {
userId: number;
className?: string;
style?: CSSProperties;
children: ReactNode;
}) {
return (
<Link
to={`/u/${userId}`}
className={className}
style={{ color: "inherit", ...style }}
onClick={(e) => e.stopPropagation()}
>
{children}
</Link>
);
}