Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Convert Delegation Pattern to Async-Await #292

Closed
wants to merge 14 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 10 additions & 5 deletions Demo/Demo/SwiftUIComponents/PayPalVaultViews/PayPalVaultView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,18 @@ struct PayPalVaultView: View {
)
SetupTokenResultView(vaultViewModel: paypalVaultViewModel)
if let setupTokenID = paypalVaultViewModel.state.setupToken?.id {
Button("Vault PayPal") {
Task {
await paypalVaultViewModel.vault(setupTokenID: setupTokenID)
ZStack {
Button("Vault PayPal") {
Task {
await paypalVaultViewModel.vault(setupTokenID: setupTokenID)
}
}
.buttonStyle(RoundedBlueButtonStyle())
.padding()
if case .loading = paypalVaultViewModel.state.paypalVaultTokenResponse {
CircularProgressView()
}
}
.buttonStyle(RoundedBlueButtonStyle())
.padding()
}
PayPalVaultResultView(viewModel: paypalVaultViewModel)
if let paypalVaultResult = paypalVaultViewModel.state.paypalVaultToken {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import CorePayments
import PayPalWebPayments
import FraudProtection

class PayPalWebViewModel: ObservableObject, PayPalWebCheckoutDelegate {
class PayPalWebViewModel: ObservableObject {

@Published var state: CurrentState = .idle
@Published var intent: Intent = .authorize
Expand Down Expand Up @@ -63,17 +63,22 @@ class PayPalWebViewModel: ObservableObject, PayPalWebCheckoutDelegate {
Task {
do {
payPalWebCheckoutClient = try await getPayPalClient()
payPalWebCheckoutClient?.delegate = self
guard let payPalWebCheckoutClient else {
print("Error initializing PayPalWebCheckoutClient")
return
}

if let orderID {
let payPalRequest = PayPalWebCheckoutRequest(orderID: orderID, fundingSource: funding)
payPalWebCheckoutClient.start(request: payPalRequest)
let result = try await payPalWebCheckoutClient.start(request: payPalRequest)
updateState(.success)
DispatchQueue.main.async {
self.checkoutResult = result
}
} else {
print("Error starting PayPalWebCheckoutClient")
updateState(.error(message: "Error getting orderID"))
}
updateState(.success)
} catch {
print("Error starting PayPalWebCheckoutClient")
updateState(.error(message: error.localizedDescription))
Expand Down Expand Up @@ -131,22 +136,4 @@ class PayPalWebViewModel: ObservableObject, PayPalWebCheckoutDelegate {
self.state = state
}
}

// MARK: - PayPalWeb Checkout Delegate

func payPal(
_ payPalClient: PayPalWebCheckoutClient,
didFinishWithResult result: PayPalWebCheckoutResult
) {
updateState(.success)
checkoutResult = result
}

func payPal(_ payPalClient: PayPalWebCheckoutClient, didFinishWithError error: CoreSDKError) {
updateState(.error(message: error.localizedDescription))
}

func payPalDidCancel(_ payPalClient: PayPalWebCheckoutClient) {
print("PayPal Checkout Canceled")
}
}
58 changes: 18 additions & 40 deletions Demo/Demo/ViewModels/CardPaymentViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import CardPayments
import CorePayments
import FraudProtection

class CardPaymentViewModel: ObservableObject, CardDelegate {
class CardPaymentViewModel: ObservableObject {

@Published var state = CardPaymentState()
private var payPalDataCollector: PayPalDataCollector?
Expand Down Expand Up @@ -117,12 +117,25 @@ class CardPaymentViewModel: ObservableObject, CardDelegate {
let config = try await configManager.getCoreConfig()
cardClient = CardClient(config: config)
payPalDataCollector = PayPalDataCollector(config: config)
cardClient?.delegate = self
let cardRequest = CardRequest(orderID: orderID, card: card, sca: sca)
cardClient?.approveOrder(request: cardRequest)
let result = try await cardClient?.approveOrder(request: cardRequest)
if let result {
let finalResult = CardPaymentState.CardResult(
id: result.orderID,
status: result.status,
didAttemptThreeDSecureAuthentication: result.didAttemptThreeDSecureAuthentication
)
approveResultSuccessResult(approveResult: finalResult)
} else {
DispatchQueue.main.async {
self.state.approveResultResponse = .error(message: "cardResult was nil")
}
}
} catch {
self.state.approveResultResponse = .error(message: error.localizedDescription)
print("failed in checkout with card. \(error.localizedDescription)")
DispatchQueue.main.async {
self.state.approveResultResponse = .error(message: error.localizedDescription)
print("failed in checkout with card. \(error.localizedDescription)")
}
}
}

Expand All @@ -139,39 +152,4 @@ class CardPaymentViewModel: ObservableObject, CardDelegate {
self.state.approveResultResponse = .error(message: vaultError.localizedDescription)
}
}

// MARK: - Card Delegate

func card(_ cardClient: CardPayments.CardClient, didFinishWithResult result: CardPayments.CardResult) {
approveResultSuccessResult(
approveResult: CardPaymentState.CardResult(
id: result.orderID,
status: result.status,
didAttemptThreeDSecureAuthentication: result.didAttemptThreeDSecureAuthentication
)
)
}

func card(_ cardClient: CardPayments.CardClient, didFinishWithError error: CorePayments.CoreSDKError) {
print("Error here")
DispatchQueue.main.async {
self.state.approveResultResponse = .error(message: error.localizedDescription)
}
}

func cardDidCancel(_ cardClient: CardPayments.CardClient) {
print("Card Payment Canceled")
DispatchQueue.main.async {
self.state.approveResultResponse = .idle
self.state.approveResult = nil
}
}

func cardThreeDSecureWillLaunch(_ cardClient: CardPayments.CardClient) {
print("About to launch 3DS")
}

func cardThreeDSecureDidFinish(_ cardClient: CardPayments.CardClient) {
print("Finished 3DS")
}
}
33 changes: 3 additions & 30 deletions Demo/Demo/ViewModels/CardVaultViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import Foundation
import CardPayments
import CorePayments

class CardVaultViewModel: VaultViewModel, CardVaultDelegate {
class CardVaultViewModel: VaultViewModel {

let configManager = CoreConfigManager(domain: "Card Vault")

Expand All @@ -13,9 +13,9 @@ class CardVaultViewModel: VaultViewModel, CardVaultDelegate {
do {
let config = try await configManager.getCoreConfig()
let cardClient = CardClient(config: config)
cardClient.vaultDelegate = self
let cardVaultRequest = CardVaultRequest(card: card, setupTokenID: setupToken)
cardClient.vault(cardVaultRequest)
let vaultResult = try await cardClient.vault(cardVaultRequest)
setUpdateSetupTokenResult(vaultResult: vaultResult)
} catch {
self.state.updateSetupTokenResponse = .error(message: error.localizedDescription)
print("failed in updating setup token. \(error.localizedDescription)")
Expand Down Expand Up @@ -46,31 +46,4 @@ class CardVaultViewModel: VaultViewModel, CardVaultDelegate {
}
}
}

// MARK: - CardVault Delegate

func card(_ cardClient: CardPayments.CardClient, didFinishWithVaultResult vaultResult: CardPayments.CardVaultResult) {
print("vaultResult: \(vaultResult)")
setUpdateSetupTokenResult(vaultResult: vaultResult)
}

func card(_ cardClient: CardPayments.CardClient, didFinishWithVaultError vaultError: CorePayments.CoreSDKError) {
print("error: \(vaultError.errorDescription ?? "")")
setUpdateSetupTokenResult(vaultError: vaultError)
}

func cardThreeDSecureDidCancel(_ cardClient: CardClient) {
DispatchQueue.main.async {
self.state.updateSetupTokenResponse = .idle
self.state.updateSetupToken = nil
}
}

func cardThreeDSecureWillLaunch(_ cardClient: CardPayments.CardClient) {
print("About to launch 3DS")
}

func cardThreeDSecureDidFinish(_ cardClient: CardPayments.CardClient) {
print("Finished 3DS")
}
}
36 changes: 8 additions & 28 deletions Demo/Demo/ViewModels/PayPalVaultViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import UIKit
import PayPalWebPayments
import CorePayments

class PayPalVaultViewModel: VaultViewModel, PayPalVaultDelegate {
class PayPalVaultViewModel: VaultViewModel {

let configManager = CoreConfigManager(domain: "PayPal Vault")

Expand All @@ -13,36 +13,16 @@ class PayPalVaultViewModel: VaultViewModel, PayPalVaultDelegate {
do {
let config = try await configManager.getCoreConfig()
let paypalClient = PayPalWebCheckoutClient(config: config)
paypalClient.vaultDelegate = self
let vaultRequest = PayPalVaultRequest(setupTokenID: setupTokenID)
paypalClient.vault(vaultRequest)
let result = try await paypalClient.vault(vaultRequest)
DispatchQueue.main.async {
self.state.paypalVaultTokenResponse = .loaded(result)
}
} catch {
print("Error in vaulting PayPal Payment")
DispatchQueue.main.async {
self.state.paypalVaultTokenResponse = .error(message: error.localizedDescription)
}
}
}

// MARK: - PayPalVault Delegate

func paypal(
_ paypalWebClient: PayPalWebPayments.PayPalWebCheckoutClient,
didFinishWithVaultResult paypalVaultResult: PayPalVaultResult
) {
DispatchQueue.main.async {
self.state.paypalVaultTokenResponse = .loaded(paypalVaultResult)
}
}

func paypal(
_ paypalWebClient: PayPalWebPayments.PayPalWebCheckoutClient,
didFinishWithVaultError vaultError: CorePayments.CoreSDKError
) {

DispatchQueue.main.async {
self.state.paypalVaultTokenResponse = .error(message: vaultError.localizedDescription)
}
}

func paypalDidCancel(_ payPalWebClient: PayPalWebCheckoutClient) {
print("PayPal Checkout Canceled")
}
}
Loading
Loading