import 'dart:convert'; import 'package:http/http.dart' hide Client; import 'package:matrix/matrix.dart'; import 'package:matrix/matrix_api_lite/generated/api.dart'; import 'package:fluffychat/pangea/activity_planner/activity_plan_model.dart'; import 'package:fluffychat/pangea/activity_sessions/activity_role_model.dart'; import 'package:fluffychat/pangea/activity_sessions/activity_roles_model.dart'; import 'package:fluffychat/pangea/events/constants/pangea_event_types.dart'; extension RoomSummaryExtension on Api { Future getRoomSummaries(List roomIds) async { final requestUri = Uri( path: '/_synapse/client/unstable/org.pangea/room_preview', queryParameters: { 'rooms': roomIds.join(","), }, ); final request = Request('GET', baseUri!.resolveUri(requestUri)); request.headers['content-type'] = 'application/json'; request.headers['authorization'] = 'Bearer ${bearerToken!}'; final response = await httpClient.send(request); final responseBody = await response.stream.toBytes(); final responseString = utf8.decode(responseBody); if (response.statusCode != 200) { throw Exception( 'HTTP error response: statusCode=${response.statusCode}, body=$responseString', ); } final json = jsonDecode(responseString); return RoomSummariesResponse.fromJson(json); } } extension RoomSummaryRequest on Client { Future requestRoomSummaries(List roomIds) => getRoomSummaries(roomIds); } class RoomSummariesResponse { Map summaries; RoomSummariesResponse({required this.summaries}); factory RoomSummariesResponse.fromJson(Map json) { final summaries = {}; json["rooms"].forEach((key, value) { if (value.isNotEmpty) { summaries[key] = RoomSummaryResponse.fromJson(value); } }); return RoomSummariesResponse(summaries: summaries); } Map toJson() { final json = {}; summaries.forEach((key, value) { json[key] = value.toJson(); }); return json; } } class RoomSummaryResponse { final ActivityPlanModel activityPlan; final ActivityRolesModel activityRoles; final Map membershipSummary; RoomSummaryResponse({ required this.activityPlan, required this.activityRoles, required this.membershipSummary, }); Membership? getMembershipForUserId(String userId) { final membershipString = membershipSummary[userId]; if (membershipString == null) return null; return Membership.values.firstWhere( (m) => m.name == membershipString, orElse: () => Membership.join, ); } Map get joinedUsersWithRoles { return Map.fromEntries( activityRoles.roles.entries.where( (role) => getMembershipForUserId(role.value.userId) == Membership.join, ), ); } factory RoomSummaryResponse.fromJson(Map json) { return RoomSummaryResponse( activityPlan: ActivityPlanModel.fromJson( json[PangeaEventTypes.activityPlan]?["default"]?["content"] ?? {}, ), activityRoles: ActivityRolesModel.fromJson( json[PangeaEventTypes.activityRole]?["default"]?["content"] ?? {}, ), membershipSummary: Map.from( json['membership_summary'] ?? {}, ), ); } Map toJson() { return { PangeaEventTypes.activityPlan: activityPlan.toJson(), PangeaEventTypes.activityRole: activityRoles.toJson(), 'membership_summary': membershipSummary, }; } }