From 104cb817d693ff36c00e8481eb7299cc27b74334 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Tue, 2 Dec 2025 13:53:59 -0500 Subject: [PATCH] don't return to left activity session, sort roles consistently, use joined rooms to get roles info when available --- .../activity_participant_list.dart | 5 +++-- .../activity_sessions_start_view.dart | 19 +++++++++++++++---- .../widgets/chat_context_menu_action.dart | 6 ++++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/lib/pangea/activity_sessions/activity_participant_list.dart b/lib/pangea/activity_sessions/activity_participant_list.dart index b8fab53e4..9cfb004ca 100644 --- a/lib/pangea/activity_sessions/activity_participant_list.dart +++ b/lib/pangea/activity_sessions/activity_participant_list.dart @@ -40,7 +40,8 @@ class ActivityParticipantList extends StatelessWidget { room: room, builder: (context, participants) { final theme = Theme.of(context); - final availableRoles = activity.roles; + final availableRoles = + activity.roles.values.sorted((a, b) => a.id.compareTo(b.id)); final remainingMembers = participants.participants.where( (p) => !assignedRoles.values.any((r) => r.userId == p.id), @@ -53,7 +54,7 @@ class ActivityParticipantList extends StatelessWidget { alignment: WrapAlignment.center, spacing: 12.0, runSpacing: 12.0, - children: availableRoles.values.map((availableRole) { + children: availableRoles.map((availableRole) { final selected = isSelected != null ? isSelected!(availableRole.id) : false; diff --git a/lib/pangea/activity_sessions/activity_session_start/activity_sessions_start_view.dart b/lib/pangea/activity_sessions/activity_session_start/activity_sessions_start_view.dart index b279b084d..82bf7edb0 100644 --- a/lib/pangea/activity_sessions/activity_session_start/activity_sessions_start_view.dart +++ b/lib/pangea/activity_sessions/activity_session_start/activity_sessions_start_view.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:collection/collection.dart'; import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; @@ -7,6 +8,7 @@ import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pangea/activity_feedback/activity_feedback_repo.dart'; import 'package:fluffychat/pangea/activity_feedback/activity_feedback_request.dart'; +import 'package:fluffychat/pangea/activity_sessions/activity_room_extension.dart'; import 'package:fluffychat/pangea/activity_sessions/activity_session_start/activity_feedback_request_dialog.dart'; import 'package:fluffychat/pangea/activity_sessions/activity_session_start/activity_feedback_response_dialog.dart'; import 'package:fluffychat/pangea/activity_sessions/activity_session_start/activity_session_start_page.dart'; @@ -449,13 +451,22 @@ class _ActivityStatuses extends StatelessWidget { ), ), ...entry.entries.map((e) { - final summary = e.value; + // if user is in the room, use the room info instead of the + // room summary response to get real-time activity roles info final roomId = e.key; + final room = + Matrix.of(context).client.getRoomById(roomId); + final activityPlan = + room?.activityPlan ?? e.value.activityPlan; + final activityRoles = + room?.assignedRoles ?? e.value.activityRoles.roles; + return ListTile( title: OpenRolesIndicator( - roles: summary.activityPlan.roles.values.toList(), - assignedRoles: - summary.activityRoles.roles.values.toList(), + roles: activityPlan.roles.values + .sorted((a, b) => a.id.compareTo(b.id)) + .toList(), + assignedRoles: activityRoles.values.toList(), size: 40.0, spacing: 8.0, space: space, diff --git a/lib/pangea/chat_settings/widgets/chat_context_menu_action.dart b/lib/pangea/chat_settings/widgets/chat_context_menu_action.dart index 618022be4..2af53efcb 100644 --- a/lib/pangea/chat_settings/widgets/chat_context_menu_action.dart +++ b/lib/pangea/chat_settings/widgets/chat_context_menu_action.dart @@ -252,6 +252,12 @@ void chatContextMenuAction( context: context, future: room.isSpace ? room.leaveSpace : room.leave, ); + + final r = room.client.getRoomById(room.id); + if (r != null && r.membership != Membership.leave) { + await room.client.waitForRoomInSync(room.id, leave: true); + } + if (!resp.isError) { outerContext.go( room.courseParent != null