From 869a7f41a9cbe5690f0853d8b44914a21468e37f Mon Sep 17 00:00:00 2001 From: td Date: Mon, 1 Jul 2024 21:31:13 +0530 Subject: [PATCH] fix: lastEvent after edit and redact --- lib/src/client.dart | 7 +++- lib/src/room.dart | 14 ++++--- test/room_test.dart | 99 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 111 insertions(+), 9 deletions(-) diff --git a/lib/src/client.dart b/lib/src/client.dart index f11824c9..45974ee6 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -2443,8 +2443,11 @@ class Client extends MatrixApi { // Is this event redacting the last event? if (event.type == EventTypes.Redaction && - (event.content.tryGet('redacts') ?? event.redacts) == - room.lastEvent?.eventId) { + ({ + room.lastEvent?.eventId, + room.lastEvent?.relationshipEventId + }.contains( + event.redacts ?? event.content.tryGet('redacts')))) { room.lastEvent?.setRedactionEvent(event); break; } diff --git a/lib/src/room.dart b/lib/src/room.dart index b503dfd3..03483dff 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -649,12 +649,14 @@ class Room { event['formatted_body'] = html; } } - return sendEvent(event, - txid: txid, - inReplyTo: inReplyTo, - editEventId: editEventId, - threadRootEventId: threadRootEventId, - threadLastEventId: threadLastEventId); + return sendEvent( + event, + txid: txid, + inReplyTo: inReplyTo, + editEventId: editEventId, + threadRootEventId: threadRootEventId, + threadLastEventId: threadLastEventId, + ); } /// Sends a reaction to an event with an [eventId] and the content [key] into a room. diff --git a/test/room_test.dart b/test/room_test.dart index a6935cee..bce84f5a 100644 --- a/test/room_test.dart +++ b/test/room_test.dart @@ -363,6 +363,103 @@ void main() { expect(room.lastEvent?.status, EventStatus.sent); }); + test('lastEvent when edited and deleted', () async { + await room.client.handleSync( + SyncUpdate( + rooms: RoomsUpdate( + join: { + room.id: JoinedRoomUpdate( + timeline: TimelineUpdate( + events: [ + Event( + content: { + 'body': 'A', + 'm.mentions': {}, + 'msgtype': 'm.text' + }, + type: 'm.room.message', + eventId: 'testLastEventBeforeEdit', + senderId: '@test:example.com', + originServerTs: DateTime.now(), + room: room, + ), + ], + ), + ), + }, + ), + nextBatch: '', + ), + ); + expect(room.lastEvent?.eventId, 'testLastEventBeforeEdit'); + expect(room.lastEvent?.body, 'A'); + + await room.client.handleSync( + SyncUpdate( + rooms: RoomsUpdate( + join: { + room.id: JoinedRoomUpdate( + timeline: TimelineUpdate( + events: [ + Event( + content: { + 'body': ' * A-edited', + 'm.mentions': {}, + 'm.new_content': { + 'body': 'A-edited', + 'm.mentions': {}, + 'msgtype': 'm.text' + }, + 'm.relates_to': { + 'event_id': 'testLastEventBeforeEdit', + 'rel_type': 'm.replace' + }, + 'msgtype': 'm.text' + }, + type: 'm.room.message', + eventId: 'testLastEventAfterEdit', + senderId: '@test:example.com', + originServerTs: DateTime.now(), + room: room, + ), + ], + ), + ), + }, + ), + nextBatch: '', + ), + ); + expect(room.lastEvent?.eventId, 'testLastEventAfterEdit'); + expect(room.lastEvent?.body, ' * A-edited'); + + await room.client.handleSync( + SyncUpdate( + rooms: RoomsUpdate( + join: { + room.id: JoinedRoomUpdate( + timeline: TimelineUpdate( + events: [ + Event( + content: {'redacts': 'testLastEventBeforeEdit'}, + type: 'm.room.redaction', + eventId: 'testLastEventAfterEditAndDelete', + senderId: '@test:example.com', + originServerTs: DateTime.now(), + room: room, + ), + ], + ), + ), + }, + ), + nextBatch: '', + ), + ); + expect(room.lastEvent?.eventId, 'testLastEventAfterEdit'); + expect(room.lastEvent?.body, 'Redacted'); + }); + test('lastEvent when reply parent edited', () async { await updateLastEvent( Event( @@ -678,7 +775,7 @@ void main() { test('getTimeline', () async { final timeline = await room.getTimeline(); - expect(timeline.events.length, 14); + expect(timeline.events.length, 17); }); test('getUserByMXID', () async {