summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSteffen Ernst <steffen.ernst@mullvad.net>2025-01-15 14:34:51 +0100
committerSteffen Ernst <steffen.ernst@mullvad.net>2025-01-20 15:54:12 +0100
commit75c957f5f57da9ac74fe9e4de84f96fd039ba24d (patch)
treecf7c6942d5ecd4a03268d49d17b033e19cdd6b03
parent8c5caa7a56a62cb9a5f0adf483444233613a7db8 (diff)
downloadmullvadvpn-75c957f5f57da9ac74fe9e4de84f96fd039ba24d.tar.xz
mullvadvpn-75c957f5f57da9ac74fe9e4de84f96fd039ba24d.zip
Make 90 day payment code compile with swift 6 compiler
-rw-r--r--ios/MullvadVPN/Coordinators/WelcomeCoordinator.swift1
-rw-r--r--ios/MullvadVPN/View controllers/Account/AccountViewController.swift35
-rw-r--r--ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeInteractor.swift2
-rw-r--r--ios/MullvadVPN/View controllers/CreationAccount/Welcome/WelcomeViewController.swift28
-rw-r--r--ios/MullvadVPN/View controllers/OutOfTime/OutOfTimeViewController.swift30
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()
}
}