From 4a681430af30886bed331bf4d32a89567a41338e Mon Sep 17 00:00:00 2001 From: NotBigGhost Date: Fri, 17 Jul 2026 03:10:53 +0300 Subject: [PATCH] =?UTF-8?q?UI:=20=D1=80=D0=B5=D0=B9=D1=82=D0=B8=D0=BD?= =?UTF-8?q?=D0=B3=20=D0=BD=D0=BE=D0=B2=D0=B8=D1=87=D0=BA=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B2=20=D0=BA=D0=B0=D1=80=D1=82=D0=BE=D1=87=D0=BA=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=84=D0=B8=D0=BB=D1=8F=20=E2=80=94=20=D1=81?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B1=D1=80=D0=B8=D1=81=D1=82=D1=8B=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ProfileStats теперь отдаёт min_games (порог «Новичков» из API, без дублирования константы на фронте): пока сыграно меньше min_games партий, «Очки (рейтинг)» в профиле показываются серебристым, как в топах; золотой — только подтверждённый рейтинг. Co-Authored-By: Claude Fable 5 --- backend/app/schemas/api.py | 3 +++ backend/app/services/stats_service.py | 1 + frontend/src/api/schema.d.ts | 5 +++++ frontend/src/components/ProfileStatsCard.tsx | 5 ++++- 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/backend/app/schemas/api.py b/backend/app/schemas/api.py index a7c2152..84dcb6b 100644 --- a/backend/app/schemas/api.py +++ b/backend/app/schemas/api.py @@ -331,6 +331,9 @@ class ProfileStats(BaseModel): worst_faction: FactionStat | None = None most_played_faction: FactionStat | None = None recent_form: list[RecentFormItem] = [] + # Порог «Новичков» (MIN_GAMES) — чтобы UI единообразно подсвечивал + # неподтверждённый рейтинг, не дублируя константу на фронте. + min_games: int = 0 class PublicProfile(BaseModel): diff --git a/backend/app/services/stats_service.py b/backend/app/services/stats_service.py index ceec012..66b43d5 100644 --- a/backend/app/services/stats_service.py +++ b/backend/app/services/stats_service.py @@ -206,6 +206,7 @@ def profile_stats(session: Session, user_id: int, group_id: int | None = None) - "worst_faction": worst, "most_played_faction": most_played, "recent_form": _recent_form(session, user_id, group_id), + "min_games": MIN_GAMES, } diff --git a/frontend/src/api/schema.d.ts b/frontend/src/api/schema.d.ts index 553e44e..b3f0f86 100644 --- a/frontend/src/api/schema.d.ts +++ b/frontend/src/api/schema.d.ts @@ -1883,6 +1883,11 @@ export interface components { * @default [] */ recent_form: components["schemas"]["RecentFormItem"][]; + /** + * Min Games + * @default 0 + */ + min_games: number; }; /** ProfileUpdate */ ProfileUpdate: { diff --git a/frontend/src/components/ProfileStatsCard.tsx b/frontend/src/components/ProfileStatsCard.tsx index c287acc..009d565 100644 --- a/frontend/src/components/ProfileStatsCard.tsx +++ b/frontend/src/components/ProfileStatsCard.tsx @@ -12,6 +12,9 @@ export function ProfileStatsCard({ title?: string; }) { const o = stats.overall; + // Серебристый рейтинг — пока игрок «новичок» (меньше min_games партий) или + // не играл вовсе; золотой — только подтверждённый (как в топах). + const provisional = o.score == null || o.games < stats.min_games; return (

{title}

@@ -33,7 +36,7 @@ export function ProfileStatsCard({
Очки (рейтинг)
- {o.score ?? "—"} + {o.score ?? "—"}
{stats.most_played_faction && (