@primer-io/react-native 2.4.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/.project +11 -0
- package/android/.settings/org.eclipse.buildship.core.prefs +2 -2
- package/android/build.gradle +1 -1
- package/android/src/main/java/com/primerioreactnative/PrimerRNHeadlessUniversalCheckout.kt +5 -5
- package/android/src/main/java/com/primerioreactnative/ReactNativePackage.kt +3 -1
- package/android/src/main/java/com/primerioreactnative/huc/datamodels/manager/raw/PrimerRNHeadlessCheckoutInputData.kt +22 -0
- package/android/src/main/java/com/primerioreactnative/huc/events/PrimerHeadlessUniversalCheckoutRawDataManagerEvent.kt +7 -0
- package/android/src/main/java/com/primerioreactnative/huc/manager/raw/PrimerRNHeadlessUniversalCheckoutRawManager.kt +140 -0
- package/android/src/main/java/com/primerioreactnative/huc/manager/raw/PrimerRNHeadlessUniversalCheckoutRawManagerListener.kt +49 -0
- package/ios/DataModels/PrimerErrorRN.swift +2 -0
- package/ios/DataModels/RNTPrimerCardData.swift +46 -0
- package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.swift +53 -53
- package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutRawDataManager.m +21 -0
- package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutRawDataManager.swift +152 -0
- package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js +5 -4
- package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +1 -1
- package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js +106 -0
- package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -0
- package/lib/commonjs/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js +85 -0
- package/lib/commonjs/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -0
- package/lib/commonjs/index.js +28 -6
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/models/PrimerRawData.js +2 -0
- package/lib/commonjs/models/PrimerRawData.js.map +1 -0
- package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js +3 -3
- package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +1 -1
- package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js +88 -0
- package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -0
- package/lib/module/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js +76 -0
- package/lib/module/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -0
- package/lib/module/index.js +3 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/models/PrimerRawData.js +2 -0
- package/lib/module/models/PrimerRawData.js.map +1 -0
- package/lib/typescript/src/headless_checkout/PrimerHeadlessUniversalCheckout.d.ts +1 -0
- package/lib/typescript/src/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.d.ts +16 -0
- package/lib/typescript/src/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.d.ts +12 -0
- package/lib/typescript/src/index.d.ts +3 -1
- package/lib/typescript/src/models/PrimerRawData.d.ts +9 -0
- package/package.json +1 -1
- package/primer-io-react-native.podspec +1 -1
- package/src/headless_checkout/PrimerHeadlessUniversalCheckout.ts +3 -3
- package/src/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.ts +104 -0
- package/src/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.ts +91 -0
- package/src/index.tsx +8 -1
- package/src/models/PrimerRawData.ts +9 -0
|
@@ -10,7 +10,7 @@ import PrimerSDK
|
|
|
10
10
|
|
|
11
11
|
@objc
|
|
12
12
|
enum PrimerHeadlessUniversalCheckoutEvents: Int, CaseIterable {
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
case onHUCTokenizeStart = 0
|
|
15
15
|
case onHUCPrepareStart
|
|
16
16
|
case onHUCAvailablePaymentMethodsLoaded
|
|
@@ -22,7 +22,7 @@ enum PrimerHeadlessUniversalCheckoutEvents: Int, CaseIterable {
|
|
|
22
22
|
case onClientSessionUpdate
|
|
23
23
|
case onCheckoutComplete
|
|
24
24
|
case onError
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
var stringValue: String {
|
|
27
27
|
switch self {
|
|
28
28
|
case .onHUCPrepareStart:
|
|
@@ -53,28 +53,28 @@ enum PrimerHeadlessUniversalCheckoutEvents: Int, CaseIterable {
|
|
|
53
53
|
|
|
54
54
|
@objc(PrimerHeadlessUniversalCheckout)
|
|
55
55
|
class RNTPrimerHeadlessUniversalCheckout: RCTEventEmitter {
|
|
56
|
-
|
|
56
|
+
|
|
57
57
|
private var primerWillCreatePaymentWithDataDecisionHandler: ((_ errorMessage: String?) -> Void)?
|
|
58
58
|
private var primerDidTokenizePaymentMethodDecisionHandler: ((_ resumeToken: String?, _ errorMessage: String?) -> Void)?
|
|
59
59
|
private var primerDidResumeWithDecisionHandler: ((_ resumeToken: String?, _ errorMessage: String?) -> Void)?
|
|
60
60
|
private var primerDidFailWithErrorDecisionHandler: ((_ errorMessage: String) -> Void)?
|
|
61
61
|
private var implementedRNCallbacks: ImplementedRNCallbacks?
|
|
62
|
-
|
|
62
|
+
|
|
63
63
|
override class func requiresMainQueueSetup() -> Bool {
|
|
64
64
|
return true
|
|
65
65
|
}
|
|
66
|
-
|
|
66
|
+
|
|
67
67
|
override init() {
|
|
68
68
|
super.init()
|
|
69
69
|
PrimerHeadlessUniversalCheckout.current.delegate = self
|
|
70
70
|
}
|
|
71
|
-
|
|
71
|
+
|
|
72
72
|
override func supportedEvents() -> [String]! {
|
|
73
73
|
return PrimerHeadlessUniversalCheckoutEvents.allCases.compactMap({ $0.stringValue })
|
|
74
74
|
}
|
|
75
|
-
|
|
75
|
+
|
|
76
76
|
// MARK: - API
|
|
77
|
-
|
|
77
|
+
|
|
78
78
|
@objc
|
|
79
79
|
public func startWithClientToken(_ clientToken: String,
|
|
80
80
|
settingsStr: String?,
|
|
@@ -90,7 +90,7 @@ class RNTPrimerHeadlessUniversalCheckout: RCTEventEmitter {
|
|
|
90
90
|
return
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
|
-
|
|
93
|
+
|
|
94
94
|
PrimerHeadlessUniversalCheckout.current.start(withClientToken: clientToken, settings: settings, delegate: self) { paymentMethodTypes, err in
|
|
95
95
|
if let err = err {
|
|
96
96
|
errorCallback([err.rnError])
|
|
@@ -99,7 +99,7 @@ class RNTPrimerHeadlessUniversalCheckout: RCTEventEmitter {
|
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
|
-
|
|
102
|
+
|
|
103
103
|
@objc
|
|
104
104
|
public func getAssetForPaymentMethodType(_ paymentMethodTypeStr: String,
|
|
105
105
|
assetType assetTypeStr: String,
|
|
@@ -111,7 +111,7 @@ class RNTPrimerHeadlessUniversalCheckout: RCTEventEmitter {
|
|
|
111
111
|
errorCallback([err.rnError])
|
|
112
112
|
return
|
|
113
113
|
}
|
|
114
|
-
|
|
114
|
+
|
|
115
115
|
do {
|
|
116
116
|
let imageURL = try self.tempStoreImage(image: image, name: paymentMethodTypeStr)
|
|
117
117
|
successCallback([imageURL.absoluteString])
|
|
@@ -119,7 +119,7 @@ class RNTPrimerHeadlessUniversalCheckout: RCTEventEmitter {
|
|
|
119
119
|
errorCallback([error.rnError])
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
|
-
|
|
122
|
+
|
|
123
123
|
@objc
|
|
124
124
|
public func getAssetForCardNetwork(_ cardNetworkStr: String,
|
|
125
125
|
assetType assetTypeStr: String,
|
|
@@ -131,13 +131,13 @@ class RNTPrimerHeadlessUniversalCheckout: RCTEventEmitter {
|
|
|
131
131
|
errorCallback([err.rnError])
|
|
132
132
|
return
|
|
133
133
|
}
|
|
134
|
-
|
|
134
|
+
|
|
135
135
|
guard let unwrappedAssetType = PrimerAsset.ImageType(rawValue: assetTypeStr), let image = PrimerHeadlessUniversalCheckout.getAsset(for: cardNetwork, assetType: unwrappedAssetType) else {
|
|
136
136
|
let err = NativeError(errorId: "missing-asset", errorDescription: "Failed to find \(assetTypeStr) for \(cardNetworkStr)", recoverySuggestion: nil)
|
|
137
137
|
errorCallback([err.rnError])
|
|
138
138
|
return
|
|
139
139
|
}
|
|
140
|
-
|
|
140
|
+
|
|
141
141
|
do {
|
|
142
142
|
let imageURL = try self.tempStoreImage(image: image, name: cardNetworkStr)
|
|
143
143
|
successCallback([imageURL.absoluteString])
|
|
@@ -145,7 +145,7 @@ class RNTPrimerHeadlessUniversalCheckout: RCTEventEmitter {
|
|
|
145
145
|
errorCallback([error.rnError])
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
|
-
|
|
148
|
+
|
|
149
149
|
@objc
|
|
150
150
|
public func showPaymentMethod(_ paymentMethodTypeStr: String,
|
|
151
151
|
resolver: RCTPromiseResolveBlock,
|
|
@@ -154,33 +154,33 @@ class RNTPrimerHeadlessUniversalCheckout: RCTEventEmitter {
|
|
|
154
154
|
PrimerHeadlessUniversalCheckout.current.showPaymentMethod(paymentMethodTypeStr)
|
|
155
155
|
resolver(nil)
|
|
156
156
|
}
|
|
157
|
-
|
|
157
|
+
|
|
158
158
|
@objc
|
|
159
159
|
public func disposePrimerHeadlessUniversalCheckout() {
|
|
160
|
-
|
|
160
|
+
|
|
161
161
|
}
|
|
162
|
-
|
|
162
|
+
|
|
163
163
|
// MARK: - HELPERS
|
|
164
|
-
|
|
164
|
+
|
|
165
165
|
private func tempStoreImage(image: UIImage, name: String) throws -> URL {
|
|
166
166
|
guard let imageURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(name).png") else {
|
|
167
167
|
let err = NativeError(errorId: "error", errorDescription: "Failed to create URL for asset", recoverySuggestion: nil)
|
|
168
168
|
throw err
|
|
169
169
|
}
|
|
170
|
-
|
|
170
|
+
|
|
171
171
|
guard let pngData = image.pngData() else {
|
|
172
172
|
let err = NativeError(errorId: "error", errorDescription: "Failed to get image's PNG data", recoverySuggestion: nil)
|
|
173
173
|
throw err
|
|
174
174
|
}
|
|
175
|
-
|
|
175
|
+
|
|
176
176
|
try pngData.write(to: imageURL)
|
|
177
177
|
return imageURL
|
|
178
178
|
}
|
|
179
|
-
|
|
179
|
+
|
|
180
180
|
// MARK: - DECISION HANDLERS
|
|
181
|
-
|
|
181
|
+
|
|
182
182
|
// MARK: Tokenization
|
|
183
|
-
|
|
183
|
+
|
|
184
184
|
@objc
|
|
185
185
|
public func handleTokenizationNewClientToken(_ newClientToken: String, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
|
|
186
186
|
DispatchQueue.main.async {
|
|
@@ -189,7 +189,7 @@ class RNTPrimerHeadlessUniversalCheckout: RCTEventEmitter {
|
|
|
189
189
|
resolver(nil)
|
|
190
190
|
}
|
|
191
191
|
}
|
|
192
|
-
|
|
192
|
+
|
|
193
193
|
@objc
|
|
194
194
|
public func handleTokenizationSuccess(_ resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
|
|
195
195
|
DispatchQueue.main.async {
|
|
@@ -199,7 +199,7 @@ class RNTPrimerHeadlessUniversalCheckout: RCTEventEmitter {
|
|
|
199
199
|
rejecter(err.rnError["errorId"]!, err.rnError["description"], err)
|
|
200
200
|
}
|
|
201
201
|
}
|
|
202
|
-
|
|
202
|
+
|
|
203
203
|
@objc
|
|
204
204
|
public func handleTokenizationFailure(_ errorMessage: String?, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
|
|
205
205
|
DispatchQueue.main.async {
|
|
@@ -209,9 +209,9 @@ class RNTPrimerHeadlessUniversalCheckout: RCTEventEmitter {
|
|
|
209
209
|
rejecter(err.rnError["errorId"]!, err.rnError["description"], err)
|
|
210
210
|
}
|
|
211
211
|
}
|
|
212
|
-
|
|
212
|
+
|
|
213
213
|
// MARK: Resume Payment
|
|
214
|
-
|
|
214
|
+
|
|
215
215
|
@objc
|
|
216
216
|
public func handleResumeWithNewClientToken(_ newClientToken: String, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
|
|
217
217
|
DispatchQueue.main.async {
|
|
@@ -220,7 +220,7 @@ class RNTPrimerHeadlessUniversalCheckout: RCTEventEmitter {
|
|
|
220
220
|
resolver(nil)
|
|
221
221
|
}
|
|
222
222
|
}
|
|
223
|
-
|
|
223
|
+
|
|
224
224
|
@objc
|
|
225
225
|
public func handleResumeSuccess(_ resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
|
|
226
226
|
DispatchQueue.main.async {
|
|
@@ -228,7 +228,7 @@ class RNTPrimerHeadlessUniversalCheckout: RCTEventEmitter {
|
|
|
228
228
|
rejecter(err.rnError["errorId"]!, err.rnError["description"], err)
|
|
229
229
|
}
|
|
230
230
|
}
|
|
231
|
-
|
|
231
|
+
|
|
232
232
|
@objc
|
|
233
233
|
public func handleResumeFailure(_ errorMessage: String?, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
|
|
234
234
|
DispatchQueue.main.async {
|
|
@@ -236,9 +236,9 @@ class RNTPrimerHeadlessUniversalCheckout: RCTEventEmitter {
|
|
|
236
236
|
rejecter(err.rnError["errorId"]!, err.rnError["description"], err)
|
|
237
237
|
}
|
|
238
238
|
}
|
|
239
|
-
|
|
239
|
+
|
|
240
240
|
// MARK: Payment Creation
|
|
241
|
-
|
|
241
|
+
|
|
242
242
|
@objc
|
|
243
243
|
public func handlePaymentCreationAbort(_ errorMessage: String?, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
|
|
244
244
|
DispatchQueue.main.async {
|
|
@@ -247,7 +247,7 @@ class RNTPrimerHeadlessUniversalCheckout: RCTEventEmitter {
|
|
|
247
247
|
resolver(nil)
|
|
248
248
|
}
|
|
249
249
|
}
|
|
250
|
-
|
|
250
|
+
|
|
251
251
|
@objc
|
|
252
252
|
public func handlePaymentCreationContinue(_ resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
|
|
253
253
|
DispatchQueue.main.async {
|
|
@@ -256,13 +256,13 @@ class RNTPrimerHeadlessUniversalCheckout: RCTEventEmitter {
|
|
|
256
256
|
resolver(nil)
|
|
257
257
|
}
|
|
258
258
|
}
|
|
259
|
-
|
|
259
|
+
|
|
260
260
|
// MARK: Helpers
|
|
261
|
-
|
|
261
|
+
|
|
262
262
|
private func detectImplemetedCallbacks() {
|
|
263
263
|
sendEvent(withName: PrimerEvents.detectImplementedRNCallbacks.stringValue, body: nil)
|
|
264
264
|
}
|
|
265
|
-
|
|
265
|
+
|
|
266
266
|
@objc
|
|
267
267
|
public func setImplementedRNCallbacks(_ implementedRNCallbacksStr: String, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
|
|
268
268
|
DispatchQueue.main.async {
|
|
@@ -279,13 +279,13 @@ class RNTPrimerHeadlessUniversalCheckout: RCTEventEmitter {
|
|
|
279
279
|
}
|
|
280
280
|
}
|
|
281
281
|
}
|
|
282
|
-
|
|
282
|
+
|
|
283
283
|
private func handleRNBridgeError(_ error: Error, checkoutData: PrimerCheckoutData?, stopOnDebug: Bool) {
|
|
284
284
|
DispatchQueue.main.async {
|
|
285
285
|
if stopOnDebug {
|
|
286
286
|
assertionFailure(error.localizedDescription)
|
|
287
287
|
}
|
|
288
|
-
|
|
288
|
+
|
|
289
289
|
var body: [String: Any] = ["error": error.rnError]
|
|
290
290
|
if let checkoutData = checkoutData,
|
|
291
291
|
let data = try? JSONEncoder().encode(checkoutData),
|
|
@@ -301,23 +301,23 @@ class RNTPrimerHeadlessUniversalCheckout: RCTEventEmitter {
|
|
|
301
301
|
// MARK: - EVENTS
|
|
302
302
|
|
|
303
303
|
extension RNTPrimerHeadlessUniversalCheckout: PrimerHeadlessUniversalCheckoutDelegate {
|
|
304
|
-
|
|
304
|
+
|
|
305
305
|
func primerHeadlessUniversalCheckoutPreparationDidStart(for paymentMethodType: String) {
|
|
306
306
|
sendEvent(withName: PrimerHeadlessUniversalCheckoutEvents.onHUCPrepareStart.stringValue, body: ["paymentMethodType": paymentMethodType])
|
|
307
307
|
}
|
|
308
|
-
|
|
308
|
+
|
|
309
309
|
func primerHeadlessUniversalCheckoutTokenizationDidStart(for paymentMethodType: String) {
|
|
310
310
|
sendEvent(withName: PrimerHeadlessUniversalCheckoutEvents.onHUCTokenizeStart.stringValue, body: ["paymentMethodType": paymentMethodType])
|
|
311
311
|
}
|
|
312
|
-
|
|
312
|
+
|
|
313
313
|
func primerHeadlessUniversalCheckoutDidLoadAvailablePaymentMethods(_ paymentMethodTypes: [String]) {
|
|
314
314
|
sendEvent(withName: PrimerHeadlessUniversalCheckoutEvents.onHUCAvailablePaymentMethodsLoaded.stringValue, body: ["paymentMethodTypes": paymentMethodTypes])
|
|
315
315
|
}
|
|
316
|
-
|
|
316
|
+
|
|
317
317
|
func primerHeadlessUniversalCheckoutPaymentMethodDidShow(for paymentMethodType: String) {
|
|
318
318
|
sendEvent(withName: PrimerHeadlessUniversalCheckoutEvents.onHUCPaymentMethodShow.stringValue, body: ["paymentMethodType": paymentMethodType])
|
|
319
319
|
}
|
|
320
|
-
|
|
320
|
+
|
|
321
321
|
func primerHeadlessUniversalCheckoutDidTokenizePaymentMethod(_ paymentMethodTokenData: PrimerPaymentMethodTokenData, decisionHandler: @escaping (PrimerResumeDecision) -> Void) {
|
|
322
322
|
if self.implementedRNCallbacks?.isOnTokenizeSuccessImplemented == true {
|
|
323
323
|
self.primerDidTokenizePaymentMethodDecisionHandler = { (newClientToken, errorMessage) in
|
|
@@ -331,7 +331,7 @@ extension RNTPrimerHeadlessUniversalCheckout: PrimerHeadlessUniversalCheckoutDel
|
|
|
331
331
|
}
|
|
332
332
|
}
|
|
333
333
|
}
|
|
334
|
-
|
|
334
|
+
|
|
335
335
|
do {
|
|
336
336
|
let data = try JSONEncoder().encode(paymentMethodTokenData)
|
|
337
337
|
let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
|
|
@@ -347,7 +347,7 @@ extension RNTPrimerHeadlessUniversalCheckout: PrimerHeadlessUniversalCheckoutDel
|
|
|
347
347
|
// auto flow.
|
|
348
348
|
}
|
|
349
349
|
}
|
|
350
|
-
|
|
350
|
+
|
|
351
351
|
func primerHeadlessUniversalCheckoutDidResumeWith(_ resumeToken: String, decisionHandler: @escaping (PrimerResumeDecision) -> Void) {
|
|
352
352
|
if self.implementedRNCallbacks?.isOnResumeSuccessImplemented == true {
|
|
353
353
|
self.primerDidResumeWithDecisionHandler = { (resumeToken, errorMessage) in
|
|
@@ -361,7 +361,7 @@ extension RNTPrimerHeadlessUniversalCheckout: PrimerHeadlessUniversalCheckoutDel
|
|
|
361
361
|
}
|
|
362
362
|
}
|
|
363
363
|
}
|
|
364
|
-
|
|
364
|
+
|
|
365
365
|
DispatchQueue.main.async {
|
|
366
366
|
self.sendEvent(withName: PrimerHeadlessUniversalCheckoutEvents.onResumeSuccess.stringValue, body: ["resumeToken": resumeToken])
|
|
367
367
|
}
|
|
@@ -370,18 +370,18 @@ extension RNTPrimerHeadlessUniversalCheckout: PrimerHeadlessUniversalCheckoutDel
|
|
|
370
370
|
// Throw an error if it's the manual flow.
|
|
371
371
|
}
|
|
372
372
|
}
|
|
373
|
-
|
|
373
|
+
|
|
374
374
|
func primerHeadlessUniversalCheckoutDidFail(withError err: Error) {
|
|
375
375
|
if self.implementedRNCallbacks?.isOnErrorImplemented == true {
|
|
376
376
|
// Send the error message to the RN bridge.
|
|
377
377
|
self.handleRNBridgeError(err, checkoutData: nil, stopOnDebug: false)
|
|
378
|
-
|
|
378
|
+
|
|
379
379
|
} else {
|
|
380
380
|
// RN dev hasn't opted in on listening SDK dismiss.
|
|
381
381
|
// Ignore!
|
|
382
382
|
}
|
|
383
383
|
}
|
|
384
|
-
|
|
384
|
+
|
|
385
385
|
func primerHeadlessUniversalCheckoutDidCompleteCheckoutWithData(_ data: PrimerCheckoutData) {
|
|
386
386
|
DispatchQueue.main.async {
|
|
387
387
|
if self.implementedRNCallbacks?.isOnCheckoutCompleteImplemented == true {
|
|
@@ -398,7 +398,7 @@ extension RNTPrimerHeadlessUniversalCheckout: PrimerHeadlessUniversalCheckoutDel
|
|
|
398
398
|
}
|
|
399
399
|
}
|
|
400
400
|
}
|
|
401
|
-
|
|
401
|
+
|
|
402
402
|
func primerHeadlessUniversalCheckoutClientSessionWillUpdate() {
|
|
403
403
|
if self.implementedRNCallbacks?.isOnBeforeClientSessionUpdateImplemented == true {
|
|
404
404
|
DispatchQueue.main.async {
|
|
@@ -408,7 +408,7 @@ extension RNTPrimerHeadlessUniversalCheckout: PrimerHeadlessUniversalCheckoutDel
|
|
|
408
408
|
// RN Dev hasn't implemented this callback, ignore.
|
|
409
409
|
}
|
|
410
410
|
}
|
|
411
|
-
|
|
411
|
+
|
|
412
412
|
func primerHeadlessUniversalCheckoutClientSessionDidUpdate(_ clientSession: PrimerClientSession) {
|
|
413
413
|
if self.implementedRNCallbacks?.isOnClientSessionUpdateImplemented == true {
|
|
414
414
|
do {
|
|
@@ -424,7 +424,7 @@ extension RNTPrimerHeadlessUniversalCheckout: PrimerHeadlessUniversalCheckoutDel
|
|
|
424
424
|
// RN Dev hasn't implemented this callback, ignore.
|
|
425
425
|
}
|
|
426
426
|
}
|
|
427
|
-
|
|
427
|
+
|
|
428
428
|
func primerHeadlessUniversalCheckoutWillCreatePaymentWithData(_ data: PrimerCheckoutPaymentMethodData, decisionHandler: @escaping (PrimerPaymentCreationDecision) -> Void) {
|
|
429
429
|
if self.implementedRNCallbacks?.isOnBeforePaymentCreateImplemented == true {
|
|
430
430
|
self.primerWillCreatePaymentWithDataDecisionHandler = { errorMessage in
|
|
@@ -436,7 +436,7 @@ extension RNTPrimerHeadlessUniversalCheckout: PrimerHeadlessUniversalCheckoutDel
|
|
|
436
436
|
}
|
|
437
437
|
}
|
|
438
438
|
}
|
|
439
|
-
|
|
439
|
+
|
|
440
440
|
DispatchQueue.main.async {
|
|
441
441
|
do {
|
|
442
442
|
let checkoutPaymentmethodData = try JSONEncoder().encode(data)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//
|
|
2
|
+
// RNTPrimerHeadlessUniversalCheckoutRawDataManager.m
|
|
3
|
+
// primer-io-react-native
|
|
4
|
+
//
|
|
5
|
+
// Created by Evangelos on 3/8/22.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#import <React/RCTBridgeModule.h>
|
|
9
|
+
#import <React/RCTEventEmitter.h>
|
|
10
|
+
|
|
11
|
+
@interface RCT_EXTERN_MODULE(PrimerHeadlessUniversalCheckoutRawDataManager, RCTEventEmitter)
|
|
12
|
+
|
|
13
|
+
RCT_EXTERN_METHOD(initialize:(NSString *)paymentMethodTypeStr resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
|
|
14
|
+
|
|
15
|
+
RCT_EXTERN_METHOD(listRequiredInputElementTypesForPaymentMethodType:(NSString *)paymentMethodTypeStr resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
|
|
16
|
+
|
|
17
|
+
RCT_EXTERN_METHOD(setRawData:(NSString *)rawDataStr resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
|
|
18
|
+
|
|
19
|
+
RCT_EXTERN_METHOD(submit:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
|
|
20
|
+
|
|
21
|
+
@end
|
package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutRawDataManager.swift
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
//
|
|
2
|
+
// RNTPrimerHeadlessUniversalCheckoutRawDataManager.swift
|
|
3
|
+
// primer-io-react-native
|
|
4
|
+
//
|
|
5
|
+
// Created by Evangelos on 3/8/22.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
import PrimerSDK
|
|
10
|
+
|
|
11
|
+
@objc
|
|
12
|
+
enum PrimerHeadlessUniversalCheckoutRawDataManagerEvents: Int, CaseIterable {
|
|
13
|
+
|
|
14
|
+
case onMetadataChange = 0
|
|
15
|
+
case onValidation
|
|
16
|
+
case onNativeError
|
|
17
|
+
|
|
18
|
+
var stringValue: String {
|
|
19
|
+
switch self {
|
|
20
|
+
case .onMetadataChange:
|
|
21
|
+
return "onMetadataChange"
|
|
22
|
+
case .onValidation:
|
|
23
|
+
return "onValidation"
|
|
24
|
+
case .onNativeError:
|
|
25
|
+
return "onNativeError"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
@objc(PrimerHeadlessUniversalCheckoutRawDataManager)
|
|
31
|
+
class RNTPrimerHeadlessUniversalCheckoutRawDataManager: RCTEventEmitter {
|
|
32
|
+
|
|
33
|
+
private var rawDataManager: PrimerHeadlessUniversalCheckout.RawDataManager!
|
|
34
|
+
private var paymentMethodType: String?
|
|
35
|
+
|
|
36
|
+
override class func requiresMainQueueSetup() -> Bool {
|
|
37
|
+
return true
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
override func supportedEvents() -> [String]! {
|
|
41
|
+
return PrimerHeadlessUniversalCheckoutRawDataManagerEvents.allCases.compactMap({ $0.stringValue })
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// MARK: - API
|
|
45
|
+
|
|
46
|
+
@objc
|
|
47
|
+
public func initialize(
|
|
48
|
+
_ paymentMethodTypeStr: String,
|
|
49
|
+
resolver: RCTPromiseResolveBlock,
|
|
50
|
+
rejecter: RCTPromiseRejectBlock
|
|
51
|
+
) {
|
|
52
|
+
self.paymentMethodType = paymentMethodTypeStr
|
|
53
|
+
|
|
54
|
+
do {
|
|
55
|
+
self.rawDataManager = try PrimerHeadlessUniversalCheckout.RawDataManager(paymentMethodType: self.paymentMethodType!)
|
|
56
|
+
self.rawDataManager.delegate = self
|
|
57
|
+
resolver(nil)
|
|
58
|
+
} catch {
|
|
59
|
+
rejecter(error.rnError["errorId"]!, error.rnError["description"], error)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@objc
|
|
64
|
+
public func listRequiredInputElementTypesForPaymentMethodType(
|
|
65
|
+
_ paymentMethodTypeStr: String,
|
|
66
|
+
resolver: RCTPromiseResolveBlock,
|
|
67
|
+
rejecter: RCTPromiseRejectBlock
|
|
68
|
+
) {
|
|
69
|
+
guard let rawDataManager = rawDataManager else {
|
|
70
|
+
let err = NSError(domain: "native-bridge", code: 1, userInfo: [NSLocalizedDescriptionKey: "The PrimerHeadlessUniversalCheckoutRawDataManager has not been initialized. Make sure you have called the PrimerHeadlessUniversalCheckoutRawDataManager.configure function first."])
|
|
71
|
+
rejecter(err.rnError["errorId"]!, err.rnError["description"], err)
|
|
72
|
+
return
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
let inputElementTypes = rawDataManager.listRequiredInputElementTypes(for: rawDataManager.paymentMethodType).compactMap({ $0.stringValue })
|
|
76
|
+
resolver(["inputElementTypes": inputElementTypes])
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@objc
|
|
80
|
+
public func setRawData(
|
|
81
|
+
_ rawDataStr: String,
|
|
82
|
+
resolver: RCTPromiseResolveBlock,
|
|
83
|
+
rejecter: RCTPromiseRejectBlock
|
|
84
|
+
) {
|
|
85
|
+
guard let rawDataManager = rawDataManager else {
|
|
86
|
+
let err = NSError(domain: "native-bridge", code: 1, userInfo: [NSLocalizedDescriptionKey: "The PrimerHeadlessUniversalCheckoutRawDataManager has not been initialized. Make sure you have called the PrimerHeadlessUniversalCheckoutRawDataManager.configure function first."])
|
|
87
|
+
rejecter(err.rnError["errorId"]!, err.rnError["description"], err)
|
|
88
|
+
return
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
guard let rawCardData = PrimerCardData(cardDataStr: rawDataStr) else {
|
|
92
|
+
let err = NSError(domain: "native-bridge", code: 1, userInfo: [NSLocalizedDescriptionKey: "Failed to decode PrimerCardData on iOS. Make sure you're providing a valid 'PrimerRawCardData' object"])
|
|
93
|
+
rejecter(err.rnError["errorId"]!, err.rnError["description"], err)
|
|
94
|
+
return
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
rawDataManager.rawData = rawCardData
|
|
98
|
+
resolver(nil)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
@objc
|
|
102
|
+
public func submit(
|
|
103
|
+
_ resolver: RCTPromiseResolveBlock,
|
|
104
|
+
rejecter: RCTPromiseRejectBlock
|
|
105
|
+
) {
|
|
106
|
+
guard let rawDataManager = rawDataManager else {
|
|
107
|
+
let err = NSError(domain: "native-bridge", code: 1, userInfo: [NSLocalizedDescriptionKey: "The PrimerHeadlessUniversalCheckoutRawDataManager has not been initialized. Make sure you have called the PrimerHeadlessUniversalCheckoutRawDataManager.configure function first."])
|
|
108
|
+
rejecter(err.rnError["errorId"]!, err.rnError["description"], err)
|
|
109
|
+
return
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
rawDataManager.submit()
|
|
113
|
+
resolver(nil)
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
extension RNTPrimerHeadlessUniversalCheckoutRawDataManager: PrimerRawDataManagerDelegate {
|
|
118
|
+
|
|
119
|
+
func primerRawDataManager(_ rawDataManager: PrimerHeadlessUniversalCheckout.RawDataManager, metadataDidChange metadata: [String : Any]?) {
|
|
120
|
+
DispatchQueue.main.async {
|
|
121
|
+
self.sendEvent(withName: PrimerHeadlessUniversalCheckoutRawDataManagerEvents.onMetadataChange.stringValue, body: metadata)
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
func primerRawDataManager(_ rawDataManager: PrimerHeadlessUniversalCheckout.RawDataManager, dataIsValid isValid: Bool, errors: [Error]?) {
|
|
126
|
+
DispatchQueue.main.async {
|
|
127
|
+
var body: [String: Any] = ["isValid": isValid]
|
|
128
|
+
if let errors = errors {
|
|
129
|
+
let rnErrors = errors.compactMap({ $0.rnError })
|
|
130
|
+
body["errors"] = rnErrors
|
|
131
|
+
}
|
|
132
|
+
self.sendEvent(withName: PrimerHeadlessUniversalCheckoutRawDataManagerEvents.onValidation.stringValue, body: body)
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
private func handleRNBridgeError(_ error: Error, checkoutData: PrimerCheckoutData?, stopOnDebug: Bool) {
|
|
137
|
+
DispatchQueue.main.async {
|
|
138
|
+
if stopOnDebug {
|
|
139
|
+
assertionFailure(error.localizedDescription)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
var body: [String: Any] = ["error": error.rnError]
|
|
143
|
+
if let checkoutData = checkoutData,
|
|
144
|
+
let data = try? JSONEncoder().encode(checkoutData),
|
|
145
|
+
let json = try? JSONSerialization.jsonObject(with: data){
|
|
146
|
+
body["checkoutData"] = json
|
|
147
|
+
}
|
|
148
|
+
print(body)
|
|
149
|
+
self.sendEvent(withName: PrimerEvents.onError.stringValue, body: body)
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.PrimerHeadlessUniversalCheckout = void 0;
|
|
6
|
+
exports.primerSettings = exports.PrimerHeadlessUniversalCheckout = void 0;
|
|
7
7
|
|
|
8
8
|
var _RNPrimerHeadlessUniversalCheckout = _interopRequireDefault(require("./RNPrimerHeadlessUniversalCheckout"));
|
|
9
9
|
|
|
@@ -80,6 +80,7 @@ const paymentCreationHandler = {
|
|
|
80
80
|
}
|
|
81
81
|
};
|
|
82
82
|
let primerSettings = undefined;
|
|
83
|
+
exports.primerSettings = primerSettings;
|
|
83
84
|
|
|
84
85
|
async function configureListeners() {
|
|
85
86
|
return new Promise(async (resolve, reject) => {
|
|
@@ -156,7 +157,7 @@ async function configureListeners() {
|
|
|
156
157
|
if (primerSettings && primerSettings.onAvailablePaymentMethodsLoad) {
|
|
157
158
|
if (data && data.paymentMethodTypes) {
|
|
158
159
|
const paymentMethodTypes = data.paymentMethodTypes;
|
|
159
|
-
const availablePaymentMethodTypes = paymentMethodTypes
|
|
160
|
+
const availablePaymentMethodTypes = paymentMethodTypes;
|
|
160
161
|
primerSettings.onAvailablePaymentMethodsLoad(availablePaymentMethodTypes || ['not implemented']);
|
|
161
162
|
} else {
|
|
162
163
|
primerSettings.onAvailablePaymentMethodsLoad(['not implemented']);
|
|
@@ -243,12 +244,12 @@ class PrimerHeadlessUniversalCheckoutClass {
|
|
|
243
244
|
|
|
244
245
|
|
|
245
246
|
startWithClientToken(clientToken, settings) {
|
|
246
|
-
primerSettings = settings;
|
|
247
|
+
exports.primerSettings = primerSettings = settings;
|
|
247
248
|
return new Promise(async (resolve, reject) => {
|
|
248
249
|
try {
|
|
249
250
|
await configureListeners();
|
|
250
251
|
const hucResponse = await _RNPrimerHeadlessUniversalCheckout.default.startWithClientToken(clientToken, settings);
|
|
251
|
-
const availablePaymentMethodTypes = hucResponse.paymentMethodTypes
|
|
252
|
+
const availablePaymentMethodTypes = hucResponse.paymentMethodTypes;
|
|
252
253
|
resolve(availablePaymentMethodTypes);
|
|
253
254
|
} catch (err) {
|
|
254
255
|
reject(err);
|