From 94f0d9e3465225cfad8a5acc915ff706e2e35783 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Sat, 16 May 2026 11:33:38 -0400 Subject: [PATCH] add reaction content type --- lib/controllers/room_chat_controller.dart | 28 ++++------------------- lib/models/content/content.dart | 2 ++ lib/models/content/reaction.dart | 16 +++++++++++++ 3 files changed, 22 insertions(+), 24 deletions(-) create mode 100644 lib/models/content/reaction.dart diff --git a/lib/controllers/room_chat_controller.dart b/lib/controllers/room_chat_controller.dart index a9e838b..e99b5a2 100644 --- a/lib/controllers/room_chat_controller.dart +++ b/lib/controllers/room_chat_controller.dart @@ -20,12 +20,12 @@ import "package:nexus/models/requests/send_event_request.dart"; import "package:nexus/models/requests/send_message_request.dart"; import "package:nexus/models/room.dart"; -class RoomChatController extends AsyncNotifier { +class RoomChatController extends AsyncNotifier> { final String roomId; RoomChatController(this.roomId); @override - Future build() async { + Future> build() async { final client = ref.watch(ClientController.provider.notifier); var room = ref.read(RoomsController.provider)[roomId]; if (room == null) return InMemoryChatController(); @@ -204,7 +204,7 @@ class RoomChatController extends AsyncNotifier { RedactEventRequest(eventId: message.id, roomId: roomId, reason: reason), ); - Future loadOlder([InMemoryChatController? chatController]) async { + Future loadOlder() async { final response = await ref .watch(ClientController.provider.notifier) .paginate( @@ -239,26 +239,6 @@ class RoomChatController extends AsyncNotifier { addToNewEvents: false, ); - final room = ref.read(RoomsController.provider)[roomId]; - if (room != null) { - final messages = await ref.watch( - MessagesController.provider( - MessagesConfig(room: room, events: response.events.reversed), - ).future, - ); - - final controller = chatController ?? await future; - await controller.insertAllMessages( - messages - .where( - (newMessage) => !controller.messages.any( - (message) => message.id == newMessage.id, - ), - ) - .toList(), - index: 0, - ); - } return response.hasMore; } @@ -381,7 +361,7 @@ class RoomChatController extends AsyncNotifier { } static final provider = AsyncNotifierProvider.family - .autoDispose( + .autoDispose, String>( RoomChatController.new, ); } diff --git a/lib/models/content/content.dart b/lib/models/content/content.dart index 9e145c1..ec729f5 100644 --- a/lib/models/content/content.dart +++ b/lib/models/content/content.dart @@ -10,6 +10,7 @@ import "package:nexus/models/content/message.dart"; import "package:nexus/models/content/name.dart"; import "package:nexus/models/content/pinned_events.dart"; import "package:nexus/models/content/power_levels.dart"; +import "package:nexus/models/content/reaction.dart"; import "package:nexus/models/content/server_acl.dart"; import "package:nexus/models/content/topic.dart"; @@ -39,6 +40,7 @@ enum EventType { avatar("m.room.avatar", AvatarContent.fromJson), topic("m.room.topic", TopicContent.fromJson), name("m.room.name", NameContent.fromJson), + reaction("m.reaction", ReactionContent.fromJson), pinnedEvents("m.room.pinned_events", PinnedEventsContent.fromJson), message("m.room.message", MessageContent.fromJson); diff --git a/lib/models/content/reaction.dart b/lib/models/content/reaction.dart new file mode 100644 index 0000000..7cdec08 --- /dev/null +++ b/lib/models/content/reaction.dart @@ -0,0 +1,16 @@ +import "package:freezed_annotation/freezed_annotation.dart"; +import "package:nexus/models/content/content.dart"; +part "reaction.freezed.dart"; +part "reaction.g.dart"; + +String? keyFromJson(Map json) => json["m.relates_to"]?["key"]; + +@freezed +abstract class ReactionContent extends Content with _$ReactionContent { + ReactionContent._(); + const factory ReactionContent({@JsonKey(fromJson: keyFromJson) String? key}) = + _ReactionContent; + + factory ReactionContent.fromJson(Map json) => + _$ReactionContentFromJson(json); +}