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,
required IList<Tag> 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),
),
);

View file

@ -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")),
),

View file

@ -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<void> 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 =

View file

@ -29,7 +29,7 @@ final class const RoomChat({
}) extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final relatedEvent = useState<Event?>(null);
final relatedEvent = useState<int?>(null);
final relationType = useState(RelationType.reply);
final contextualEvent = useState<int?>(initialHighlight);
final highlightedEvent = useState<int?>(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,