make relatedEvent store a rowId

This commit is contained in:
Henry Hiles 2026-09-29 15:17:35 -04:00
commit 9bc2d9955a
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
4 changed files with 30 additions and 15 deletions

View file

@ -213,11 +213,19 @@ class RoomChatController(final ChatParams info)
bool shouldMention = true, bool shouldMention = true,
required IList<Tag> tags, required IList<Tag> tags,
required RelationType relationType, required RelationType relationType,
Event? relation, int? relatedEventRowId,
}) async { }) async {
Content? baseContent; Content? baseContent;
final relatedEvent = relatedEventRowId == null
? null
: ref.watch(
RoomsController.provider.select(
(rooms) => rooms[info.roomId]?.events[relatedEventRowId],
),
);
if (relationType == .edit) { if (relationType == .edit) {
baseContent = relation?.content; baseContent = relatedEvent?.content;
} else { } else {
final provider = AttachmentController.provider(info.roomId); final provider = AttachmentController.provider(info.roomId);
baseContent = ref.read(provider)?.$2; baseContent = ref.read(provider)?.$2;
@ -244,16 +252,16 @@ class RoomChatController(final ChatParams info)
mentions: Mentions( mentions: Mentions(
userIds: [ userIds: [
if (shouldMention == true && if (shouldMention == true &&
relation != null && relatedEvent != null &&
relationType == RelationType.reply) relationType == RelationType.reply)
relation.sender, relatedEvent.sender,
].toIList(), ].toIList(),
room: taggedMessage.contains("@room"), room: taggedMessage.contains("@room"),
), ),
text: taggedMessage, text: taggedMessage,
relation: relation == null relation: relatedEvent == null
? null ? null
: .new(eventId: relation.eventId, relationType: relationType), : .new(eventId: relatedEvent.eventId, relationType: relationType),
), ),
); );

View file

@ -22,7 +22,7 @@ extension BuildEventOptions on Event {
required WidgetRef ref, required WidgetRef ref,
required String roomId, required String roomId,
required String userId, required String userId,
required void Function(Event, RelationType) onRelation, required void Function(int, RelationType) onRelation,
}) { }) {
final theme = Theme.of(context); final theme = Theme.of(context);
final danger = theme.colorScheme.error; final danger = theme.colorScheme.error;
@ -150,7 +150,7 @@ extension BuildEventOptions on Event {
), ),
)) ))
PopupMenuItem( PopupMenuItem(
onTap: () => onRelation(this, .reply), onTap: () => onRelation(rowId, .reply),
child: const ListTile( child: const ListTile(
leading: Icon(Icons.reply), leading: Icon(Icons.reply),
title: Text("Reply"), title: Text("Reply"),
@ -159,7 +159,7 @@ extension BuildEventOptions on Event {
if (content is MessageContent && sender == userId) if (content is MessageContent && sender == userId)
PopupMenuItem( PopupMenuItem(
onTap: () => onRelation(this, .edit), onTap: () => onRelation(rowId, .edit),
child: const ListTile(leading: Icon(Icons.edit), title: Text("Edit")), child: const ListTile(leading: Icon(Icons.edit), title: Text("Edit")),
), ),

View file

@ -2,6 +2,7 @@ import "dart:io";
import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:file_selector/file_selector.dart"; import "package:file_selector/file_selector.dart";
import "package:nexus/controllers/rooms.dart";
import "package:nexus/widgets/emoji_picker.dart"; import "package:nexus/widgets/emoji_picker.dart";
import "package:material_ui/material_ui.dart"; import "package:material_ui/material_ui.dart";
import "package:flutter/services.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/image_picker.dart";
import "package:nexus/controllers/power_level.dart"; import "package:nexus/controllers/power_level.dart";
import "package:nexus/models/content/message.dart"; import "package:nexus/models/content/message.dart";
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/overlays/tagger_overlay.dart"; import "package:nexus/widgets/composer/overlays/tagger_overlay.dart";
import "package:nexus/widgets/composer/relation_preview.dart"; import "package:nexus/widgets/composer/relation_preview.dart";
@ -20,7 +20,7 @@ import "package:nexus/main.dart";
class const Composer( class const Composer(
final String roomId, { final String roomId, {
required final Event? relatedEvent, required final int? relatedEvent,
required final RelationType relationType, required final RelationType relationType,
required final VoidCallback onDismiss, required final VoidCallback onDismiss,
required final Future<void> Function( required final Future<void> Function(
@ -39,6 +39,13 @@ class const Composer(
final triggerCharacter = useState(""); final triggerCharacter = useState("");
final shouldMention = useState(true); final shouldMention = useState(true);
final query = useState(""); 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) { if (relationType == .edit && controller.value.text.isEmpty) {
controller.value.text = controller.value.text =

View file

@ -29,7 +29,7 @@ final class const RoomChat({
}) extends HookConsumerWidget { }) extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final relatedEvent = useState<Event?>(null); final relatedEvent = useState<int?>(null);
final relationType = useState(RelationType.reply); final relationType = useState(RelationType.reply);
final contextualEvent = useState<int?>(initialHighlight); final contextualEvent = useState<int?>(initialHighlight);
final highlightedEvent = useState<int?>(null); final highlightedEvent = useState<int?>(null);
@ -132,8 +132,8 @@ final class const RoomChat({
ref: ref, ref: ref,
roomId: roomId, roomId: roomId,
userId: userId, userId: userId,
onRelation: (event, type) { onRelation: (rowId, type) {
relatedEvent.value = event; relatedEvent.value = rowId;
relationType.value = type; relationType.value = type;
composerNode.requestFocus(); composerNode.requestFocus();
}, },
@ -210,7 +210,7 @@ final class const RoomChat({
tags: tags, tags: tags,
relationType: relationType.value, relationType: relationType.value,
shouldMention: shouldMention, shouldMention: shouldMention,
relation: relatedEvent.value, relatedEventRowId: relatedEvent.value,
) )
.onError(showError), .onError(showError),
relationType: relationType.value, relationType: relationType.value,