Automatically dismisses web view if user completes Patreon checkout flow

This commit is contained in:
Riley Testut
2023-12-08 18:20:25 -06:00
committed by Magesh K
parent b0e43b8b97
commit 2b3b60819e

View File

@@ -6,6 +6,8 @@
// Copyright © 2023 Riley Testut. All rights reserved. // Copyright © 2023 Riley Testut. All rights reserved.
// //
import Combine
import AltStoreCore import AltStoreCore
class VerifyAppPledgeOperation: ResultOperation<Void> class VerifyAppPledgeOperation: ResultOperation<Void>
@@ -16,6 +18,8 @@ class VerifyAppPledgeOperation: ResultOperation<Void>
private let presentingViewController: UIViewController? private let presentingViewController: UIViewController?
private var openPatreonPageContinuation: CheckedContinuation<Void, Never>? private var openPatreonPageContinuation: CheckedContinuation<Void, Never>?
private var cancellable: AnyCancellable?
init(storeApp: StoreApp, presentingViewController: UIViewController?) init(storeApp: StoreApp, presentingViewController: UIViewController?)
{ {
self.storeApp = storeApp self.storeApp = storeApp
@@ -57,9 +61,12 @@ class VerifyAppPledgeOperation: ResultOperation<Void>
let patreonURL = await self.$storeApp.perform({ _ in source.patreonURL }) let patreonURL = await self.$storeApp.perform({ _ in source.patreonURL })
else { throw error } else { throw error }
let checkoutURL: URL let components = URLComponents(url: patreonURL, resolvingAgainstBaseURL: false)
let lastPathComponent = components?.path.components(separatedBy: "/").last
let username = patreonURL.lastPathComponent let checkoutURL: URL
let username = lastPathComponent ?? patreonURL.lastPathComponent
if !username.isEmpty, let url = URL(string: "https://www.patreon.com/join/" + username) if !username.isEmpty, let url = URL(string: "https://www.patreon.com/join/" + username)
{ {
// Prefer /join URL over campaign homepage. // Prefer /join URL over campaign homepage.
@@ -221,6 +228,23 @@ private extension VerifyAppPledgeOperation
let navigationController = UINavigationController(rootViewController: webViewController) let navigationController = UINavigationController(rootViewController: webViewController)
presentingViewController.present(navigationController, animated: true) presentingViewController.present(navigationController, animated: true)
// Automatically dismiss if user completes checkout flow.
self.cancellable = webViewController.webView.publisher(for: \.url, options: [.new])
.compactMap { $0 }
.compactMap { URLComponents(url: $0, resolvingAgainstBaseURL: false) }
.compactMap { components in
let lastPathComponent = components.path.components(separatedBy: "/").last
return lastPathComponent?.lowercased()
}
.filter { $0 == "membership" }
.receive(on: RunLoop.main)
.sink { [weak self] url in
guard let continuation = self?.openPatreonPageContinuation else { return }
self?.openPatreonPageContinuation = nil
continuation.resume()
}
await withCheckedContinuation { continuation in await withCheckedContinuation { continuation in
self.openPatreonPageContinuation = continuation self.openPatreonPageContinuation = continuation
@@ -230,6 +254,8 @@ private extension VerifyAppPledgeOperation
await PatreonAPI.shared.saveAuthCookies() await PatreonAPI.shared.saveAuthCookies()
navigationController.dismiss(animated: true) navigationController.dismiss(animated: true)
self.cancellable = nil
} }
} }