Give the lobby a join state instead of an enter callback

`LobbyView` took `onEnter`, `enterLabel` and `waitingForInvite`, which cannot
express a declined, banned or invite-only room, so each of those ended at a
full-screen error and took the camera preview with it.

It now takes a `LobbyJoinState`, one of seven kinds, and renders both the
button and a message under the preview from it. `KnockLobbyView` passes
through what the loader offers, which is a single `lobby` state in place of
`canKnock` and `waitForInvite`, so a decline, a ban, or a room that takes
neither joins nor knocks keeps the user in the lobby. Waiting says what it is
waiting for and offers a way to withdraw the request.

The loader drives that state from the lobby's own callbacks rather than from
the load promise, so a refused request leaves the user where they were, and
every membership listener it adds is dropped when the effect is cleaned up.
What it knows of a room nobody has joined is a `PreJoinRoomInfo`, built from
a summary or from a `Room`, so a ban Element Call finds at load time is a
lobby state as well.

Denied and banned reuse the translated `group_call_loader.*` copy, so four
strings are new.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Quentin Gliech
2026-09-09 22:44:59 +02:00
co-authored by Claude Fable 5.1
parent 1c8a6487e9
commit 3653a7fd05
14 changed files with 1286 additions and 303 deletions
+4 -1
View File
@@ -152,10 +152,13 @@
"layout_switch_label": "Layout",
"lobby": {
"ask_to_join": "Request to join call",
"cancel_request": "Cancel request",
"invite_only_body": "You need an invite to join this call.",
"join_as_guest": "Join as guest",
"join_button": "Join call",
"leave_button": "Back to recents",
"waiting_for_invite": "Request sent! Waiting for permission to join…"
"request_sent": "Request to join sent",
"request_sent_body": "You will receive an invite to join the call if your request is accepted."
},
"log_in": "Log In",
"logging_in": "Logging in…",