diff --git a/Passepartout/Library/Sources/AppUIMain/Views/App/AppCoordinator.swift b/Passepartout/Library/Sources/AppUIMain/Views/App/AppCoordinator.swift index 5ab5fdaa..28fb0287 100644 --- a/Passepartout/Library/Sources/AppUIMain/Views/App/AppCoordinator.swift +++ b/Passepartout/Library/Sources/AppUIMain/Views/App/AppCoordinator.swift @@ -187,7 +187,10 @@ extension AppCoordinator { present(.editProviderEntity($0, pair.module, pair.selection)) }, onPurchaseRequired: { - paywallReason = .init($0, needsConfirmation: true) + // FIXME: #951, use of setLater/enableLater + setLater(.init($0, needsConfirmation: true)) { + paywallReason = $0 + } } ) ) @@ -279,7 +282,7 @@ extension AppCoordinator { func present(_ route: ModalRoute?) { - // XXX: this is a workaround for #791 on iOS 16 + // FIXME: #951, use of setLater/enableLater setLater(route) { modalRoute = $0 } diff --git a/Passepartout/Library/Sources/AppUIMain/Views/App/InstalledProfileView.swift b/Passepartout/Library/Sources/AppUIMain/Views/App/InstalledProfileView.swift index 7aec8d8e..e4bbc36e 100644 --- a/Passepartout/Library/Sources/AppUIMain/Views/App/InstalledProfileView.swift +++ b/Passepartout/Library/Sources/AppUIMain/Views/App/InstalledProfileView.swift @@ -208,7 +208,7 @@ private struct ToggleButton: View { .scaleEffect(1.5, anchor: .trailing) } ) - // TODO: #584, necessary to avoid cell selection + // XXX: #584, necessary to avoid cell selection .buttonStyle(.plain) .foregroundStyle(tunnel.statusColor(theme)) .opaque(isOpaque) diff --git a/Passepartout/Library/Sources/AppUIMain/Views/App/ProfileInfoButton.swift b/Passepartout/Library/Sources/AppUIMain/Views/App/ProfileInfoButton.swift index bf8a6e0b..68734256 100644 --- a/Passepartout/Library/Sources/AppUIMain/Views/App/ProfileInfoButton.swift +++ b/Passepartout/Library/Sources/AppUIMain/Views/App/ProfileInfoButton.swift @@ -37,7 +37,7 @@ struct ProfileInfoButton: View { } label: { ThemeImage(.info) } - // TODO: #584, necessary to avoid cell selection + // XXX: #584, necessary to avoid cell selection .buttonStyle(.borderless) } } diff --git a/Passepartout/Library/Sources/AppUIMain/Views/App/ProfileRowView.swift b/Passepartout/Library/Sources/AppUIMain/Views/App/ProfileRowView.swift index 47ac395a..7759ae84 100644 --- a/Passepartout/Library/Sources/AppUIMain/Views/App/ProfileRowView.swift +++ b/Passepartout/Library/Sources/AppUIMain/Views/App/ProfileRowView.swift @@ -190,7 +190,7 @@ private extension ProfileRowView { ThemeImage(.moreDetails) .imageScale(.large) } - // TODO: #584, necessary to avoid cell selection + // XXX: #584, necessary to avoid cell selection #if os(iOS) .menuStyle(.borderlessButton) #else diff --git a/Passepartout/Library/Sources/CommonUtils/Business/ErrorHandler.swift b/Passepartout/Library/Sources/CommonUtils/Business/ErrorHandler.swift index deb1dfe0..3c0e80d0 100644 --- a/Passepartout/Library/Sources/CommonUtils/Business/ErrorHandler.swift +++ b/Passepartout/Library/Sources/CommonUtils/Business/ErrorHandler.swift @@ -51,7 +51,10 @@ public final class ErrorHandler: ObservableObject { message: composedMessage, dismissAction: onDismiss ) - isPresented = true + // FIXME: #951, use of setLater/enableLater + enableLater { + self.isPresented = $0 + } } public func handle(title: String, message: String, onDismiss: (() -> Void)? = nil) { @@ -60,7 +63,10 @@ public final class ErrorHandler: ObservableObject { message: message, dismissAction: onDismiss ) - isPresented = true + // FIXME: #951, use of setLater/enableLater + enableLater { + self.isPresented = $0 + } } } diff --git a/Passepartout/Library/Sources/CommonUtils/Views/View+Extensions.swift b/Passepartout/Library/Sources/CommonUtils/Views/View+Extensions.swift index a171af3c..82b98af9 100644 --- a/Passepartout/Library/Sources/CommonUtils/Views/View+Extensions.swift +++ b/Passepartout/Library/Sources/CommonUtils/Views/View+Extensions.swift @@ -32,10 +32,6 @@ extension View { } } - public func setLater(_ value: T?, millis: Int = 50, block: @escaping (T?) -> Void) { - globalSetLater(value, millis: millis, block: block) - } - @ViewBuilder public func `if`(_ condition: Bool) -> some View { if condition { @@ -88,13 +84,19 @@ extension ViewModifier { Self._printChanges() } } +} - public func setLater(_ value: T?, millis: Int = 50, block: @escaping (T?) -> Void) { - globalSetLater(value, millis: millis, block: block) +@MainActor +public func enableLater(millis: Int = 50, block: @escaping (Bool) -> Void) { + Task { + block(false) + try await Task.sleep(for: .milliseconds(millis)) + block(true) } } -private func globalSetLater(_ value: T?, millis: Int = 50, block: @escaping (T?) -> Void) { +@MainActor +public func setLater(_ value: T?, millis: Int = 50, block: @escaping (T?) -> Void) { Task { block(nil) try await Task.sleep(for: .milliseconds(millis)) diff --git a/Passepartout/Library/Sources/UILibrary/Theme/Theme+ImageName.swift b/Passepartout/Library/Sources/UILibrary/Theme/Theme+ImageName.swift index 0c2e081a..82aa1225 100644 --- a/Passepartout/Library/Sources/UILibrary/Theme/Theme+ImageName.swift +++ b/Passepartout/Library/Sources/UILibrary/Theme/Theme+ImageName.swift @@ -120,7 +120,12 @@ extension Theme.ImageName { case .tunnelRestart: return "arrow.clockwise" case .tunnelToggle: return "power" case .tunnelUninstall: return "arrow.uturn.down" - case .tvOff: return "tv.slash" + case .tvOff: + if #available(iOS 17, macOS 14, tvOS 17, *) { + return "tv.slash" + } else { + return "tv" + } case .tvOn: return "tv" case .upgrade: return "arrow.up.circle" case .warning: return "exclamationmark.triangle" diff --git a/Passepartout/Library/Sources/UILibrary/Theme/UI/Theme+Views.swift b/Passepartout/Library/Sources/UILibrary/Theme/UI/Theme+Views.swift index 015aa5bc..b1bea6ed 100644 --- a/Passepartout/Library/Sources/UILibrary/Theme/UI/Theme+Views.swift +++ b/Passepartout/Library/Sources/UILibrary/Theme/UI/Theme+Views.swift @@ -324,7 +324,7 @@ public struct ThemeCopiableText: View where Value: CustomStrin } label: { ThemeImage(.copy) } - // TODO: #584, necessary to avoid cell selection + // TODO: #XXX, necessary to avoid cell selection .buttonStyle(.borderless) } } diff --git a/Passepartout/Library/Sources/UILibrary/Views/UI/PurchaseRequiredButton.swift b/Passepartout/Library/Sources/UILibrary/Views/UI/PurchaseRequiredButton.swift index 74086841..5399c66f 100644 --- a/Passepartout/Library/Sources/UILibrary/Views/UI/PurchaseRequiredButton.swift +++ b/Passepartout/Library/Sources/UILibrary/Views/UI/PurchaseRequiredButton.swift @@ -54,6 +54,7 @@ private extension PurchaseRequiredButton { guard let features, !isEligible else { return } + // FIXME: #951, use of setLater/enableLater setLater(.init(features, suggestedProduct: suggestedProduct)) { paywallReason = $0 }