diff options
| author | Steffen Ernst <steffen.ernst@mullvad.net> | 2025-01-15 14:34:51 +0100 |
|---|---|---|
| committer | Steffen Ernst <steffen.ernst@mullvad.net> | 2025-01-20 15:54:12 +0100 |
| commit | 75c957f5f57da9ac74fe9e4de84f96fd039ba24d (patch) | |
| tree | cf7c6942d5ecd4a03268d49d17b033e19cdd6b03 | |
| parent | 8c5caa7a56a62cb9a5f0adf483444233613a7db8 (diff) | |
| download | mullvadvpn-75c957f5f57da9ac74fe9e4de84f96fd039ba24d.tar.xz mullvadvpn-75c957f5f57da9ac74fe9e4de84f96fd039ba24d.zip | |
Make 90 day payment code compile with swift 6 compiler
5 files changed, 50 insertions, 46 deletions
diff --git a/ios/MullvadVPN/Coordinators/WelcomeCoordinator.swift b/ios/MullvadVPN/Coordinators/WelcomeCoordinator.swift index 789ee48595..87ce2bb779 100644 --- a/ios/MullvadVPN/Coordinators/WelcomeCoordinator.swift +++ b/ios/MullvadVPN/Coordinators/WelcomeCoordinator.swift @@ -79,6 +79,7 @@ final class WelcomeCoordinator: Coordinator, Poppable, Presenting { ) } } + extension WelcomeCoordinator: @preconcurrency WelcomeViewControllerDelegate { func didRequestToShowFailToFetchProducts(controller: WelcomeViewController) { let message = NSLocalizedString( diff --git a/ios/MullvadVPN/View controllers/Account/AccountViewController.swift b/ios/MullvadVPN/View controllers/Account/AccountViewController.swift index 2ab766e41a..0ff929e676 100644 --- a/ios/MullvadVPN/View controllers/Account/AccountViewController.swift +++ b/ios/MullvadVPN/View controllers/Account/AccountViewController.swift @@ -14,10 +14,10 @@ import Operations import StoreKit import UIKit -struct PurchaseOptionDetails { +struct PurchaseOptionDetails: Sendable { let products: [SKProduct] let accountNumber: String - let didRequestPurchase: (SKProduct) -> Void + let didRequestPurchase: @Sendable (SKProduct) -> Void } enum AccountViewControllerAction: Sendable { @@ -270,24 +270,24 @@ class AccountViewController: UIViewController, @unchecked Sendable { setIsFetchingProducts(true) _ = interactor.requestProducts(with: productIdentifiers) { [weak self] result in guard let self else { return } - switch result { - case let .success(success): - let products = success.products - if !products.isEmpty { - actionHandler?(.showPurchaseOptions(PurchaseOptionDetails( - products: products, - accountNumber: accountData.number, - didRequestPurchase: self.doPurchase - ))) - } else { + Task { @MainActor in + switch result { + case let .success(success): + let products = success.products + if !products.isEmpty { + actionHandler?(.showPurchaseOptions(PurchaseOptionDetails( + products: products, + accountNumber: accountData.number, + didRequestPurchase: { product in Task { @MainActor in self.doPurchase(product: product) }} + ))) + } else { + actionHandler?(.showFailedToLoadProducts) + } + case .failure: actionHandler?(.showFailedToLoadProducts) } - case .failure: - actionHandler?(.showFailedToLoadProducts) + setIsFetchingProducts(false) } - MainActor.assumeIsolated { - setIsFetchingProducts(false) - } } } @@ -336,7 +336,6 @@ class AccountViewController: UIViewController, @unchecked Sendable { let transaction = try checkVerified(verification) await sendReceiptToAPI(accountNumber: accountData.identifier, receipt: verification) await transaction.finish() - case .userCancelled: print("User cancelled the purchase") case .pending: diff --git a/ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeInteractor.swift b/ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeInteractor.swift index a052e812a5..9b3e465e95 100644 --- a/ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeInteractor.swift +++ b/ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeInteractor.swift @@ -79,7 +79,7 @@ final class WelcomeInteractor: @unchecked Sendable { func requestProducts( with productIdentifiers: Set<StoreSubscription>, - completionHandler: @escaping (Result<SKProductsResponse, Error>) -> Void + completionHandler: @Sendable @escaping (Result<SKProductsResponse, Error>) -> Void ) -> Cancellable { storePaymentManager.requestProducts( with: productIdentifiers, diff --git a/ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeViewController.swift b/ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeViewController.swift index 33a3046b30..69e0edc9e3 100644 --- a/ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeViewController.swift +++ b/ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeViewController.swift @@ -94,22 +94,24 @@ extension WelcomeViewController: @preconcurrency WelcomeContentViewDelegate { contentView.isFetchingProducts = true _ = interactor.requestProducts(with: productIdentifiers) { [weak self] result in guard let self else { return } - switch result { - case let .success(success): - let products = success.products - if !products.isEmpty { - delegate?.didRequestToViewPurchaseOptions( - controller: self, - availableProducts: products, - accountNumber: interactor.accountNumber - ) - } else { + Task { @MainActor in + switch result { + case let .success(success): + let products = success.products + if !products.isEmpty { + delegate?.didRequestToViewPurchaseOptions( + controller: self, + availableProducts: products, + accountNumber: interactor.accountNumber + ) + } else { + delegate?.didRequestToShowFailToFetchProducts(controller: self) + } + case .failure: delegate?.didRequestToShowFailToFetchProducts(controller: self) } - case .failure: - delegate?.didRequestToShowFailToFetchProducts(controller: self) + contentView.isFetchingProducts = false } - contentView.isFetchingProducts = false } } diff --git a/ios/MullvadVPN/View controllers/OutOfTime/OutOfTimeViewController.swift b/ios/MullvadVPN/View controllers/OutOfTime/OutOfTimeViewController.swift index 32fc44f417..bc25fee820 100644 --- a/ios/MullvadVPN/View controllers/OutOfTime/OutOfTimeViewController.swift +++ b/ios/MullvadVPN/View controllers/OutOfTime/OutOfTimeViewController.swift @@ -232,23 +232,25 @@ class OutOfTimeViewController: UIViewController, RootContainment { applyViewState() _ = interactor.requestProducts(with: productIdentifiers) { [weak self] result in guard let self else { return } - switch result { - case let .success(success): - let products = success.products - if !products.isEmpty { - delegate?.outOfTimeViewControllerDidRequestShowPurchaseOptions( - self, - products: products, - didRequestPurchase: self.doPurchase - ) - } else { + Task { @MainActor in + switch result { + case let .success(success): + let products = success.products + if !products.isEmpty { + delegate?.outOfTimeViewControllerDidRequestShowPurchaseOptions( + self, + products: products, + didRequestPurchase: self.doPurchase + ) + } else { + delegate?.outOfTimeViewControllerDidFailToFetchProducts(self) + } + case .failure: delegate?.outOfTimeViewControllerDidFailToFetchProducts(self) } - case .failure: - delegate?.outOfTimeViewControllerDidFailToFetchProducts(self) + isFetchingProducts = false + applyViewState() } - isFetchingProducts = false - applyViewState() } } |
