diff --git a/SwiftUI/Patches.swift b/SwiftUI/Patches.swift index 998cd777..e12ef454 100644 --- a/SwiftUI/Patches.swift +++ b/SwiftUI/Patches.swift @@ -62,7 +62,6 @@ extension Color { extension Notification.Name { static let alert = Notification.Name("alert") - static let externalLink = Notification.Name("externalLink") static let openFiles = Notification.Name("openFiles") static let openURL = Notification.Name("openURL") static let toggleSidebar = Notification.Name("toggleSidebar") diff --git a/ViewModel/BrowserViewModel.swift b/ViewModel/BrowserViewModel.swift index 9de80614..e27399da 100644 --- a/ViewModel/BrowserViewModel.swift +++ b/ViewModel/BrowserViewModel.swift @@ -45,6 +45,7 @@ class BrowserViewModel: NSObject, ObservableObject, @Published private(set) var outlineItems = [OutlineItem]() @Published private(set) var outlineItemTree = [OutlineItem]() @Published private(set) var url: URL? + @Published var externalLink: URL? let tabID: NSManagedObjectID? let webView: WKWebView @@ -179,7 +180,7 @@ class BrowserViewModel: NSObject, ObservableObject, } else if url.isKiwixURL { decisionHandler(.allow) } else if url.scheme == "http" || url.scheme == "https" { - NotificationCenter.default.post(name: .externalLink, object: nil, userInfo: ["url": url]) + externalLink = url decisionHandler(.cancel) } else if url.scheme == "geo" { if FeatureFlags.map { diff --git a/Views/ViewModifiers/ExternalLinkHandler.swift b/Views/ViewModifiers/ExternalLinkHandler.swift index 4d3860d4..d7db201a 100644 --- a/Views/ViewModifiers/ExternalLinkHandler.swift +++ b/Views/ViewModifiers/ExternalLinkHandler.swift @@ -11,12 +11,11 @@ import SwiftUI import Defaults struct ExternalLinkHandler: ViewModifier { + @EnvironmentObject private var browserViewModel: BrowserViewModel @State private var isAlertPresented = false @State private var activeAlert: ActiveAlert? @State private var activeSheet: ActiveSheet? - private let externalLink = NotificationCenter.default.publisher(for: .externalLink) - enum ActiveAlert { case ask(url: URL) case notLoading @@ -28,8 +27,9 @@ struct ExternalLinkHandler: ViewModifier { } func body(content: Content) -> some View { - content.onReceive(externalLink) { notification in - guard let url = notification.userInfo?["url"] as? URL else { return } + content.onChange(of: browserViewModel.externalLink) { url in + defer { browserViewModel.externalLink = nil } + guard let url = url else { return } switch Defaults[.externalLinkLoadingPolicy] { case .alwaysAsk: isAlertPresented = true