feat(lobby): F8-04b hierarchical sidebar + paid-tier gate for create-game
Reshape the lobby UI from a single Overview into a two-level sidebar (games · profile · DEV synthetic-reports) with four games sub-panels (active-past · recruitment · invitations · private-games). Move the `create new game` button into the private-games panel, merge the applications section into recruitment cards as status chips, and add DEV-only synthetic-report loader as a top-level screen. Add a paid-tier gate at backend `lobby.game.create`: free callers get `403 forbidden` before the lobby service is invoked. The UI hides the private-games sub-panel + create button on free tier (DEV affordances flag overrides). Update every integration test that creates a game to use a new `testenv.PromoteToPaid` helper; add a new `TestLobbyFlow_FreeUserCreateGameForbidden`. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -56,16 +56,31 @@ const ru: Record<keyof typeof en, string> = {
|
||||
"lobby.nav.aria_label": "разделы лобби",
|
||||
"lobby.nav.overview": "Обзор",
|
||||
"lobby.nav.profile": "Профиль",
|
||||
"lobby.nav.games": "партии",
|
||||
"lobby.nav.games.active_past": "активные и прошедшие",
|
||||
"lobby.nav.games.recruitment": "набор",
|
||||
"lobby.nav.games.invitations": "приглашения",
|
||||
"lobby.nav.games.private_games": "приватные партии",
|
||||
"lobby.nav.games.aria_label": "подразделы партий",
|
||||
"lobby.nav.games.mobile_toggle": "партии · {label}",
|
||||
"lobby.nav.synthetic_reports": "Synthetic-отчёты",
|
||||
"lobby.section.my_games": "мои игры",
|
||||
"lobby.section.invitations": "ожидающие приглашения",
|
||||
"lobby.section.applications": "мои заявки",
|
||||
"lobby.section.public_games": "публичные игры",
|
||||
"lobby.section.recruitment": "открытый набор",
|
||||
"lobby.section.private_games": "мои приватные партии",
|
||||
"lobby.section.create": "создать игру",
|
||||
"lobby.create_button": "создать новую игру",
|
||||
"lobby.my_games.empty": "пока нет игр",
|
||||
"lobby.invitations.empty": "приглашений нет",
|
||||
"lobby.applications.empty": "заявок нет",
|
||||
"lobby.public_games.empty": "публичных игр нет",
|
||||
"lobby.games.active_past.empty": "нет активных или прошедших партий",
|
||||
"lobby.games.private_games.empty": "у вас нет собственных партий",
|
||||
"lobby.recruitment.empty": "набор в партии ещё не открыт",
|
||||
"lobby.recruitment.applied_pending": "ваша заявка ожидает одобрения",
|
||||
"lobby.recruitment.applied_approved": "ваша заявка принята",
|
||||
"lobby.invitation.accept": "принять",
|
||||
"lobby.invitation.decline": "отклонить",
|
||||
"lobby.application.submit": "подать заявку",
|
||||
@@ -97,6 +112,8 @@ const ru: Record<keyof typeof en, string> = {
|
||||
"lobby.create.game_name_required": "название игры не должно быть пустым",
|
||||
"lobby.create.turn_schedule_required": "расписание ходов не должно быть пустым",
|
||||
"lobby.create.enrollment_ends_at_required": "время окончания набора обязательно",
|
||||
"lobby.create.error.forbidden":
|
||||
"Создание партий доступно только на платном тарифе.",
|
||||
"lobby.error.invalid_request": "запрос некорректен",
|
||||
"lobby.error.subject_not_found": "объект не найден",
|
||||
"lobby.error.forbidden": "операция запрещена",
|
||||
|
||||
Reference in New Issue
Block a user