Watch
1
0
Fork
You've already forked nexus
0
forked from Nexus/nexus

Compare commits

...
4 changed files with 27 additions and 46 deletions

View file

@ -1,15 +1,15 @@
import "package:collection/collection.dart";
import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:hooks_riverpod/hooks_riverpod.dart";
import "package:nexus/controllers/client_controller.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/controllers/rooms_controller.dart";
import "package:nexus/models/content/content.dart"; import "package:nexus/models/content/content.dart";
import "package:nexus/models/content/pinned_events.dart"; import "package:nexus/models/content/pinned_events.dart";
import "package:nexus/models/event.dart"; import "package:nexus/models/event.dart";
class RoomPinsController extends AsyncNotifier<IList<Event>> { class PinnedEventsController extends AsyncNotifier<IList<Event>> {
final String roomId; final String roomId;
RoomPinsController(this.roomId); PinnedEventsController(this.roomId);
@override @override
Future<IList<Event>> build() async { Future<IList<Event>> build() async {
@ -26,42 +26,19 @@ class RoomPinsController extends AsyncNotifier<IList<Event>> {
if (pinnedStateEvent == null) return .new(); if (pinnedStateEvent == null) return .new();
final pinnedContent = switch (pinnedStateEvent.content) { if (pinnedStateEvent.content case PinnedEventsContent content) {
PinnedEventsContent content => content, return (await Future.wait(
_ => null, content.pinnedEvents.map(
}; (eventId) => ref.watch(
EventController.provider(
if (pinnedContent == null || pinnedContent.pinned.isEmpty) { .new(eventId: eventId, roomId: roomId),
return .new(); ).future,
} ),
final localEvents = <Event>[];
final missingIds = <String>[];
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)),
), ),
); )).nonNulls.toIList();
localEvents.addAll(fetched.whereType<Event>());
} }
return localEvents.toIList(); return .new();
} }
Future<void> togglePin(Event event) async { Future<void> togglePin(Event event) async {
@ -86,7 +63,7 @@ class RoomPinsController extends AsyncNotifier<IList<Event>> {
} }
static final provider = AsyncNotifierProvider.family static final provider = AsyncNotifierProvider.family
.autoDispose<RoomPinsController, IList<Event>, String>( .autoDispose<PinnedEventsController, IList<Event>, String>(
RoomPinsController.new, PinnedEventsController.new,
); );
} }

View file

@ -7,8 +7,9 @@ part "pinned_events.g.dart";
@freezed @freezed
abstract class PinnedEventsContent extends Content with _$PinnedEventsContent { abstract class PinnedEventsContent extends Content with _$PinnedEventsContent {
PinnedEventsContent._(); PinnedEventsContent._();
factory PinnedEventsContent({@Default(IList.empty()) IList<String> pinned}) = factory PinnedEventsContent({
_PinnedEventsContent; @Default(IList.empty()) @JsonKey(name: "pinned") IList<String> pinnedEvents,
}) = _PinnedEventsContent;
factory PinnedEventsContent.fromJson(Map<String, Object?> json) => factory PinnedEventsContent.fromJson(Map<String, Object?> json) =>
_$PinnedEventsContentFromJson(json); _$PinnedEventsContentFromJson(json);

View file

@ -1,19 +1,19 @@
import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:flutter/material.dart"; import "package:flutter/material.dart";
import "package:hooks_riverpod/hooks_riverpod.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/models/event.dart";
import "package:nexus/widgets/loading.dart"; import "package:nexus/widgets/loading.dart";
import "package:nexus/widgets/renderers/event.dart"; import "package:nexus/widgets/renderers/event.dart";
class PinnedMessages extends HookConsumerWidget { class PinnedEventsDrawer extends HookConsumerWidget {
final String roomId; final String roomId;
final IList<PopupMenuEntry> Function(Event event)? getEventOptions; final IList<PopupMenuEntry> Function(Event event)? getEventOptions;
const PinnedMessages(this.roomId, {this.getEventOptions, super.key}); const PinnedEventsDrawer(this.roomId, {this.getEventOptions, super.key});
@override @override
Widget build(BuildContext context, WidgetRef ref) { 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); final theme = Theme.of(context);
return Column( return Column(

View file

@ -17,7 +17,7 @@ import "package:nexus/models/event.dart";
import "package:nexus/models/relation_type.dart"; import "package:nexus/models/relation_type.dart";
import "package:nexus/widgets/composer/composer.dart"; import "package:nexus/widgets/composer/composer.dart";
import "package:nexus/widgets/emoji_picker_button.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/renderers/event.dart";
import "package:nexus/widgets/member_list.dart"; import "package:nexus/widgets/member_list.dart";
import "package:nexus/widgets/room_appbar.dart"; import "package:nexus/widgets/room_appbar.dart";
@ -524,7 +524,10 @@ class RoomChat extends HookConsumerWidget {
shape: Border(), shape: Border(),
child: memberListOpened.value child: memberListOpened.value
? MemberList(roomId) ? MemberList(roomId)
: PinnedMessages(roomId, getEventOptions: getEventOptions), : PinnedEventsDrawer(
roomId,
getEventOptions: getEventOptions,
),
), ),
); );
} }