fix: calls — correct MSC4143 JWT flow + message order

Calls:
- JWT fetch now uses correct MSC4143 flow: get OpenID token from
  Synapse, then POST to /_matrix/livekit/jwt/sfu/get (was using
  GET with Bearer token to wrong path — returned 301→404)
- Error messages now visible for 3 seconds before popping screen
  (was flashing away instantly — user couldn't see failure reason)
- Voice vs video calls differentiated via ?video=0/1 query param
- Debug logging added to JWT flow for troubleshooting

Messages:
- Chat timeline now shows newest at bottom (standard behaviour).
  Was reversed twice: SDK returns newest-first, code reversed to
  oldest-first, then ListView(reverse:true) put oldest at bottom.
  Removed the extra .reversed — newest-first + reverse:true = correct.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-03 06:21:08 +10:00
parent b941cdfe4b
commit 1f58c9e21d
5 changed files with 79 additions and 32 deletions

View File

@@ -72,15 +72,17 @@ class _ChatScreenState extends ConsumerState<ChatScreen> {
IconButton(
icon: const Icon(Icons.call),
tooltip: 'Voice call',
onPressed: () =>
context.push('/calls/${Uri.encodeComponent(_decodedRoomId)}'),
onPressed: () => context.push(
'/calls/${Uri.encodeComponent(_decodedRoomId)}?video=0',
),
),
// Video call
IconButton(
icon: const Icon(Icons.videocam_outlined),
tooltip: 'Video call',
onPressed: () =>
context.push('/calls/${Uri.encodeComponent(_decodedRoomId)}'),
onPressed: () => context.push(
'/calls/${Uri.encodeComponent(_decodedRoomId)}?video=1',
),
),
IconButton(
icon: const Icon(Icons.more_vert),