From 9bc2d9955abf2cde236dec6e7170f9aa60711f30 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Tue, 29 Sep 2026 15:17:35 -0400 Subject: [PATCH] make relatedEvent store a rowId --- lib/controllers/room_chat.dart | 20 +++++++++++++------ .../extensions/build_event_options.dart | 6 +++--- lib/widgets/composer/composer.dart | 11 ++++++++-- lib/widgets/room_chat/room_chat.dart | 8 ++++---- 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/lib/controllers/room_chat.dart b/lib/controllers/room_chat.dart index b100f93..a2d9590 100644 --- a/lib/controllers/room_chat.dart +++ b/lib/controllers/room_chat.dart @@ -213,11 +213,19 @@ class RoomChatController(final ChatParams info) bool shouldMention = true, required IList tags, required RelationType relationType, - Event? relation, + int? relatedEventRowId, }) async { Content? baseContent; + final relatedEvent = relatedEventRowId == null + ? null + : ref.watch( + RoomsController.provider.select( + (rooms) => rooms[info.roomId]?.events[relatedEventRowId], + ), + ); + if (relationType == .edit) { - baseContent = relation?.content; + baseContent = relatedEvent?.content; } else { final provider = AttachmentController.provider(info.roomId); baseContent = ref.read(provider)?.$2; @@ -244,16 +252,16 @@ class RoomChatController(final ChatParams info) mentions: Mentions( userIds: [ if (shouldMention == true && - relation != null && + relatedEvent != null && relationType == RelationType.reply) - relation.sender, + relatedEvent.sender, ].toIList(), room: taggedMessage.contains("@room"), ), text: taggedMessage, - relation: relation == null + relation: relatedEvent == null ? null - : .new(eventId: relation.eventId, relationType: relationType), + : .new(eventId: relatedEvent.eventId, relationType: relationType), ), ); diff --git a/lib/helpers/extensions/build_event_options.dart b/lib/helpers/extensions/build_event_options.dart index 21009e7..d8a8e83 100644 --- a/lib/helpers/extensions/build_event_options.dart +++ b/lib/helpers/extensions/build_event_options.dart @@ -22,7 +22,7 @@ extension BuildEventOptions on Event { required WidgetRef ref, required String roomId, required String userId, - required void Function(Event, RelationType) onRelation, + required void Function(int, RelationType) onRelation, }) { final theme = Theme.of(context); final danger = theme.colorScheme.error; @@ -150,7 +150,7 @@ extension BuildEventOptions on Event { ), )) PopupMenuItem( - onTap: () => onRelation(this, .reply), + onTap: () => onRelation(rowId, .reply), child: const ListTile( leading: Icon(Icons.reply), title: Text("Reply"), @@ -159,7 +159,7 @@ extension BuildEventOptions on Event { if (content is MessageContent && sender == userId) PopupMenuItem( - onTap: () => onRelation(this, .edit), + onTap: () => onRelation(rowId, .edit), child: const ListTile(leading: Icon(Icons.edit), title: Text("Edit")), ), diff --git a/lib/widgets/composer/composer.dart b/lib/widgets/composer/composer.dart index 3d04a78..4c9ea4e 100644 --- a/lib/widgets/composer/composer.dart +++ b/lib/widgets/composer/composer.dart @@ -2,6 +2,7 @@ import "dart:io"; import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:file_selector/file_selector.dart"; +import "package:nexus/controllers/rooms.dart"; import "package:nexus/widgets/emoji_picker.dart"; import "package:material_ui/material_ui.dart"; import "package:flutter/services.dart"; @@ -12,7 +13,6 @@ import "package:nexus/controllers/attachment.dart"; import "package:nexus/controllers/image_picker.dart"; import "package:nexus/controllers/power_level.dart"; import "package:nexus/models/content/message.dart"; -import "package:nexus/models/event.dart"; import "package:nexus/models/relation_type.dart"; import "package:nexus/widgets/composer/overlays/tagger_overlay.dart"; import "package:nexus/widgets/composer/relation_preview.dart"; @@ -20,7 +20,7 @@ import "package:nexus/main.dart"; class const Composer( final String roomId, { - required final Event? relatedEvent, + required final int? relatedEvent, required final RelationType relationType, required final VoidCallback onDismiss, required final Future Function( @@ -39,6 +39,13 @@ class const Composer( final triggerCharacter = useState(""); final shouldMention = useState(true); final query = useState(""); + final relatedEvent = this.relatedEvent == null + ? null + : ref.watch( + RoomsController.provider.select( + (rooms) => rooms[roomId]?.events[this.relatedEvent!], + ), + ); if (relationType == .edit && controller.value.text.isEmpty) { controller.value.text = diff --git a/lib/widgets/room_chat/room_chat.dart b/lib/widgets/room_chat/room_chat.dart index 45c7e8a..122f3cc 100644 --- a/lib/widgets/room_chat/room_chat.dart +++ b/lib/widgets/room_chat/room_chat.dart @@ -29,7 +29,7 @@ final class const RoomChat({ }) extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final relatedEvent = useState(null); + final relatedEvent = useState(null); final relationType = useState(RelationType.reply); final contextualEvent = useState(initialHighlight); final highlightedEvent = useState(null); @@ -132,8 +132,8 @@ final class const RoomChat({ ref: ref, roomId: roomId, userId: userId, - onRelation: (event, type) { - relatedEvent.value = event; + onRelation: (rowId, type) { + relatedEvent.value = rowId; relationType.value = type; composerNode.requestFocus(); }, @@ -210,7 +210,7 @@ final class const RoomChat({ tags: tags, relationType: relationType.value, shouldMention: shouldMention, - relation: relatedEvent.value, + relatedEventRowId: relatedEvent.value, ) .onError(showError), relationType: relationType.value,