From 5bdf5d06b16251900184d480f9da0c99e16c718e Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Mon, 6 Jul 2026 20:07:02 -0400 Subject: [PATCH 1/3] rename RoomsPinsController to PinnedEventsController --- ...pins_controller.dart => pinned_events_controller.dart} | 8 ++++---- lib/widgets/pinned_messages.dart | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) rename lib/controllers/{room_pins_controller.dart => pinned_events_controller.dart} (92%) diff --git a/lib/controllers/room_pins_controller.dart b/lib/controllers/pinned_events_controller.dart similarity index 92% rename from lib/controllers/room_pins_controller.dart rename to lib/controllers/pinned_events_controller.dart index 7925d05..909bbfa 100644 --- a/lib/controllers/room_pins_controller.dart +++ b/lib/controllers/pinned_events_controller.dart @@ -7,9 +7,9 @@ import "package:nexus/models/content/content.dart"; import "package:nexus/models/content/pinned_events.dart"; import "package:nexus/models/event.dart"; -class RoomPinsController extends AsyncNotifier> { +class PinnedEventsController extends AsyncNotifier> { final String roomId; - RoomPinsController(this.roomId); + PinnedEventsController(this.roomId); @override Future> build() async { @@ -86,7 +86,7 @@ class RoomPinsController extends AsyncNotifier> { } static final provider = AsyncNotifierProvider.family - .autoDispose, String>( - RoomPinsController.new, + .autoDispose, String>( + PinnedEventsController.new, ); } diff --git a/lib/widgets/pinned_messages.dart b/lib/widgets/pinned_messages.dart index 5c6bce7..67133c9 100644 --- a/lib/widgets/pinned_messages.dart +++ b/lib/widgets/pinned_messages.dart @@ -1,7 +1,7 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter/material.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; -import "package:nexus/controllers/room_pins_controller.dart"; +import "package:nexus/controllers/pinned_events_controller.dart"; import "package:nexus/models/event.dart"; import "package:nexus/widgets/loading.dart"; import "package:nexus/widgets/renderers/event.dart"; @@ -13,7 +13,7 @@ class PinnedMessages extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final pinsAsync = ref.watch(RoomPinsController.provider(roomId)); + final pinsAsync = ref.watch(PinnedEventsController.provider(roomId)); final theme = Theme.of(context); return Column( From 5c78cc85f7ac80fc68d157e77a0a5717669b0bee Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Mon, 6 Jul 2026 20:07:30 -0400 Subject: [PATCH 2/3] rename PinnedMessages to PinnedEventsDrawer --- .../{pinned_messages.dart => pinned_events_drawer.dart} | 4 ++-- lib/widgets/room_chat.dart | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) rename lib/widgets/{pinned_messages.dart => pinned_events_drawer.dart} (96%) diff --git a/lib/widgets/pinned_messages.dart b/lib/widgets/pinned_events_drawer.dart similarity index 96% rename from lib/widgets/pinned_messages.dart rename to lib/widgets/pinned_events_drawer.dart index 67133c9..e018ce8 100644 --- a/lib/widgets/pinned_messages.dart +++ b/lib/widgets/pinned_events_drawer.dart @@ -6,10 +6,10 @@ import "package:nexus/models/event.dart"; import "package:nexus/widgets/loading.dart"; import "package:nexus/widgets/renderers/event.dart"; -class PinnedMessages extends HookConsumerWidget { +class PinnedEventsDrawer extends HookConsumerWidget { final String roomId; final IList Function(Event event)? getEventOptions; - const PinnedMessages(this.roomId, {this.getEventOptions, super.key}); + const PinnedEventsDrawer(this.roomId, {this.getEventOptions, super.key}); @override Widget build(BuildContext context, WidgetRef ref) { diff --git a/lib/widgets/room_chat.dart b/lib/widgets/room_chat.dart index 99d3b10..6c1715b 100644 --- a/lib/widgets/room_chat.dart +++ b/lib/widgets/room_chat.dart @@ -17,7 +17,7 @@ import "package:nexus/models/event.dart"; import "package:nexus/models/relation_type.dart"; import "package:nexus/widgets/composer/composer.dart"; import "package:nexus/widgets/emoji_picker_button.dart"; -import "package:nexus/widgets/pinned_messages.dart"; +import "package:nexus/widgets/pinned_events_drawer.dart"; import "package:nexus/widgets/renderers/event.dart"; import "package:nexus/widgets/member_list.dart"; import "package:nexus/widgets/room_appbar.dart"; @@ -524,7 +524,10 @@ class RoomChat extends HookConsumerWidget { shape: Border(), child: memberListOpened.value ? MemberList(roomId) - : PinnedMessages(roomId, getEventOptions: getEventOptions), + : PinnedEventsDrawer( + roomId, + getEventOptions: getEventOptions, + ), ), ); } From 177c057337bdd8d4063856bf364155429417cd09 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Mon, 6 Jul 2026 20:11:19 -0400 Subject: [PATCH 3/3] cleanup PinnedEventsController --- lib/controllers/pinned_events_controller.dart | 45 +++++-------------- lib/models/content/pinned_events.dart | 5 ++- 2 files changed, 14 insertions(+), 36 deletions(-) diff --git a/lib/controllers/pinned_events_controller.dart b/lib/controllers/pinned_events_controller.dart index 909bbfa..54d6196 100644 --- a/lib/controllers/pinned_events_controller.dart +++ b/lib/controllers/pinned_events_controller.dart @@ -1,7 +1,7 @@ -import "package:collection/collection.dart"; import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:nexus/controllers/client_controller.dart"; +import "package:nexus/controllers/event_controller.dart"; import "package:nexus/controllers/rooms_controller.dart"; import "package:nexus/models/content/content.dart"; import "package:nexus/models/content/pinned_events.dart"; @@ -26,42 +26,19 @@ class PinnedEventsController extends AsyncNotifier> { if (pinnedStateEvent == null) return .new(); - final pinnedContent = switch (pinnedStateEvent.content) { - PinnedEventsContent content => content, - _ => null, - }; - - if (pinnedContent == null || pinnedContent.pinned.isEmpty) { - return .new(); - } - - final localEvents = []; - final missingIds = []; - - for (final eventId in pinnedContent.pinned) { - final localEvent = room.events.values.firstWhereOrNull( - (e) => e.eventId == eventId, - ); - - if (localEvent != null) { - localEvents.add(localEvent); - } else { - missingIds.add(eventId); - } - } - - if (missingIds.isNotEmpty) { - final client = ref.read(ClientController.provider.notifier); - final fetched = await Future.wait( - missingIds.map( - (id) => client.getEvent(.new(roomId: roomId, eventId: id)), + if (pinnedStateEvent.content case PinnedEventsContent content) { + return (await Future.wait( + content.pinnedEvents.map( + (eventId) => ref.watch( + EventController.provider( + .new(eventId: eventId, roomId: roomId), + ).future, + ), ), - ); - - localEvents.addAll(fetched.whereType()); + )).nonNulls.toIList(); } - return localEvents.toIList(); + return .new(); } Future togglePin(Event event) async { diff --git a/lib/models/content/pinned_events.dart b/lib/models/content/pinned_events.dart index d17a0de..8aea838 100644 --- a/lib/models/content/pinned_events.dart +++ b/lib/models/content/pinned_events.dart @@ -7,8 +7,9 @@ part "pinned_events.g.dart"; @freezed abstract class PinnedEventsContent extends Content with _$PinnedEventsContent { PinnedEventsContent._(); - factory PinnedEventsContent({@Default(IList.empty()) IList pinned}) = - _PinnedEventsContent; + factory PinnedEventsContent({ + @Default(IList.empty()) @JsonKey(name: "pinned") IList pinnedEvents, + }) = _PinnedEventsContent; factory PinnedEventsContent.fromJson(Map json) => _$PinnedEventsContentFromJson(json);