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?> {
@override
Future<FullRoom?> build() async => (await ref.watch(
SpacesController.provider.future,
))[0].children[0].roomData.fullRoom;
Future<FullRoom?> 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<void> set(FullRoom room) async {
await future;

View file

@ -33,14 +33,7 @@ class RoomChatController extends AsyncNotifier<ChatController> {
}).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<ChatController> {
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,
);
}

View file

@ -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<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();
// 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(