From d7f0da3545b030f227123630fd436c70a9b6ef89 Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Tue, 8 Feb 2022 08:34:20 +0100 Subject: [PATCH 1/2] fix: Call onChange on remove aggregation event --- lib/src/timeline.dart | 44 ++++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/lib/src/timeline.dart b/lib/src/timeline.dart index f82cf4a0..7324b106 100644 --- a/lib/src/timeline.dart +++ b/lib/src/timeline.dart @@ -261,13 +261,6 @@ class Timeline { _removeEventFromSet(events, event); } } - if (onChange != null) { - final relationshipEventId = event.relationshipEventId; - if (relationshipEventId != null) { - final index = _findEvent(event_id: relationshipEventId); - onChange?.call(index); - } - } } void _handleEventUpdate(EventUpdate eventUpdate, {bool update = true}) { @@ -283,18 +276,7 @@ class Timeline { ? eventUpdate.content['unsigned'][messageSendingStatusKey] : null) ?? EventStatus.synced.intValue); - // Redaction events are handled as modification for existing events. - if (eventUpdate.content['type'] == EventTypes.Redaction) { - final index = _findEvent(event_id: eventUpdate.content['redacts']); - if (index < events.length) { - removeAggregatedEvent(events[index]); - events[index].setRedactionEvent(Event.fromJson( - eventUpdate.content, - room, - )); - onChange?.call(index); - } - } + if (status.isRemoved) { final i = _findEvent(event_id: eventUpdate.content['event_id']); if (i < events.length) { @@ -345,6 +327,30 @@ class Timeline { addAggregatedEvent(newEvent); } } + + // Handle redaction events + if (eventUpdate.content['type'] == EventTypes.Redaction) { + final index = _findEvent(event_id: eventUpdate.content['redacts']); + if (index < events.length) { + removeAggregatedEvent(events[index]); + + // Is the redacted event a reaction? Then update the event this + // belongs to: + if (onChange != null) { + final relationshipEventId = events[index].relationshipEventId; + if (relationshipEventId != null) { + onChange?.call(_findEvent(event_id: relationshipEventId)); + } + } + + events[index].setRedactionEvent(Event.fromJson( + eventUpdate.content, + room, + )); + onChange?.call(index); + } + } + if (update && !_collectHistoryUpdates) { onUpdate?.call(); } From f9875e292930a733433d5d07ec3a0071fc96d56d Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Tue, 8 Feb 2022 08:34:56 +0100 Subject: [PATCH 2/2] chore: Bump version --- CHANGELOG.md | 3 +++ pubspec.yaml | 2 +- test/timeline_test.dart | 8 ++++---- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c198d28..dc7cd3e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## [0.8.4] - 08nd Feb 2022 +- fix: Call onChange correctly on redacted aggregation events + ## [0.8.3] - 07nd Feb 2022 - fix: Remove onHistoryReceived which was broken anyway - fix: Remove aggregation event doesnt trigger onChange diff --git a/pubspec.yaml b/pubspec.yaml index 776cbca7..0f9afb7c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: matrix description: Matrix Dart SDK -version: 0.8.3 +version: 0.8.4 homepage: https://famedly.com repository: https://gitlab.com/famedly/company/frontend/famedlysdk.git diff --git a/test/timeline_test.dart b/test/timeline_test.dart index 56f0ef74..44fadf88 100644 --- a/test/timeline_test.dart +++ b/test/timeline_test.dart @@ -146,7 +146,7 @@ void main() { expect(updateCount, 3); expect(insertList, [0, 0, 0]); expect(insertList.length, timeline.events.length); - expect(changeList, [1]); + expect(changeList, [2]); expect(removeList, []); expect(timeline.events.length, 3); expect(timeline.events[2].redacted, true); @@ -215,7 +215,7 @@ void main() { expect(updateCount, 13); expect(insertList, [0, 0, 0, 0, 0, 0, 1, 2]); expect(insertList.length, timeline.events.length); - expect(changeList, [1, 0, 0, 0, 1, 2]); + expect(changeList, [2, 0, 0, 0, 1, 2]); expect(removeList, []); expect(timeline.events[0].status, EventStatus.error); expect(timeline.events[1].status, EventStatus.error); @@ -230,7 +230,7 @@ void main() { expect(updateCount, 14); expect(insertList, [0, 0, 0, 0, 0, 0, 1, 2]); - expect(changeList, [1, 0, 0, 0, 1, 2]); + expect(changeList, [2, 0, 0, 0, 1, 2]); expect(removeList, [0]); expect(timeline.events.length, 7); expect(timeline.events[0].status, EventStatus.error); @@ -277,7 +277,7 @@ void main() { expect(updateCount, 17); expect(insertList, [0, 0, 0, 0, 0, 0, 1, 2, 0]); - expect(changeList, [1, 0, 0, 0, 1, 2, 0, 0]); + expect(changeList, [2, 0, 0, 0, 1, 2, 0, 0]); expect(removeList, [0]); expect(timeline.events.length, 1); expect(timeline.events[0].status, EventStatus.sent);