From 3f900df3def33ddf68858a0f1b46472e60e100ab Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Thu, 2 Feb 2023 17:54:37 +0200 Subject: [PATCH] Prevent duplicated timeline items from crashing the diffable datasource --- .../TimelineController/RoomTimelineController.swift | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineController.swift b/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineController.swift index 31cbaef09..918bc1aad 100644 --- a/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineController.swift +++ b/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineController.swift @@ -231,6 +231,8 @@ class RoomTimelineController: RoomTimelineControllerProtocol { var newTimelineItems = [RoomTimelineItemProtocol]() var canBackPaginate = true var isBackPaginating = false + + var createdIdentifiers = [String: Bool]() for (index, itemProxy) in timelineProvider.itemsPublisher.value.enumerated() { if Task.isCancelled { @@ -245,7 +247,13 @@ class RoomTimelineController: RoomTimelineControllerProtocol { switch itemProxy { case .event(let eventItemProxy): if let timelineItem = timelineItemFactory.buildTimelineItemFor(eventItemProxy: eventItemProxy, groupState: groupState) { - newTimelineItems.append(timelineItem) + #warning("This works around duplicated items coming out of the SDK, remove once fixed") + if createdIdentifiers[timelineItem.id] == nil { + newTimelineItems.append(timelineItem) + createdIdentifiers[timelineItem.id] = true + } else { + MXLog.error("Found duplicated timeline item, ignoring") + } } case .virtual(let virtualItem): switch virtualItem { @@ -274,7 +282,7 @@ class RoomTimelineController: RoomTimelineControllerProtocol { if Task.isCancelled { return } - + timelineItems = newTimelineItems callbacks.send(.updatedTimelineItems)