From cc4bc179afb5df7e21ccf441bea4075ff80a2be7 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Fri, 10 May 2024 15:36:37 +0300 Subject: [PATCH] Fixes #2805 - Fixes animation artifacts when focusing on in-reply-to messages --- .../Screens/RoomScreen/RoomScreenViewModel.swift | 3 +-- .../View/Timeline/TimelineTableViewController.swift | 11 +++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift index 5d42ba9ab..aa281feca 100644 --- a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift @@ -193,8 +193,7 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol case .focusLive: focusLive() case .scrolledToFocussedItem: - // Use a Task to mutate view state after the current view update. - Task { didScrollToFocussedItem() } + didScrollToFocussedItem() case .hasSwitchedTimeline: Task { state.timelineViewState.isSwitchingTimelines = false } } diff --git a/ElementX/Sources/Screens/RoomScreen/View/Timeline/TimelineTableViewController.swift b/ElementX/Sources/Screens/RoomScreen/View/Timeline/TimelineTableViewController.swift index 8628390eb..1768746c6 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Timeline/TimelineTableViewController.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Timeline/TimelineTableViewController.swift @@ -340,10 +340,13 @@ class TimelineTableViewController: UIViewController { /// Scrolls to the item with the corresponding event ID if loaded in the timeline. private func scrollToItem(eventID: String, animated: Bool) { - if let kvPair = timelineItemsDictionary.first(where: { $0.value.identifier.eventID == eventID }), - let indexPath = dataSource?.indexPath(for: kvPair.key) { - tableView.scrollToRow(at: indexPath, at: .middle, animated: animated) - coordinator.send(viewAction: .scrolledToFocussedItem) + DispatchQueue.main.async { [weak self] in // Fixes #2805 + guard let self else { return } + if let kvPair = timelineItemsDictionary.first(where: { $0.value.identifier.eventID == eventID }), + let indexPath = dataSource?.indexPath(for: kvPair.key) { + tableView.scrollToRow(at: indexPath, at: .middle, animated: animated) + coordinator.send(viewAction: .scrolledToFocussedItem) + } } }