From defe47a1988434b0b9c2f2cae08919e52dcd760f Mon Sep 17 00:00:00 2001 From: Mohammad Reza Moradi Date: Thu, 10 Apr 2025 11:49:35 +0200 Subject: [PATCH] fix: deleting last message is edited --- lib/src/client.dart | 24 ++++++++++++++++++++---- test/room_test.dart | 3 ++- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/lib/src/client.dart b/lib/src/client.dart index 264414bf..afc54e5d 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -2854,7 +2854,7 @@ class Client extends MatrixApi { room.setState(user); } } - _updateRoomsByEventUpdate(room, event, type); + await _updateRoomsByEventUpdate(room, event, type); if (store) { await database?.storeEventUpdate(room.id, event, type, this); } @@ -3020,11 +3020,11 @@ class Client extends MatrixApi { return room; } - void _updateRoomsByEventUpdate( + Future _updateRoomsByEventUpdate( Room room, StrippedStateEvent eventUpdate, EventUpdateType type, - ) { + ) async { if (type == EventUpdateType.history) return; switch (type) { @@ -3060,13 +3060,29 @@ class Client extends MatrixApi { if (event.type == EventTypes.Redaction && ({ room.lastEvent?.eventId, - room.lastEvent?.relationshipEventId, }.contains( event.redacts ?? event.content.tryGet('redacts'), ))) { room.lastEvent?.setRedactionEvent(event); break; } + // Is this event redacting the last event which is a edited event. + final relationshipEventId = room.lastEvent?.relationshipEventId; + if (relationshipEventId != null && + relationshipEventId == + (event.redacts ?? event.content.tryGet('redacts')) && + event.type == EventTypes.Redaction && + room.lastEvent?.relationshipType == RelationshipTypes.edit) { + final originalEvent = await database?.getEventById( + relationshipEventId, + room, + ) ?? + room.lastEvent; + // Manually remove the data as it's already in cache until relogin. + originalEvent?.setRedactionEvent(event); + room.lastEvent = originalEvent; + break; + } // Is this event an edit of the last event? Otherwise ignore it. if (event.relationshipType == RelationshipTypes.edit) { diff --git a/test/room_test.dart b/test/room_test.dart index c13d692e..1be822f9 100644 --- a/test/room_test.dart +++ b/test/room_test.dart @@ -509,7 +509,8 @@ void main() { nextBatch: '', ), ); - expect(room.lastEvent?.eventId, 'testLastEventAfterEdit'); + // We do not delete the last edited event. Manually set the last event to original redacted event. + expect(room.lastEvent?.eventId, 'testLastEventBeforeEdit'); expect(room.lastEvent?.body, 'Redacted'); });