@@ -5,7 +5,7 @@ import FraudProtection
5
5
6
6
class PayPalWebViewModel : ObservableObject {
7
7
8
- @Published var state : CurrentState = . idle
8
+ @Published var state = PayPalPaymentState ( )
9
9
@Published var intent : Intent = . authorize
10
10
@Published var order : Order ?
11
11
@Published var checkoutResult : PayPalWebCheckoutResult ?
@@ -44,25 +44,75 @@ class PayPalWebViewModel: ObservableObject {
44
44
)
45
45
46
46
do {
47
- updateState ( . loading)
47
+ DispatchQueue . main. async {
48
+ self . state. createdOrderResponse = . loading
49
+ }
48
50
let order = try await DemoMerchantAPI . sharedService. createOrder (
49
51
orderParams: orderRequestParams,
50
52
selectedMerchantIntegration: DemoSettings . merchantIntegration
51
53
)
52
-
53
- updateOrder ( order)
54
- updateState ( . success)
54
+ DispatchQueue . main. async {
55
+ self . state. createdOrderResponse = . loaded( order)
56
+ }
57
+ // updateOrder(order)
58
+ // updateState(.success)
55
59
print ( " ✅ fetched orderID: \( order. id) with status: \( order. status) " )
56
60
} catch {
57
- updateState ( . error( message: error. localizedDescription) )
61
+ DispatchQueue . main. async {
62
+ self . state. createdOrderResponse = . error( message: error. localizedDescription)
63
+ }
58
64
print ( " ❌ failed to fetch orderID with error: \( error. localizedDescription) " )
59
65
}
60
66
}
67
+
68
+ func captureOrder( orderID: String , selectedMerchantIntegration: MerchantIntegration ) async {
69
+ do {
70
+ self . state. capturedOrderResponse = . loading
71
+ let payPalClientMetadataID = payPalDataCollector? . collectDeviceData ( )
72
+ let order = try await DemoMerchantAPI . sharedService. captureOrder (
73
+ orderID: orderID,
74
+ selectedMerchantIntegration: selectedMerchantIntegration,
75
+ payPalClientMetadataID: payPalClientMetadataID
76
+ )
77
+ DispatchQueue . main. async {
78
+ self . state. capturedOrderResponse = . loaded( order)
79
+ }
80
+ } catch {
81
+ DispatchQueue . main. async {
82
+ self . state. capturedOrderResponse = . error( message: error. localizedDescription)
83
+ }
84
+ print ( " ❌ Failed to capture order: \( error. localizedDescription) " )
85
+ }
86
+ }
87
+
88
+ func authorizeOrder( orderID: String , selectedMerchantIntegration: MerchantIntegration ) async {
89
+ do {
90
+ DispatchQueue . main. async {
91
+ self . state. authorizedOrderResponse = . loading
92
+ }
93
+ let payPalClientMetadataID = payPalDataCollector? . collectDeviceData ( )
94
+ let order = try await DemoMerchantAPI . sharedService. authorizeOrder (
95
+ orderID: orderID,
96
+ selectedMerchantIntegration: selectedMerchantIntegration,
97
+ payPalClientMetadataID: payPalClientMetadataID
98
+ )
99
+ DispatchQueue . main. async {
100
+ self . state. authorizedOrderResponse = . loaded( order)
101
+ }
102
+ } catch {
103
+ DispatchQueue . main. async {
104
+ self . state. authorizedOrderResponse = . error( message: error. localizedDescription)
105
+ }
106
+ print ( " ❌ Failed to authorize order: \( error. localizedDescription) " )
107
+ }
108
+ }
61
109
62
110
func paymentButtonTapped( funding: PayPalWebCheckoutFundingSource ) {
63
111
Task {
64
112
do {
65
- self . updateState ( . loading)
113
+ DispatchQueue . main. async {
114
+ self . state. createdOrderResponse = . loading
115
+ }
66
116
payPalWebCheckoutClient = try await getPayPalClient ( )
67
117
guard let payPalWebCheckoutClient else {
68
118
print ( " Error initializing PayPalWebCheckoutClient " )
@@ -73,22 +123,28 @@ class PayPalWebViewModel: ObservableObject {
73
123
let payPalRequest = PayPalWebCheckoutRequest ( orderID: orderID, fundingSource: funding)
74
124
payPalWebCheckoutClient. start ( request: payPalRequest) { result, error in
75
125
if let error {
76
- if error == PayPalError . checkoutCanceledError {
77
- print ( " Canceled " )
78
- self . updateState ( . idle)
79
- } else {
80
- self . updateState ( . error( message: error. localizedDescription) )
126
+ DispatchQueue . main. async {
127
+ if error == PayPalError . checkoutCanceledError {
128
+ print ( " Canceled " )
129
+ self . state. createdOrderResponse = . idle
130
+ } else {
131
+ self . state. createdOrderResponse = . error( message: error. localizedDescription)
132
+ }
81
133
}
82
134
} else {
83
- self . updateState ( . success)
84
- self . checkoutResult = result
135
+ // self.updateState(.success)
136
+ DispatchQueue . main. async {
137
+ self . state. createdOrderResponse = . loaded( Order ( id: orderID, status: " COMPLETED " ) )
138
+ self . checkoutResult = result
139
+ print ( " ✅ Checkout result: \( String ( describing: result) ) " )
140
+ }
85
141
}
86
142
}
87
143
}
88
- updateState ( . success)
144
+ // updateState(.success)
89
145
} catch {
90
146
print ( " Error starting PayPalWebCheckoutClient " )
91
- updateState ( . error( message: error. localizedDescription) )
147
+ self . state . createdOrderResponse = . error( message: error. localizedDescription)
92
148
}
93
149
}
94
150
}
@@ -100,15 +156,17 @@ class PayPalWebViewModel: ObservableObject {
100
156
payPalDataCollector = PayPalDataCollector ( config: config)
101
157
return payPalClient
102
158
} catch {
103
- updateState ( . error( message: error. localizedDescription) )
159
+ DispatchQueue . main. async {
160
+ self . state. createdOrderResponse = . error( message: error. localizedDescription)
161
+ }
104
162
print ( " ❌ failed to create PayPalWebCheckoutClient with error: \( error. localizedDescription) " )
105
163
return nil
106
164
}
107
165
}
108
166
109
167
func completeTransaction( ) async throws {
110
168
do {
111
- updateState ( . loading)
169
+ self . state . authorizedOrderResponse = . loading
112
170
113
171
let payPalClientMetadataID = payPalDataCollector? . collectDeviceData ( )
114
172
if let orderID {
@@ -117,30 +175,21 @@ class PayPalWebViewModel: ObservableObject {
117
175
orderID: orderID,
118
176
payPalClientMetadataID: payPalClientMetadataID
119
177
)
120
- updateOrder ( order)
121
- updateState ( . success)
178
+ DispatchQueue . main. async {
179
+ self . state. authorizedOrderResponse = . loaded( order)
180
+ }
122
181
}
123
182
} catch {
124
- updateState ( . error( message: error. localizedDescription) )
183
+ DispatchQueue . main. async {
184
+ self . state. authorizedOrderResponse = . error( message: error. localizedDescription)
185
+ }
125
186
print ( " Error with \( intent) order: \( error. localizedDescription) " )
126
187
}
127
188
}
128
189
129
190
func resetState( ) {
130
- updateState ( . idle )
191
+ self . state = PayPalPaymentState ( )
131
192
order = nil
132
193
checkoutResult = nil
133
194
}
134
-
135
- private func updateOrder( _ order: Order ) {
136
- DispatchQueue . main. async {
137
- self . order = order
138
- }
139
- }
140
-
141
- private func updateState( _ state: CurrentState ) {
142
- DispatchQueue . main. async {
143
- self . state = state
144
- }
145
- }
146
195
}
0 commit comments