@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.
Files changed (46) hide show
  1. package/android/.project +11 -0
  2. package/android/.settings/org.eclipse.buildship.core.prefs +2 -2
  3. package/android/build.gradle +1 -1
  4. package/android/src/main/java/com/primerioreactnative/PrimerRNHeadlessUniversalCheckout.kt +5 -5
  5. package/android/src/main/java/com/primerioreactnative/ReactNativePackage.kt +3 -1
  6. package/android/src/main/java/com/primerioreactnative/huc/datamodels/manager/raw/PrimerRNHeadlessCheckoutInputData.kt +22 -0
  7. package/android/src/main/java/com/primerioreactnative/huc/events/PrimerHeadlessUniversalCheckoutRawDataManagerEvent.kt +7 -0
  8. package/android/src/main/java/com/primerioreactnative/huc/manager/raw/PrimerRNHeadlessUniversalCheckoutRawManager.kt +140 -0
  9. package/android/src/main/java/com/primerioreactnative/huc/manager/raw/PrimerRNHeadlessUniversalCheckoutRawManagerListener.kt +49 -0
  10. package/ios/DataModels/PrimerErrorRN.swift +2 -0
  11. package/ios/DataModels/RNTPrimerCardData.swift +46 -0
  12. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.swift +53 -53
  13. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutRawDataManager.m +21 -0
  14. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutRawDataManager.swift +152 -0
  15. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js +5 -4
  16. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +1 -1
  17. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js +106 -0
  18. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -0
  19. package/lib/commonjs/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js +85 -0
  20. package/lib/commonjs/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -0
  21. package/lib/commonjs/index.js +28 -6
  22. package/lib/commonjs/index.js.map +1 -1
  23. package/lib/commonjs/models/PrimerRawData.js +2 -0
  24. package/lib/commonjs/models/PrimerRawData.js.map +1 -0
  25. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js +3 -3
  26. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +1 -1
  27. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js +88 -0
  28. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -0
  29. package/lib/module/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js +76 -0
  30. package/lib/module/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -0
  31. package/lib/module/index.js +3 -1
  32. package/lib/module/index.js.map +1 -1
  33. package/lib/module/models/PrimerRawData.js +2 -0
  34. package/lib/module/models/PrimerRawData.js.map +1 -0
  35. package/lib/typescript/src/headless_checkout/PrimerHeadlessUniversalCheckout.d.ts +1 -0
  36. package/lib/typescript/src/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.d.ts +16 -0
  37. package/lib/typescript/src/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.d.ts +12 -0
  38. package/lib/typescript/src/index.d.ts +3 -1
  39. package/lib/typescript/src/models/PrimerRawData.d.ts +9 -0
  40. package/package.json +1 -1
  41. package/primer-io-react-native.podspec +1 -1
  42. package/src/headless_checkout/PrimerHeadlessUniversalCheckout.ts +3 -3
  43. package/src/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.ts +104 -0
  44. package/src/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.ts +91 -0
  45. package/src/index.tsx +8 -1
  46. 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
@@ -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.filter(pmt => pmt !== 'PAYMENT_CARD');
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.filter(pmt => pmt !== 'PAYMENT_CARD');
252
+ const availablePaymentMethodTypes = hucResponse.paymentMethodTypes;
252
253
  resolve(availablePaymentMethodTypes);
253
254
  } catch (err) {
254
255
  reject(err);