From 2bce77920626d5bab588785be3e3ad34037eb01b Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Tue, 15 Nov 2022 15:42:20 +0200 Subject: [PATCH] Revert timeline item scrolling change in 3401d7a that seems to have introduced regressions. --- .../RoomScreen/View/TimelineItemList.swift | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/ElementX/Sources/Screens/RoomScreen/View/TimelineItemList.swift b/ElementX/Sources/Screens/RoomScreen/View/TimelineItemList.swift index 408b2eb7c..df7ddaacd 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/TimelineItemList.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/TimelineItemList.swift @@ -114,17 +114,17 @@ struct TimelineItemList: View { .onReceive(scrollToBottomPublisher) { scrollToBottom(animated: true) } - .onChange(of: context.viewState.items) { items in - defer { - // update the items anyway - timelineItems = items + .onChange(of: context.viewState.items.count) { _ in + guard !context.viewState.items.isEmpty, + context.viewState.items.count != timelineItems.count else { + return } // Pin to the bottom if empty if timelineItems.isEmpty { - if let lastItem = items.last { + if let lastItem = context.viewState.items.last { let pinnedItem = PinnedItem(id: lastItem.id, anchor: .bottom, animated: false) - timelineItems = items + timelineItems = context.viewState.items self.pinnedItem = pinnedItem } @@ -134,9 +134,9 @@ struct TimelineItemList: View { // Pin to the new bottom if visible if let currentLastItem = timelineItems.last, visibleItemIdentifiers.contains(currentLastItem.id), - let newLastItem = items.last { + let newLastItem = context.viewState.items.last { let pinnedItem = PinnedItem(id: newLastItem.id, anchor: .bottom, animated: false) - timelineItems = items + timelineItems = context.viewState.items self.pinnedItem = pinnedItem return @@ -146,12 +146,20 @@ struct TimelineItemList: View { if let currentFirstItem = timelineItems.first, visibleItemIdentifiers.contains(currentFirstItem.id) { let pinnedItem = PinnedItem(id: currentFirstItem.id, anchor: .top, animated: false) - timelineItems = items + timelineItems = context.viewState.items self.pinnedItem = pinnedItem return } + + // Otherwise just update the items + timelineItems = context.viewState.items } + .onChange(of: context.viewState.items, perform: { items in + if timelineItems != items { + timelineItems = items + } + }) .background(GeometryReader { geo in Color.clear.preference(key: ViewFramePreferenceKey.self, value: [geo.frame(in: .global)]) })