diff --git a/lib/controllers/room_chat_controller.dart b/lib/controllers/room_chat_controller.dart index 99cb32a..a13a801 100644 --- a/lib/controllers/room_chat_controller.dart +++ b/lib/controllers/room_chat_controller.dart @@ -62,11 +62,21 @@ class RoomChatController extends AsyncNotifier> { } return room.timeline.reversed - .map( - (timeline) => room.events.firstWhereOrNull( + .map((timeline) { + final foundEvent = room.events.firstWhereOrNull( (event) => event.rowId == timeline.eventRowId, - ), - ) + ); + + final editedEvent = foundEvent?.lastEditRowId == 0 + ? null + : room.events.firstWhereOrNull( + (event) => event.rowId == foundEvent?.lastEditRowId, + ); + + return foundEvent?.copyWith( + content: editedEvent?.content ?? foundEvent.content, + ); + }) .nonNulls .toIList(); } diff --git a/lib/models/event.dart b/lib/models/event.dart index 51d8c9f..6f8d362 100644 --- a/lib/models/event.dart +++ b/lib/models/event.dart @@ -34,7 +34,7 @@ abstract class Event with _$Event { String? decryptionError, String? sendError, @Default(IMap.empty()) IMap reactions, - @JsonKey(name: "last_edit_rowid") int? lastEditRowId, + @JsonKey(name: "last_edit_rowid") @Default(0) int lastEditRowId, @UnreadTypeConverter() UnreadType? unreadType, @JsonKey(fromJson: Event.pmpFromJson) Profile? pmp, required Content content, @@ -44,7 +44,9 @@ abstract class Event with _$Event { factory Event.fromJson(Map json) => _$EventFromJson(json).copyWith( content: Content.fromEventJson( - json["decrypted"] ?? json["content"], + (json["decrypted"] ?? json["content"])["m.new_content"] ?? + json["decrypted"] ?? + json["content"], json["decrypted_type"] ?? json["type"], ), previousContent: json["unsigned"]?["prev_content"] == null diff --git a/lib/widgets/renderers/event.dart b/lib/widgets/renderers/event.dart index c4cf6e4..0814887 100644 --- a/lib/widgets/renderers/event.dart +++ b/lib/widgets/renderers/event.dart @@ -75,7 +75,7 @@ class EventRenderer extends ConsumerWidget { fontStyle: event.content is EmoteMessageContent ? FontStyle.italic : null, ); - final child = event.redactedBy != null + final child = event.redactedBy != null || event.relationType == "m.replace" ? null : switch (event.content) { Content(:final parseError?) => SelectableText( @@ -344,8 +344,7 @@ class EventRenderer extends ConsumerWidget { style: errorStyle, ), }, - if (event.lastEditRowId != null && - !textOnly) + if (event.lastEditRowId != 0 && !textOnly) Text( "(edited)", style: theme.textTheme.labelSmall,