Fixes for reply handling

This commit is contained in:
Henry Hiles 2025-11-28 18:04:47 -05:00
commit 00ab2676b2
No known key found for this signature in database
4 changed files with 34 additions and 25 deletions

View file

@ -5,9 +5,12 @@ import "package:nexus/models/full_room.dart";
class CurrentRoomController extends AsyncNotifier<FullRoom?> { class CurrentRoomController extends AsyncNotifier<FullRoom?> {
@override @override
Future<FullRoom?> build() async => (await ref.watch( Future<FullRoom?> build() async {
SpacesController.provider.future, final spaces = await ref.watch(SpacesController.provider.future);
))[0].children[0].roomData.fullRoom;
if (spaces.isEmpty || spaces[0].children.isEmpty) return null;
return spaces[0].children[0].roomData.fullRoom;
}
Future<void> set(FullRoom room) async { Future<void> set(FullRoom room) async {
await future; await future;

View file

@ -33,14 +33,7 @@ class RoomChatController extends AsyncNotifier<ChatController> {
}).cancel, }).cancel,
); );
return InMemoryChatController( return InMemoryChatController(
messages: { messages: await response.chunk.toMessages(room),
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(),
); );
} }
@ -63,12 +56,9 @@ class RoomChatController extends AsyncNotifier<ChatController> {
final response = await ref final response = await ref
.watch(EventsController.provider(room).notifier) .watch(EventsController.provider(room).notifier)
.prev(); .prev();
await controller.insertAllMessages( await controller.insertAllMessages(
(await Future.wait( await response.chunk.toMessages(room),
response.chunk.map(
(event) => Event.fromMatrixEvent(event, room).toMessage(),
),
)).nonNulls.toList().reversed.toList(),
index: 0, index: 0,
); );
} }

View file

@ -56,7 +56,9 @@ extension ToMessage on Event {
? originServerTs ? originServerTs
: null; : null;
final body = newContent?["body"] as String? ?? this.body; 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; if (redacted) return null;
@ -140,3 +142,15 @@ extension ToTheme on ColorScheme {
), ),
); );
} }
extension ToMessages on List<MatrixEvent> {
Future<List<Message>> 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();
}
}

View file

@ -32,25 +32,27 @@ class TopWidget extends ConsumerWidget {
if (replyMessage == null) return SizedBox.shrink(); if (replyMessage == null) return SizedBox.shrink();
// Black magic to limit reply preview length // Black magic to limit reply preview length
final replyText = message is TextMessage final smallerText = message is TextMessage
? replyMessage.text.substring( ? replyMessage.text.substring(
0, 0,
min( min(
max( max(
min( max(
max( (message as TextMessage).text.length - 20,
(message as TextMessage).text.length - 20, message.metadata?["displayName"].length,
message.metadata?["displayName"].length,
),
replyMessage.text.length,
), ),
5, 5,
), ),
replyMessage.text.length, replyMessage.text.length,
), ),
) )
: replyMessage.text; : null;
final replyText = (smallerText == null)
? replyMessage.text
: "$smallerText...";
return InkWell( return InkWell(
// TODO: Scroll to original message
onTap: () => showAboutDialog(context: context), onTap: () => showAboutDialog(context: context),
child: Container( child: Container(
decoration: BoxDecoration( decoration: BoxDecoration(