diff --git a/lib/controllers/members_grouped_controller.dart b/lib/controllers/members_grouped_controller.dart index 1fc17a6..7cec625 100644 --- a/lib/controllers/members_grouped_controller.dart +++ b/lib/controllers/members_grouped_controller.dart @@ -4,33 +4,48 @@ import "package:nexus/controllers/members_by_status_controller.dart"; import "package:nexus/controllers/rooms_controller.dart"; import "package:nexus/models/configs/members_by_status_config.dart"; import "package:nexus/models/content/content.dart"; +import "package:nexus/models/content/create.dart"; import "package:nexus/models/content/power_levels.dart"; import "package:nexus/models/event.dart"; -class MembersGroupedController extends AsyncNotifier>> { +class MembersGroupedController extends AsyncNotifier>> { final MembersByStatusConfig config; MembersGroupedController(this.config); @override - Future>> build() async { - final event = ref.watch( - RoomsController.provider.select((value) { - final room = value[config.roomId]; - final eventRowId = room?.state[EventType.powerLevels.type]?[""]; - return eventRowId == null ? null : room?.events[eventRowId]; - }), + Future>> build() async { + final room = ref.watch( + RoomsController.provider.select((value) => value[config.roomId]), ); - final content = event?.content is PowerLevelsContent - ? event!.content as PowerLevelsContent - : PowerLevelsContent(); + final createRowId = room?.state[EventType.create.type]?[""]; + final createEvent = createRowId == null ? null : room?.events[createRowId]; + final createEventContent = switch (createEvent?.content) { + CreateContent content => content, + _ => null, + }; + final creators = createEventContent?.additionalCreatorIds.add( + createEvent!.sender, + ); + + final powerLevelsRowId = room?.state[EventType.powerLevels.type]?[""]; + final powerLevelsEvent = powerLevelsRowId == null + ? null + : room?.events[powerLevelsRowId]; + + final content = switch (powerLevelsEvent?.content) { + PowerLevelsContent content => content, + _ => PowerLevelsContent(), + }; final members = await ref.watch( MembersByStatusController.provider(config).future, ); - return members.fold>>(.new(), (result, event) { - final groupKey = content.users[event.stateKey!] ?? content.usersDefault; + return members.fold>>(.new(), (result, event) { + final groupKey = creators?.contains(event.stateKey!) == true + ? null + : content.users[event.stateKey!] ?? content.usersDefault; return result.update( groupKey, @@ -43,7 +58,7 @@ class MembersGroupedController extends AsyncNotifier>> { static final provider = AsyncNotifierProvider.family< MembersGroupedController, - IMap>, + IMap>, MembersByStatusConfig >(MembersGroupedController.new); } diff --git a/lib/models/content/create.dart b/lib/models/content/create.dart index 6921c04..c534558 100644 --- a/lib/models/content/create.dart +++ b/lib/models/content/create.dart @@ -8,8 +8,6 @@ part "create.g.dart"; abstract class CreateContent extends Content with _$CreateContent { CreateContent._(); factory CreateContent({ - @JsonKey(name: "creator") String? creatorId, - @JsonKey(name: "additional_creators") @Default(IList.empty()) IList additionalCreatorIds, diff --git a/lib/widgets/member_list.dart b/lib/widgets/member_list.dart index f80f403..1f8fbce 100644 --- a/lib/widgets/member_list.dart +++ b/lib/widgets/member_list.dart @@ -75,10 +75,14 @@ class MemberList extends HookConsumerWidget { children: [ for (final MapEntry(key: powerLevel, value: members) in value.toEntryIList( - compare: (a, b) => (b?.key ?? double.negativeInfinity) - .compareTo(a?.key ?? double.negativeInfinity), + compare: (a, b) => (b?.key ?? double.infinity) + .compareTo(a?.key ?? double.infinity), )) ...[ - DividerText("Power Level $powerLevel"), + DividerText( + powerLevel == null + ? "Creators" + : "Power Level $powerLevel", + ), SegmentedListSection( children: members .map(