From 00ab2676b2ede0e331746e3f46b4387ebb9ededa Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Fri, 28 Nov 2025 18:04:47 -0500 Subject: [PATCH] Fixes for reply handling --- lib/controllers/current_room_controller.dart | 9 ++++++--- lib/controllers/room_chat_controller.dart | 16 +++------------- lib/helpers/extension_helper.dart | 16 +++++++++++++++- lib/widgets/chat_page/top_widget.dart | 18 ++++++++++-------- 4 files changed, 34 insertions(+), 25 deletions(-) diff --git a/lib/controllers/current_room_controller.dart b/lib/controllers/current_room_controller.dart index e698bcc..8e09ef1 100644 --- a/lib/controllers/current_room_controller.dart +++ b/lib/controllers/current_room_controller.dart @@ -5,9 +5,12 @@ import "package:nexus/models/full_room.dart"; class CurrentRoomController extends AsyncNotifier { @override - Future build() async => (await ref.watch( - SpacesController.provider.future, - ))[0].children[0].roomData.fullRoom; + Future build() async { + final spaces = await ref.watch(SpacesController.provider.future); + + if (spaces.isEmpty || spaces[0].children.isEmpty) return null; + return spaces[0].children[0].roomData.fullRoom; + } Future set(FullRoom room) async { await future; diff --git a/lib/controllers/room_chat_controller.dart b/lib/controllers/room_chat_controller.dart index b06c311..9fd1445 100644 --- a/lib/controllers/room_chat_controller.dart +++ b/lib/controllers/room_chat_controller.dart @@ -33,14 +33,7 @@ class RoomChatController extends AsyncNotifier { }).cancel, ); return InMemoryChatController( - messages: { - for (var msg in (await Future.wait( - response.chunk.map( - (event) => Event.fromMatrixEvent(event, room).toMessage(), - ), - )).nonNulls.toList().reversed.toList()) - msg.id: msg, - }.values.toList(), + messages: await response.chunk.toMessages(room), ); } @@ -63,12 +56,9 @@ class RoomChatController extends AsyncNotifier { final response = await ref .watch(EventsController.provider(room).notifier) .prev(); + await controller.insertAllMessages( - (await Future.wait( - response.chunk.map( - (event) => Event.fromMatrixEvent(event, room).toMessage(), - ), - )).nonNulls.toList().reversed.toList(), + await response.chunk.toMessages(room), index: 0, ); } diff --git a/lib/helpers/extension_helper.dart b/lib/helpers/extension_helper.dart index af5d0e7..26199ef 100644 --- a/lib/helpers/extension_helper.dart +++ b/lib/helpers/extension_helper.dart @@ -56,7 +56,9 @@ extension ToMessage on Event { ? originServerTs : null; final body = newContent?["body"] as String? ?? this.body; - final eventId = relationshipEventId ?? this.eventId; + final eventId = editedAt == null + ? this.eventId + : relationshipEventId ?? this.eventId; if (redacted) return null; @@ -140,3 +142,15 @@ extension ToTheme on ColorScheme { ), ); } + +extension ToMessages on List { + Future> toMessages(Room room) async { + final messages = await Future.wait( + map((event) => Event.fromMatrixEvent(event, room).toMessage()), + ); + + return { + for (var msg in messages.nonNulls.toList().reversed.toList()) msg.id: msg, + }.values.toList(); + } +} diff --git a/lib/widgets/chat_page/top_widget.dart b/lib/widgets/chat_page/top_widget.dart index 3d40b08..8dd92e6 100644 --- a/lib/widgets/chat_page/top_widget.dart +++ b/lib/widgets/chat_page/top_widget.dart @@ -32,25 +32,27 @@ class TopWidget extends ConsumerWidget { if (replyMessage == null) return SizedBox.shrink(); // Black magic to limit reply preview length - final replyText = message is TextMessage + final smallerText = message is TextMessage ? replyMessage.text.substring( 0, min( max( - min( - max( - (message as TextMessage).text.length - 20, - message.metadata?["displayName"].length, - ), - replyMessage.text.length, + max( + (message as TextMessage).text.length - 20, + message.metadata?["displayName"].length, ), 5, ), replyMessage.text.length, ), ) - : replyMessage.text; + : null; + final replyText = (smallerText == null) + ? replyMessage.text + : "$smallerText..."; + return InkWell( + // TODO: Scroll to original message onTap: () => showAboutDialog(context: context), child: Container( decoration: BoxDecoration(