UI: рейтинг новичков в карточке профиля — серебристый

ProfileStats теперь отдаёт min_games (порог «Новичков» из API, без
дублирования константы на фронте): пока сыграно меньше min_games партий,
«Очки (рейтинг)» в профиле показываются серебристым, как в топах;
золотой — только подтверждённый рейтинг.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-17 03:10:53 +03:00
co-authored by Claude Fable 5
parent 45bdadece9
commit 4a681430af
4 changed files with 13 additions and 1 deletions
+3
View File
@@ -331,6 +331,9 @@ class ProfileStats(BaseModel):
worst_faction: FactionStat | None = None worst_faction: FactionStat | None = None
most_played_faction: FactionStat | None = None most_played_faction: FactionStat | None = None
recent_form: list[RecentFormItem] = [] recent_form: list[RecentFormItem] = []
# Порог «Новичков» (MIN_GAMES) — чтобы UI единообразно подсвечивал
# неподтверждённый рейтинг, не дублируя константу на фронте.
min_games: int = 0
class PublicProfile(BaseModel): class PublicProfile(BaseModel):
+1
View File
@@ -206,6 +206,7 @@ def profile_stats(session: Session, user_id: int, group_id: int | None = None) -
"worst_faction": worst, "worst_faction": worst,
"most_played_faction": most_played, "most_played_faction": most_played,
"recent_form": _recent_form(session, user_id, group_id), "recent_form": _recent_form(session, user_id, group_id),
"min_games": MIN_GAMES,
} }
+5
View File
@@ -1883,6 +1883,11 @@ export interface components {
* @default [] * @default []
*/ */
recent_form: components["schemas"]["RecentFormItem"][]; recent_form: components["schemas"]["RecentFormItem"][];
/**
* Min Games
* @default 0
*/
min_games: number;
}; };
/** ProfileUpdate */ /** ProfileUpdate */
ProfileUpdate: { ProfileUpdate: {
+4 -1
View File
@@ -12,6 +12,9 @@ export function ProfileStatsCard({
title?: string; title?: string;
}) { }) {
const o = stats.overall; const o = stats.overall;
// Серебристый рейтинг — пока игрок «новичок» (меньше min_games партий) или
// не играл вовсе; золотой — только подтверждённый (как в топах).
const provisional = o.score == null || o.games < stats.min_games;
return ( return (
<div className="card"> <div className="card">
<h3>{title}</h3> <h3>{title}</h3>
@@ -33,7 +36,7 @@ export function ProfileStatsCard({
</div> </div>
<div className="row-between"> <div className="row-between">
<div>Очки (рейтинг)</div> <div>Очки (рейтинг)</div>
<b className={"lb-score" + (o.score == null ? " provisional" : "")}>{o.score ?? "—"}</b> <b className={"lb-score" + (provisional ? " provisional" : "")}>{o.score ?? "—"}</b>
</div> </div>
{stats.most_played_faction && ( {stats.most_played_faction && (
<div className="row-between"> <div className="row-between">