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:
@@ -55,16 +55,31 @@ const en = {
|
||||
"lobby.nav.aria_label": "lobby pages",
|
||||
"lobby.nav.overview": "Overview",
|
||||
"lobby.nav.profile": "Profile",
|
||||
"lobby.nav.games": "games",
|
||||
"lobby.nav.games.active_past": "active & past",
|
||||
"lobby.nav.games.recruitment": "recruitment",
|
||||
"lobby.nav.games.invitations": "invitations",
|
||||
"lobby.nav.games.private_games": "private games",
|
||||
"lobby.nav.games.aria_label": "games sections",
|
||||
"lobby.nav.games.mobile_toggle": "games · {label}",
|
||||
"lobby.nav.synthetic_reports": "Synthetic test reports",
|
||||
"lobby.section.my_games": "my games",
|
||||
"lobby.section.invitations": "pending invitations",
|
||||
"lobby.section.applications": "my applications",
|
||||
"lobby.section.public_games": "public games",
|
||||
"lobby.section.recruitment": "open recruitment",
|
||||
"lobby.section.private_games": "my private games",
|
||||
"lobby.section.create": "create a game",
|
||||
"lobby.create_button": "create new game",
|
||||
"lobby.my_games.empty": "no games yet",
|
||||
"lobby.invitations.empty": "no invitations",
|
||||
"lobby.applications.empty": "no applications",
|
||||
"lobby.public_games.empty": "no public games",
|
||||
"lobby.games.active_past.empty": "no active or past games",
|
||||
"lobby.games.private_games.empty": "no private games yet",
|
||||
"lobby.recruitment.empty": "no open recruitment",
|
||||
"lobby.recruitment.applied_pending": "your application is awaiting approval",
|
||||
"lobby.recruitment.applied_approved": "your application was accepted",
|
||||
"lobby.invitation.accept": "accept",
|
||||
"lobby.invitation.decline": "decline",
|
||||
"lobby.application.submit": "submit application",
|
||||
@@ -96,6 +111,8 @@ const en = {
|
||||
"lobby.create.game_name_required": "game name must not be empty",
|
||||
"lobby.create.turn_schedule_required": "turn schedule must not be empty",
|
||||
"lobby.create.enrollment_ends_at_required": "enrollment end time must be set",
|
||||
"lobby.create.error.forbidden":
|
||||
"Game creation is available only on a paid plan.",
|
||||
"lobby.error.invalid_request": "request is invalid",
|
||||
"lobby.error.subject_not_found": "not found",
|
||||
"lobby.error.forbidden": "operation is forbidden",
|
||||
|
||||
Reference in New Issue
Block a user