diff --git a/apple/OmnivoreKit/Sources/App/AppExtensions/Share/ShareExtensionScene.swift b/apple/OmnivoreKit/Sources/App/AppExtensions/Share/ShareExtensionScene.swift index 42f2f3225..acc01f73a 100644 --- a/apple/OmnivoreKit/Sources/App/AppExtensions/Share/ShareExtensionScene.swift +++ b/apple/OmnivoreKit/Sources/App/AppExtensions/Share/ShareExtensionScene.swift @@ -80,13 +80,14 @@ final class ShareExtensionViewModel: ObservableObject { .store(in: &subscriptions) // Using viewerPublisher to get fast feedback for auth/network errors - services.dataService.viewerPublisher() - .sink { [weak self] completion in - guard case let .failure(error) = completion else { return } - self?.debugText = "saveArticleError: \(error)" - self?.status = .failed(error: .unknown(description: "")) - } receiveValue: { _ in } - .store(in: &subscriptions) + Task { + do { + _ = try await services.dataService.fetchViewer() + } catch { + debugText = "saveArticleError: \(error)" + status = .failed(error: .unknown(description: "")) + } + } } } diff --git a/apple/OmnivoreKit/Sources/App/Views/RootView/RootView.swift b/apple/OmnivoreKit/Sources/App/Views/RootView/RootView.swift index 0d4af5f7c..135be02c1 100644 --- a/apple/OmnivoreKit/Sources/App/Views/RootView/RootView.swift +++ b/apple/OmnivoreKit/Sources/App/Views/RootView/RootView.swift @@ -91,10 +91,10 @@ struct InnerRootView: View { if viewModel.webLinkPath != nil { viewModel.webLinkPath = nil DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) { - viewModel.onOpenURL(url: url) + Task { await viewModel.onOpenURL(url: url) } } } else { - viewModel.onOpenURL(url: url) + Task { await viewModel.onOpenURL(url: url) } } } } diff --git a/apple/OmnivoreKit/Sources/App/Views/RootView/RootViewModel.swift b/apple/OmnivoreKit/Sources/App/Views/RootView/RootViewModel.swift index fa8762ec0..a8afdf799 100644 --- a/apple/OmnivoreKit/Sources/App/Views/RootView/RootViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/Views/RootView/RootViewModel.swift @@ -20,8 +20,6 @@ public final class RootViewModel: ObservableObject { @Published var snackbarMessage: String? @Published var showSnackbar = false - public var subscriptions = Set() - public init() { registerFonts() @@ -57,7 +55,7 @@ public final class RootViewModel: ObservableObject { ) } - func onOpenURL(url: URL) { + @MainActor func onOpenURL(url: URL) async { guard let linkRequestID = DeepLink.make(from: url)?.linkRequestID else { return } if let username = services.dataService.currentViewer?.username { @@ -66,17 +64,10 @@ public final class RootViewModel: ObservableObject { return } - services.dataService.viewerPublisher().sink( - receiveCompletion: { completion in - guard case let .failure(error) = completion else { return } - print(error) - }, - receiveValue: { [weak self] viewer in - let path = self?.linkRequestPath(username: viewer.username, requestID: linkRequestID) ?? "" - self?.webLinkPath = SafariWebLinkPath(id: UUID(), path: path) - } - ) - .store(in: &subscriptions) + if let viewer = try? await services.dataService.fetchViewer() { + let path = linkRequestPath(username: viewer.username, requestID: linkRequestID) + webLinkPath = SafariWebLinkPath(id: UUID(), path: path) + } } func triggerPushNotificationRequestIfNeeded() { diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Queries/ViewerPublisher.swift b/apple/OmnivoreKit/Sources/Services/DataService/Queries/ViewerFetcher.swift similarity index 81% rename from apple/OmnivoreKit/Sources/Services/DataService/Queries/ViewerPublisher.swift rename to apple/OmnivoreKit/Sources/Services/DataService/Queries/ViewerFetcher.swift index 39961b7cb..509ff01a7 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Queries/ViewerPublisher.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Queries/ViewerFetcher.swift @@ -44,23 +44,8 @@ public extension DataService { } } -public extension DataService { - @available(*, deprecated, message: "use async version instead") - func viewerPublisher() -> AnyPublisher { - internalViewerPublisher() - .handleEvents(receiveOutput: { - // Persist ID so AppDelegate can use it to register Intercom users at launch time - if UserDefaults.standard.string(forKey: Keys.userIdKey) == nil { - UserDefaults.standard.setValue($0.userID, forKey: Keys.userIdKey) - DataService.registerIntercomUser?($0.userID) - } - }) - .receive(on: DispatchQueue.main) - .eraseToAnyPublisher() - } -} - extension DataService { + @available(*, deprecated, message: "use async version instead") func internalViewerPublisher() -> AnyPublisher { let selection = Selection { Viewer(