From 45052a6b0132f5feef9c4d2439c13e9ac2d3bf3a Mon Sep 17 00:00:00 2001 From: ggurdin <46800240+ggurdin@users.noreply.github.com> Date: Wed, 13 Aug 2025 14:34:54 -0400 Subject: [PATCH] fix: don't consider an activity finished if no assigned roles are finished (#3728) --- .../activity_room_extension.dart | 19 +++++++++++++++++-- .../activity_state_event.dart | 2 +- .../activity_unfinished_status_message.dart | 2 +- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/pangea/activity_sessions/activity_room_extension.dart b/lib/pangea/activity_sessions/activity_room_extension.dart index 699218208..a160caa61 100644 --- a/lib/pangea/activity_sessions/activity_room_extension.dart +++ b/lib/pangea/activity_sessions/activity_room_extension.dart @@ -252,12 +252,25 @@ extension ActivityRoomExtension on Room { } } + Map? get assignedRoles { + final roles = activityRoles?.roles; + if (roles == null) return null; + + final participants = getParticipants(); + return Map.fromEntries( + roles.entries.where( + (r) => participants.any( + (p) => p.id == r.value.userId && p.membership == Membership.join, + ), + ), + ); + } + ActivityRoleModel? get ownRole => activityRoles?.role(client.userID!); int get remainingRoles { final availableRoles = activityPlan!.roles; - final assignedRoles = activityRoles?.roles ?? {}; - return max(0, availableRoles.length - assignedRoles.length); + return max(0, availableRoles.length - (assignedRoles?.length ?? 0)); } bool get showActivityChatUI { @@ -286,6 +299,8 @@ extension ActivityRoomExtension on Room { ); if (roles == null || roles.isEmpty) return false; + if (!roles.any((r) => r.isFinished)) return false; + return roles.every((r) { if (r.isFinished) return true; diff --git a/lib/pangea/activity_sessions/activity_state_event.dart b/lib/pangea/activity_sessions/activity_state_event.dart index a62aedfb8..c6a6bf23d 100644 --- a/lib/pangea/activity_sessions/activity_state_event.dart +++ b/lib/pangea/activity_sessions/activity_state_event.dart @@ -23,7 +23,7 @@ class ActivityStateEvent extends StatelessWidget { try { final activity = ActivityPlanModel.fromJson(event.content); final availableRoles = event.room.activityPlan!.roles; - final assignedRoles = event.room.activityRoles?.roles ?? {}; + final assignedRoles = event.room.assignedRoles ?? {}; final remainingMembers = event.room.getParticipants().where( (p) => !assignedRoles.values.any((r) => r.userId == p.id), diff --git a/lib/pangea/activity_sessions/activity_unfinished_status_message.dart b/lib/pangea/activity_sessions/activity_unfinished_status_message.dart index 336f7db97..33881f315 100644 --- a/lib/pangea/activity_sessions/activity_unfinished_status_message.dart +++ b/lib/pangea/activity_sessions/activity_unfinished_status_message.dart @@ -36,7 +36,7 @@ class ActivityUnfinishedStatusMessageState final completed = widget.room.hasCompletedActivity; final availableRoles = widget.room.activityPlan!.roles; - final assignedRoles = widget.room.activityRoles?.roles ?? {}; + final assignedRoles = widget.room.assignedRoles ?? {}; final remainingRoles = availableRoles.length - assignedRoles.length; final unassignedIds = availableRoles.keys