add reaction content type

This commit is contained in:
Henry Hiles 2026-05-16 11:33:38 -04:00
commit 94f0d9e346
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
3 changed files with 22 additions and 24 deletions

View file

@ -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/requests/send_message_request.dart";
import "package:nexus/models/room.dart"; import "package:nexus/models/room.dart";
class RoomChatController extends AsyncNotifier<InMemoryChatController> { class RoomChatController extends AsyncNotifier<IList<Event>> {
final String roomId; final String roomId;
RoomChatController(this.roomId); RoomChatController(this.roomId);
@override @override
Future<InMemoryChatController> build() async { Future<IList<Event>> build() async {
final client = ref.watch(ClientController.provider.notifier); final client = ref.watch(ClientController.provider.notifier);
var room = ref.read(RoomsController.provider)[roomId]; var room = ref.read(RoomsController.provider)[roomId];
if (room == null) return InMemoryChatController(); if (room == null) return InMemoryChatController();
@ -204,7 +204,7 @@ class RoomChatController extends AsyncNotifier<InMemoryChatController> {
RedactEventRequest(eventId: message.id, roomId: roomId, reason: reason), RedactEventRequest(eventId: message.id, roomId: roomId, reason: reason),
); );
Future<bool> loadOlder([InMemoryChatController? chatController]) async { Future<bool> loadOlder() async {
final response = await ref final response = await ref
.watch(ClientController.provider.notifier) .watch(ClientController.provider.notifier)
.paginate( .paginate(
@ -239,26 +239,6 @@ class RoomChatController extends AsyncNotifier<InMemoryChatController> {
addToNewEvents: false, 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; return response.hasMore;
} }
@ -381,7 +361,7 @@ class RoomChatController extends AsyncNotifier<InMemoryChatController> {
} }
static final provider = AsyncNotifierProvider.family static final provider = AsyncNotifierProvider.family
.autoDispose<RoomChatController, InMemoryChatController, String>( .autoDispose<RoomChatController, IList<Event>, String>(
RoomChatController.new, RoomChatController.new,
); );
} }

View file

@ -10,6 +10,7 @@ import "package:nexus/models/content/message.dart";
import "package:nexus/models/content/name.dart"; import "package:nexus/models/content/name.dart";
import "package:nexus/models/content/pinned_events.dart"; import "package:nexus/models/content/pinned_events.dart";
import "package:nexus/models/content/power_levels.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/server_acl.dart";
import "package:nexus/models/content/topic.dart"; import "package:nexus/models/content/topic.dart";
@ -39,6 +40,7 @@ enum EventType {
avatar("m.room.avatar", AvatarContent.fromJson), avatar("m.room.avatar", AvatarContent.fromJson),
topic("m.room.topic", TopicContent.fromJson), topic("m.room.topic", TopicContent.fromJson),
name("m.room.name", NameContent.fromJson), name("m.room.name", NameContent.fromJson),
reaction("m.reaction", ReactionContent.fromJson),
pinnedEvents("m.room.pinned_events", PinnedEventsContent.fromJson), pinnedEvents("m.room.pinned_events", PinnedEventsContent.fromJson),
message("m.room.message", MessageContent.fromJson); message("m.room.message", MessageContent.fromJson);

View file

@ -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<String, dynamic> 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<String, Object?> json) =>
_$ReactionContentFromJson(json);
}