diff --git a/lib/controllers/room_pins_controller.dart b/lib/controllers/pinned_events_controller.dart similarity index 57% rename from lib/controllers/room_pins_controller.dart rename to lib/controllers/pinned_events_controller.dart index 7925d05..54d6196 100644 --- a/lib/controllers/room_pins_controller.dart +++ b/lib/controllers/pinned_events_controller.dart @@ -1,15 +1,15 @@ -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"; 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 { @@ -26,42 +26,19 @@ class RoomPinsController 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 { @@ -86,7 +63,7 @@ class RoomPinsController extends AsyncNotifier> { } static final provider = AsyncNotifierProvider.family - .autoDispose, String>( - RoomPinsController.new, + .autoDispose, String>( + PinnedEventsController.new, ); } 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); diff --git a/lib/widgets/pinned_messages.dart b/lib/widgets/pinned_events_drawer.dart similarity index 93% rename from lib/widgets/pinned_messages.dart rename to lib/widgets/pinned_events_drawer.dart index 5c6bce7..e018ce8 100644 --- a/lib/widgets/pinned_messages.dart +++ b/lib/widgets/pinned_events_drawer.dart @@ -1,19 +1,19 @@ 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"; -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) { - final pinsAsync = ref.watch(RoomPinsController.provider(roomId)); + final pinsAsync = ref.watch(PinnedEventsController.provider(roomId)); final theme = Theme.of(context); return Column( 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, + ), ), ); }