From 04b83aaf3803c9b5414d657e9877c2c8715b8d1c Mon Sep 17 00:00:00 2001 From: Alfonso Grillo Date: Mon, 17 Jul 2023 12:16:41 +0200 Subject: [PATCH] Fix UserIndicatorController delayed appearance (#1330) --- .../UserIndicatorController.swift | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/ElementX/Sources/Other/UserIndicator/UserIndicatorController.swift b/ElementX/Sources/Other/UserIndicator/UserIndicatorController.swift index 72164ca6a..ea2e01e2e 100644 --- a/ElementX/Sources/Other/UserIndicator/UserIndicatorController.swift +++ b/ElementX/Sources/Other/UserIndicator/UserIndicatorController.swift @@ -19,7 +19,7 @@ import SwiftUI class UserIndicatorController: ObservableObject, UserIndicatorControllerProtocol, CustomStringConvertible { private let rootCoordinator: CoordinatorProtocol - private var dismisalTimer: Timer? + private var dismissalTimer: Timer? private var displayTimes = [String: Date]() private var delayedIndicators = Set() @@ -32,8 +32,8 @@ class UserIndicatorController: ObservableObject, UserIndicatorControllerProtocol activeIndicator = indicatorQueue.last if let activeIndicator, !activeIndicator.persistent { - dismisalTimer?.invalidate() - dismisalTimer = Timer.scheduledTimer(withTimeInterval: nonPersistentDisplayDuration, repeats: false) { [weak self] _ in + dismissalTimer?.invalidate() + dismissalTimer = Timer.scheduledTimer(withTimeInterval: nonPersistentDisplayDuration, repeats: false) { [weak self] _ in self?.retractIndicatorWithId(activeIndicator.id) } } @@ -55,27 +55,24 @@ class UserIndicatorController: ObservableObject, UserIndicatorControllerProtocol func submitIndicator(_ indicator: UserIndicator, delay: Duration?) { if let index = indicatorQueue.firstIndex(where: { $0.id == indicator.id }) { indicatorQueue[index] = indicator + displayTimes[indicator.id] = .now } else { if let delay { delayedIndicators.insert(indicator.id) + Timer.scheduledTimer(withTimeInterval: delay.seconds, repeats: false) { [weak self] _ in guard let self else { return } guard delayedIndicators.contains(indicator.id) else { return } - - retractIndicatorWithId(indicator.id) - indicatorQueue.append(indicator) - delayedIndicators.remove(indicator.id) + + enqueue(indicator: indicator) } } else { - retractIndicatorWithId(indicator.id) - indicatorQueue.append(indicator) + enqueue(indicator: indicator) } } - - displayTimes[indicator.id] = .now } func retractAllIndicators() { @@ -103,4 +100,12 @@ class UserIndicatorController: ObservableObject, UserIndicatorControllerProtocol var description: String { "UserIndicatorController(\(String(describing: rootCoordinator)))" } + + // MARK: - Private + + private func enqueue(indicator: UserIndicator) { + retractIndicatorWithId(indicator.id) + indicatorQueue.append(indicator) + displayTimes[indicator.id] = .now + } }