diff --git a/lib/pangea/activity_sessions/activity_room_extension.dart b/lib/pangea/activity_sessions/activity_room_extension.dart index 185b5977a..974cc5b1c 100644 --- a/lib/pangea/activity_sessions/activity_room_extension.dart +++ b/lib/pangea/activity_sessions/activity_room_extension.dart @@ -24,8 +24,25 @@ import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; import 'package:fluffychat/widgets/matrix.dart'; import '../activity_summary/activity_summary_repo.dart'; +class RoleException implements Exception { + final String message; + RoleException(this.message); + + @override + String toString() => "RoleException: $message"; +} + extension ActivityRoomExtension on Room { Future joinActivity(ActivityRole role) async { + final assigned = assignedRoles?.values ?? []; + if (assigned.any((r) => r.userId != client.userID && r.role == role.name)) { + throw RoleException("Role already taken"); + } + + if (assigned.any((r) => r.userId == client.userID)) { + throw RoleException("User already has a role"); + } + final currentRoles = activityRoles ?? ActivityRolesModel.empty; final activityRole = ActivityRoleModel( id: role.id, diff --git a/lib/pangea/activity_sessions/activity_session_start/activity_session_start_page.dart b/lib/pangea/activity_sessions/activity_session_start/activity_session_start_page.dart index f693ff229..a685e5a0e 100644 --- a/lib/pangea/activity_sessions/activity_session_start/activity_session_start_page.dart +++ b/lib/pangea/activity_sessions/activity_session_start/activity_session_start_page.dart @@ -161,7 +161,9 @@ class ActivitySessionStartController extends State } final availableRoles = activity!.roles; - final assignedRoles = activityRoom?.assignedRoles ?? {}; + final assignedRoles = activityRoom?.assignedRoles ?? + roomSummaries?[widget.roomId]?.activityRoles.roles ?? + {}; final unassignedIds = availableRoles.keys .where((id) => !assignedRoles.containsKey(id)) .toList(); @@ -273,9 +275,15 @@ class ActivitySessionStartController extends State } } - await activityRoom!.joinActivity( - activity!.roles[_selectedRoleId!]!, - ); + try { + await activityRoom!.joinActivity( + activity!.roles[_selectedRoleId!]!, + ); + } catch (e) { + if (e is! RoleException) { + rethrow; + } + } context.go("/rooms/spaces/${widget.parentId}/${widget.roomId}"); }