don't return to left activity session, sort roles consistently, use joined rooms to get roles info when available

This commit is contained in:
ggurdin 2025-12-02 13:53:59 -05:00
parent 1514d4ae49
commit 104cb817d6
No known key found for this signature in database
GPG key ID: A01CB41737CBB478
3 changed files with 24 additions and 6 deletions

View file

@ -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;

View file

@ -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,

View file

@ -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