From 9cbe1099e5149e27f95fb57c657b02c096e1e612 Mon Sep 17 00:00:00 2001 From: Krille Fear Date: Tue, 23 Nov 2021 09:06:30 +0100 Subject: [PATCH] fix: Limited timeline clears too much events This fixes the bug that the limited timeline flag also clears all events from the current SyncUpdate in an open timeline. --- lib/src/timeline.dart | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/src/timeline.dart b/lib/src/timeline.dart index 5969d5e2..1e1e7b5e 100644 --- a/lib/src/timeline.dart +++ b/lib/src/timeline.dart @@ -120,13 +120,12 @@ class Timeline { this.onRemove, }) : events = events ?? [] { sub = room.client.onEvent.stream.listen(_handleEventUpdate); + // If the timeline is limited we want to clear our events cache roomSub = room.client.onSync.stream .where((sync) => sync.rooms?.join?[room.id]?.timeline?.limited == true) - .listen((_) { - this.events.clear(); - aggregatedEvents.clear(); - }); + .listen(_removeEventsNotInThisSync); + sessionIdReceivedSub = room.onSessionKeyReceived.stream.listen(_sessionKeyReceived); @@ -136,6 +135,13 @@ class Timeline { } } + /// Removes all entries from [events] which are not in this SyncUpdate. + void _removeEventsNotInThisSync(SyncUpdate sync) { + final newSyncEvents = sync.rooms?.join?[room.id]?.timeline?.events ?? []; + final keepEventIds = newSyncEvents.map((e) => e.eventId); + events.removeWhere((e) => !keepEventIds.contains(e.eventId)); + } + /// Don't forget to call this before you dismiss this object! void cancelSubscriptions() { sub?.cancel();