@primer-io/react-native 0.13.0-beta.1 → 0.15.2

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 (101) hide show
  1. package/android/build.gradle +6 -2
  2. package/android/consumer-rules.pro +12 -0
  3. package/android/gradle.properties +1 -1
  4. package/android/src/main/java/com/primerioreactnative/PrimerRN.kt +192 -153
  5. package/android/src/main/java/com/primerioreactnative/PrimerRNEventListener.kt +131 -86
  6. package/android/src/main/java/com/primerioreactnative/ReactNativePackage.kt +3 -14
  7. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerErrorRN.kt +3 -4
  8. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerEventsRN.kt +11 -0
  9. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerSettingsRN.kt +4 -3
  10. package/android/src/main/java/com/primerioreactnative/utils/ErrorHelper.kt +11 -0
  11. package/android/src/main/java/com/primerioreactnative/utils/PrimerImplementedRNCallbacks.kt +14 -0
  12. package/ios/DataModels/PrimerErrorRN.swift +1 -1
  13. package/ios/DataModels/PrimerSettingsRN.swift +6 -0
  14. package/ios/RNTPrimer.m +43 -0
  15. package/ios/RNTPrimer.swift +394 -0
  16. package/ios/ReactNative-Bridging-Header.h +3 -0
  17. package/ios/ReactNative.xcodeproj/project.pbxproj +44 -0
  18. package/lib/commonjs/Primer.js +220 -209
  19. package/lib/commonjs/Primer.js.map +1 -1
  20. package/lib/commonjs/RNPrimer.js +145 -0
  21. package/lib/commonjs/RNPrimer.js.map +1 -0
  22. package/lib/commonjs/index.js +1 -28
  23. package/lib/commonjs/index.js.map +1 -1
  24. package/lib/commonjs/models/primer-intent.js.map +1 -1
  25. package/lib/commonjs/models/utils/redirectScheme.js +4 -0
  26. package/lib/commonjs/models/utils/redirectScheme.js.map +1 -0
  27. package/lib/module/Primer.js +204 -210
  28. package/lib/module/Primer.js.map +1 -1
  29. package/lib/module/RNPrimer.js +136 -0
  30. package/lib/module/RNPrimer.js.map +1 -0
  31. package/lib/module/index.js +3 -4
  32. package/lib/module/index.js.map +1 -1
  33. package/lib/module/models/primer-intent.js.map +1 -1
  34. package/lib/module/models/utils/redirectScheme.js +2 -0
  35. package/lib/module/models/utils/redirectScheme.js.map +1 -0
  36. package/lib/typescript/Primer.d.ts +13 -0
  37. package/lib/typescript/RNPrimer.d.ts +24 -0
  38. package/lib/typescript/index.d.ts +1 -3
  39. package/lib/typescript/models/primer-callbacks.d.ts +7 -9
  40. package/lib/typescript/models/primer-config.d.ts +16 -13
  41. package/lib/typescript/models/primer-intent.d.ts +1 -1
  42. package/lib/typescript/models/primer-request.d.ts +2 -12
  43. package/lib/typescript/models/primer-settings.d.ts +5 -6
  44. package/lib/typescript/models/primer.d.ts +4 -4
  45. package/lib/typescript/models/utils/redirectScheme.d.ts +3 -0
  46. package/package.json +4 -1
  47. package/primer-io-react-native.podspec +2 -3
  48. package/src/Primer.ts +227 -178
  49. package/src/RNPrimer.ts +170 -0
  50. package/src/index.tsx +2 -3
  51. package/src/models/primer-callbacks.ts +9 -27
  52. package/src/models/primer-config.ts +23 -20
  53. package/src/models/primer-intent.ts +1 -1
  54. package/src/models/primer-request.ts +2 -16
  55. package/src/models/primer-settings.ts +5 -6
  56. package/src/models/primer.ts +5 -5
  57. package/src/models/utils/redirectScheme.ts +5 -0
  58. package/android/src/main/java/com/primerioreactnative/PrimerCardNumberEditTextManager.kt +0 -83
  59. package/android/src/main/java/com/primerioreactnative/PrimerHeadlessUniversalCheckout.kt +0 -201
  60. package/android/src/main/java/com/primerioreactnative/huc/assets/AssetsManager.kt +0 -56
  61. package/android/src/main/java/com/primerioreactnative/huc/events/PrimerHeadlessUniversalCheckoutEvent.kt +0 -11
  62. package/android/src/main/java/com/primerioreactnative/huc/extensions/Map.kt +0 -10
  63. package/ios/Core/PrimerRN+PrimerDelegate.swift +0 -148
  64. package/ios/Core/PrimerRN.m +0 -34
  65. package/ios/Core/PrimerRN.swift +0 -168
  66. package/ios/Core/ReactNative-Bridging-Header.h +0 -13
  67. package/ios/Headless Universal Checkout/RNTPrimerCardNumberInputElementManager.m +0 -23
  68. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.m +0 -30
  69. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.swift +0 -241
  70. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.m +0 -14
  71. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.swift +0 -117
  72. package/lib/commonjs/PrimerInput.js +0 -80
  73. package/lib/commonjs/PrimerInput.js.map +0 -1
  74. package/lib/commonjs/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js +0 -14
  75. package/lib/commonjs/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js.map +0 -1
  76. package/lib/commonjs/headless_checkout/NativePrimerHeadlessUniversalCheckout.js +0 -73
  77. package/lib/commonjs/headless_checkout/NativePrimerHeadlessUniversalCheckout.js.map +0 -1
  78. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js +0 -119
  79. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +0 -1
  80. package/lib/commonjs/headless_checkout/types.js +0 -2
  81. package/lib/commonjs/headless_checkout/types.js.map +0 -1
  82. package/lib/module/PrimerInput.js +0 -46
  83. package/lib/module/PrimerInput.js.map +0 -1
  84. package/lib/module/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js +0 -5
  85. package/lib/module/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js.map +0 -1
  86. package/lib/module/headless_checkout/NativePrimerHeadlessUniversalCheckout.js +0 -64
  87. package/lib/module/headless_checkout/NativePrimerHeadlessUniversalCheckout.js.map +0 -1
  88. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js +0 -104
  89. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +0 -1
  90. package/lib/module/headless_checkout/types.js +0 -2
  91. package/lib/module/headless_checkout/types.js.map +0 -1
  92. package/lib/typescript/PrimerInput.d.ts +0 -15
  93. package/lib/typescript/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.d.ts +0 -1
  94. package/lib/typescript/headless_checkout/NativePrimerHeadlessUniversalCheckout.d.ts +0 -10
  95. package/lib/typescript/headless_checkout/PrimerHeadlessUniversalCheckout.d.ts +0 -14
  96. package/lib/typescript/headless_checkout/types.d.ts +0 -16
  97. package/src/PrimerInput.tsx +0 -73
  98. package/src/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.tsx +0 -2
  99. package/src/headless_checkout/NativePrimerHeadlessUniversalCheckout.ts +0 -94
  100. package/src/headless_checkout/PrimerHeadlessUniversalCheckout.ts +0 -136
  101. package/src/headless_checkout/types.ts +0 -18
@@ -0,0 +1,394 @@
1
+ //
2
+ // Primer.swift
3
+ // primer-io-react-native
4
+ //
5
+ // Created by Evangelos on 15/3/22.
6
+ //
7
+
8
+ import Foundation
9
+ import PrimerSDK
10
+ import UIKit
11
+
12
+ @objc
13
+ enum PrimerEvents: Int, CaseIterable {
14
+ case onClientTokenCallback = 0
15
+ case onClientSessionActions
16
+ case onTokenizeSuccessCallback
17
+ case onVaultSuccess
18
+ case onResumeSuccess
19
+ case onCheckoutDismissed
20
+ case onError
21
+
22
+ case detectImplementedRNCallbacks
23
+
24
+ var stringValue: String {
25
+ switch self {
26
+ case .onClientTokenCallback:
27
+ return "onClientTokenCallback"
28
+ case .onClientSessionActions:
29
+ return "onClientSessionActions"
30
+ case .onTokenizeSuccessCallback:
31
+ return "onTokenizeSuccessCallback"
32
+ case .onVaultSuccess:
33
+ return "onVaultSuccess"
34
+ case .onResumeSuccess:
35
+ return "onResumeSuccess"
36
+ case .onCheckoutDismissed:
37
+ return "onCheckoutDismissed"
38
+ case .onError:
39
+ return "onError"
40
+ case .detectImplementedRNCallbacks:
41
+ return "detectImplementedRNCallbacks"
42
+ }
43
+ }
44
+ }
45
+
46
+ @objc(NativePrimer)
47
+ class RNTPrimer: RCTEventEmitter {
48
+
49
+ private var isClientTokenCallbackImplementedInRN: Bool?
50
+ private var clientTokenCallback: ((String?, Error?) -> Void)?
51
+ private var isOnClientSessionActionsImplementedInRN: Bool?
52
+ private var onClientSessionActions: ((String?, Error?) -> Void)?
53
+ private var onTokenizeSuccess: ((String?, Error?) -> Void)?
54
+ private var onResumeSuccess: ((String?, Error?) -> Void)?
55
+ private var implementedReactNativeCallbacks: ImplementedReactNativeCallbacks?
56
+
57
+ // MARK: - INITIALIZATION & REACT NATIVE SUPPORT
58
+
59
+ override class func requiresMainQueueSetup() -> Bool {
60
+ return true
61
+ }
62
+
63
+ deinit {
64
+ print("🧨 deinit: \(self) \(Unmanaged.passUnretained(self).toOpaque())")
65
+ }
66
+
67
+ override init() {
68
+ super.init()
69
+ PrimerSDK.Primer.shared.delegate = self
70
+ }
71
+
72
+ override func supportedEvents() -> [String]! {
73
+ return PrimerEvents.allCases.compactMap({ $0.stringValue })
74
+ }
75
+
76
+ // MARK: - API
77
+
78
+ @objc
79
+ public func configureWithSettings(_ settingsStr: String, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
80
+ DispatchQueue.main.async {
81
+ do {
82
+ try self.configure(settingsStr: settingsStr)
83
+ resolver(nil)
84
+ } catch {
85
+ self.checkoutFailed(with: error)
86
+ rejecter(error.rnError["errorId"]!, error.rnError["description"], error)
87
+ }
88
+ }
89
+ }
90
+
91
+ @objc
92
+ public func configureWithTheme(_ themeStr: String, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
93
+ DispatchQueue.main.async {
94
+ do {
95
+ try self.configure(themeStr: themeStr)
96
+ resolver(nil)
97
+ } catch {
98
+ self.checkoutFailed(with: error)
99
+ rejecter(error.rnError["errorId"]!, error.rnError["description"], error)
100
+ }
101
+ }
102
+ }
103
+
104
+ @objc
105
+ public func showUniversalCheckout(_ resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
106
+ DispatchQueue.main.async {
107
+ PrimerSDK.Primer.shared.showUniversalCheckout(on: UIViewController(), clientToken: nil)
108
+ resolver(nil)
109
+ }
110
+ }
111
+
112
+ @objc
113
+ public func showUniversalCheckoutWithClientToken(_ clientToken: String, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
114
+ DispatchQueue.main.async {
115
+ PrimerSDK.Primer.shared.showUniversalCheckout(on: UIViewController(), clientToken: clientToken)
116
+ resolver(nil)
117
+ }
118
+ }
119
+
120
+ @objc
121
+ public func showVaultManager(_ resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
122
+ DispatchQueue.main.async {
123
+ PrimerSDK.Primer.shared.showVaultManager(on: UIViewController(), clientToken: nil)
124
+ resolver(nil)
125
+ }
126
+ }
127
+
128
+ @objc
129
+ public func showVaultManager(_ clientToken: String, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
130
+ DispatchQueue.main.async {
131
+ PrimerSDK.Primer.shared.showVaultManager(on: UIViewController(), clientToken: clientToken)
132
+ resolver(nil)
133
+ }
134
+ }
135
+
136
+ @objc
137
+ public func showPaymentMethod(_ clientToken: String, paymentMethodStr: String, intentStr: String, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
138
+ DispatchQueue.main.async {
139
+ do {
140
+ let paymentMethodConfigType = PaymentMethodConfigType(rawValue: paymentMethodStr)
141
+
142
+ guard paymentMethodConfigType != PaymentMethodConfigType.other(rawValue: paymentMethodStr) else {
143
+ let err = NSError(domain: "native-bridge", code: 0, userInfo: [NSLocalizedDescriptionKey: "Payment method type \(paymentMethodStr) is not valid."])
144
+ throw err
145
+ }
146
+
147
+ guard let intent = PrimerSessionIntent(rawValue: intentStr) else {
148
+ let err = NSError(domain: "native-bridge", code: 0, userInfo: [NSLocalizedDescriptionKey: "Intent \(intentStr) is not valid."])
149
+ throw err
150
+ }
151
+
152
+ PrimerSDK.Primer.shared.showPaymentMethod(paymentMethodConfigType, withIntent: intent, on: UIViewController(), with: clientToken)
153
+ resolver(nil)
154
+ } catch {
155
+ self.checkoutFailed(with: error)
156
+ rejecter(error.rnError["errorId"]!, error.rnError["description"], error)
157
+ }
158
+
159
+ }
160
+ }
161
+
162
+ @objc
163
+ public func handleNewClientToken(_ clientToken: String, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
164
+ DispatchQueue.main.async {
165
+ self.callCallbackWithClientToken(clientToken)
166
+ resolver(nil)
167
+ }
168
+ }
169
+
170
+ @objc
171
+ public func handleError(_ errorStr: String, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
172
+ DispatchQueue.main.async {
173
+ do {
174
+ guard let errorData = errorStr.data(using: .utf8) else {
175
+ let err = NSError(domain: "native-bridge", code: 0, userInfo: [NSLocalizedDescriptionKey: "Failed to convert string to data"])
176
+ throw err
177
+ }
178
+
179
+ let err = try JSONDecoder().decode(NativeError.self, from: errorData)
180
+ self.callCallbackWithError(err)
181
+ resolver(nil)
182
+ } catch {
183
+ self.checkoutFailed(with: error)
184
+ rejecter(error.rnError["errorId"]!, error.rnError["description"], error)
185
+ }
186
+ }
187
+ }
188
+
189
+ @objc
190
+ public func handleSuccess(_ resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
191
+ DispatchQueue.main.async {
192
+ self.callCallbackToContinueFlow()
193
+ resolver(nil)
194
+ }
195
+ }
196
+
197
+ @objc
198
+ public func setImplementedRNCallbacks(_ implementedRNCallbacksStr: String, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
199
+ DispatchQueue.main.async {
200
+ do {
201
+ guard let implementedRNCallbacksData = implementedRNCallbacksStr.data(using: .utf8) else {
202
+ let err = NSError(domain: "native-bridge", code: 0, userInfo: [NSLocalizedDescriptionKey: "Failed to convert string to data"])
203
+ throw err
204
+ }
205
+ self.implementedReactNativeCallbacks = try JSONDecoder().decode(ImplementedReactNativeCallbacks.self, from: implementedRNCallbacksData)
206
+ Primer.shared.setImplementedReactNativeCallbacks(self.implementedReactNativeCallbacks!)
207
+ resolver(nil)
208
+ } catch {
209
+ self.checkoutFailed(with: error)
210
+ rejecter(error.rnError["errorId"]!, error.rnError["description"], error)
211
+ }
212
+ }
213
+ }
214
+
215
+ // MARK: - HELPERS
216
+
217
+ private func configure(settingsStr: String? = nil, themeStr: String? = nil) throws {
218
+ var settings: PrimerSettings?
219
+ if let settingsStr = settingsStr {
220
+ guard let settingsData = settingsStr.data(using: .utf8) else {
221
+ let err = NSError(domain: "native-bridge", code: 0, userInfo: [NSLocalizedDescriptionKey: "Failed to convert string to data"])
222
+ throw err
223
+ }
224
+ let settingsRN = try JSONDecoder().decode(PrimerSettingsRN.self, from: settingsData)
225
+ settings = settingsRN.asPrimerSettings()
226
+ }
227
+
228
+ var theme: PrimerTheme?
229
+ if let themeStr = themeStr {
230
+ guard let themeData = themeStr.data(using: .utf8) else {
231
+ let err = NSError(domain: "native-bridge", code: 0, userInfo: [NSLocalizedDescriptionKey: "Failed to convert string to data"])
232
+ throw err
233
+ }
234
+ let themeRN = try JSONDecoder().decode(PrimerThemeRN.self, from: themeData)
235
+ theme = themeRN.asPrimerTheme()
236
+ }
237
+
238
+ PrimerSDK.Primer.shared.configure(settings: settings, theme: theme)
239
+ }
240
+
241
+ private func detectImplemetedCallbacks() {
242
+ sendEvent(withName: PrimerEvents.detectImplementedRNCallbacks.stringValue, body: nil)
243
+ }
244
+
245
+ private func callCallbackWithClientToken(_ clientToken: String) {
246
+ self.clientTokenCallback?(clientToken, nil)
247
+ self.onClientSessionActions?(clientToken, nil)
248
+ self.onTokenizeSuccess?(clientToken, nil)
249
+ self.onResumeSuccess?(clientToken, nil)
250
+ self.removeCallbacksAndHandlers()
251
+ }
252
+
253
+ private func callCallbackWithError(_ err: Error) {
254
+ self.clientTokenCallback?(nil, err)
255
+ self.onClientSessionActions?(nil, err)
256
+ self.onTokenizeSuccess?(nil, err)
257
+ self.onResumeSuccess?(nil, err)
258
+ self.removeCallbacksAndHandlers()
259
+ }
260
+
261
+ private func callCallbackToContinueFlow() {
262
+ self.clientTokenCallback?(nil, nil)
263
+ self.onClientSessionActions?(nil, nil)
264
+ self.onTokenizeSuccess?(nil, nil)
265
+ self.onResumeSuccess?(nil, nil)
266
+ self.removeCallbacksAndHandlers()
267
+ }
268
+
269
+ private func removeCallbacksAndHandlers() {
270
+ self.clientTokenCallback = nil
271
+ self.onClientSessionActions = nil
272
+ self.onTokenizeSuccess = nil
273
+ self.onResumeSuccess = nil
274
+ }
275
+
276
+ }
277
+
278
+ extension RNTPrimer: PrimerDelegate {
279
+
280
+ func clientTokenCallback(_ completion: @escaping (String?, Error?) -> Void) {
281
+ DispatchQueue.main.async {
282
+ if self.implementedReactNativeCallbacks?.isClientTokenCallbackImplemented == true {
283
+ self.clientTokenCallback = { (clientToken, err) in
284
+ completion(clientToken, err)
285
+ self.removeCallbacksAndHandlers()
286
+ }
287
+ self.sendEvent(withName: PrimerEvents.onClientTokenCallback.stringValue, body: nil)
288
+ } else {
289
+ let err = NSError(domain: "native-bridge", code: 1, userInfo: [NSLocalizedDescriptionKey: "Callback [clientTokenCallback] should had been implemented."])
290
+ completion(nil, err)
291
+ }
292
+ }
293
+ }
294
+
295
+ func onClientSessionActions(_ actions: [ClientSession.Action], resumeHandler: ResumeHandlerProtocol?) {
296
+ DispatchQueue.main.async {
297
+ if self.implementedReactNativeCallbacks?.isClientSessionActionsImplemented == true {
298
+ self.onClientSessionActions = { (newClientToken, err) in
299
+ if let err = err {
300
+ resumeHandler?.handle(error: err)
301
+ } else if let newClientToken = newClientToken {
302
+ resumeHandler?.handle(newClientToken: newClientToken)
303
+ } else {
304
+ resumeHandler?.handleSuccess()
305
+ }
306
+ }
307
+
308
+ do {
309
+ let actionsData = try JSONEncoder().encode(actions)
310
+ let actionsJson = try JSONSerialization.jsonObject(with: actionsData, options: .allowFragments)
311
+ self.sendEvent(withName: PrimerEvents.onClientSessionActions.stringValue, body: actionsJson)
312
+ } catch {
313
+ self.checkoutFailed(with: error)
314
+ }
315
+ } else {
316
+ let err = NSError(domain: "native-bridge", code: 1, userInfo: [NSLocalizedDescriptionKey: "Callback [onClientSessionActions] should had been implemented."])
317
+ resumeHandler?.handle(error: err)
318
+ }
319
+
320
+ }
321
+ }
322
+
323
+ func onTokenizeSuccess(_ paymentMethodToken: PaymentMethodToken, resumeHandler: ResumeHandlerProtocol) {
324
+ DispatchQueue.main.async {
325
+ self.onTokenizeSuccess = { (newClientToken, err) in
326
+ if let err = err {
327
+ resumeHandler.handle(error: err)
328
+ } else if let newClientToken = newClientToken {
329
+ resumeHandler.handle(newClientToken: newClientToken)
330
+ } else {
331
+ resumeHandler.handleSuccess()
332
+ }
333
+ }
334
+
335
+ do {
336
+ let paymentMethodTokenData = try JSONEncoder().encode(paymentMethodToken)
337
+ let paymentMethodTokenJson = try JSONSerialization.jsonObject(with: paymentMethodTokenData, options: .allowFragments)
338
+ self.sendEvent(withName: PrimerEvents.onTokenizeSuccessCallback.stringValue, body: paymentMethodTokenJson)
339
+ } catch {
340
+ self.checkoutFailed(with: error)
341
+ }
342
+ }
343
+ }
344
+
345
+ func onResumeSuccess(_ clientToken: String, resumeHandler: ResumeHandlerProtocol) {
346
+ DispatchQueue.main.async {
347
+ if self.implementedReactNativeCallbacks?.isOnResumeSuccessImplemented == true {
348
+ self.onResumeSuccess = { (newClientToken, err) in
349
+ if let err = err {
350
+ resumeHandler.handle(error: err)
351
+ } else if let newClientToken = newClientToken {
352
+ resumeHandler.handle(newClientToken: newClientToken)
353
+ } else {
354
+ resumeHandler.handleSuccess()
355
+ }
356
+ }
357
+
358
+ self.sendEvent(withName: PrimerEvents.onResumeSuccess.stringValue, body: ["resumeToken": clientToken])
359
+ } else {
360
+ let err = NSError(domain: "native-bridge", code: 1, userInfo: [NSLocalizedDescriptionKey: "Callback [onResumeSuccess] should had been implemented."])
361
+ resumeHandler.handle(error: err)
362
+ }
363
+ }
364
+ }
365
+
366
+ func onResumeError(_ error: Error) {
367
+ DispatchQueue.main.async {
368
+ if self.implementedReactNativeCallbacks?.isOnResumeErrorImplemented == true {
369
+ self.checkoutFailed(with: error)
370
+ } else {
371
+ let err = NSError(domain: "native-bridge", code: 1, userInfo: [NSLocalizedDescriptionKey: "Callback [onResumeError] should had been implemented."])
372
+ self.checkoutFailed(with: err)
373
+ }
374
+ }
375
+ }
376
+
377
+ func onCheckoutDismissed() {
378
+ DispatchQueue.main.async {
379
+ if self.implementedReactNativeCallbacks?.isOnCheckoutDismissedImplemented == true {
380
+ self.sendEvent(withName: PrimerEvents.onCheckoutDismissed.stringValue, body: nil)
381
+ } else {
382
+ let err = NSError(domain: "native-bridge", code: 1, userInfo: [NSLocalizedDescriptionKey: "Callback [onCheckoutDismissed] should had been implemented."])
383
+ self.checkoutFailed(with: err)
384
+ }
385
+ }
386
+ }
387
+
388
+ func checkoutFailed(with error: Error) {
389
+ DispatchQueue.main.async {
390
+ self.sendEvent(withName: PrimerEvents.onError.stringValue, body: ["error": error.rnError])
391
+ }
392
+ }
393
+
394
+ }
@@ -0,0 +1,3 @@
1
+ #import <React/RCTBridgeModule.h>
2
+ #import <React/RCTEventEmitter.h>
3
+ #import <React/RCTViewManager.h>
@@ -14,6 +14,7 @@
14
14
  1DEBE0FE26C2D875004E3064 /* PrimerSettingsRN.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DEBE0FD26C2D875004E3064 /* PrimerSettingsRN.swift */; };
15
15
  1DEBE10026C2D88E004E3064 /* PrimerThemeRN.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DEBE0FF26C2D88E004E3064 /* PrimerThemeRN.swift */; };
16
16
  1DEBE10226C2D8BA004E3064 /* PaymentInstrumentTokenRN.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DEBE10126C2D8BA004E3064 /* PaymentInstrumentTokenRN.swift */; };
17
+ F333DD089EAC90F6D7CDFD73 /* libPods-ReactNative.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E60BA74DD11A700B841988C1 /* libPods-ReactNative.a */; };
17
18
  F4FF95D7245B92E800C19C63 /* UniversalCheckoutRN.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4FF95D6245B92E800C19C63 /* UniversalCheckoutRN.swift */; };
18
19
  /* End PBXBuildFile section */
19
20
 
@@ -37,7 +38,10 @@
37
38
  1DEBE0FD26C2D875004E3064 /* PrimerSettingsRN.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrimerSettingsRN.swift; sourceTree = "<group>"; };
38
39
  1DEBE0FF26C2D88E004E3064 /* PrimerThemeRN.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrimerThemeRN.swift; sourceTree = "<group>"; };
39
40
  1DEBE10126C2D8BA004E3064 /* PaymentInstrumentTokenRN.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentInstrumentTokenRN.swift; sourceTree = "<group>"; };
41
+ 613626B5C92B8E0FCC18FCB6 /* Pods-ReactNative.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNative.release.xcconfig"; path = "Target Support Files/Pods-ReactNative/Pods-ReactNative.release.xcconfig"; sourceTree = "<group>"; };
40
42
  B3E7B5891CC2AC0600A0062D /* ReactNative.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReactNative.m; sourceTree = "<group>"; };
43
+ D79ACB2404DD9BE6F04FFF53 /* Pods-ReactNative.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNative.debug.xcconfig"; path = "Target Support Files/Pods-ReactNative/Pods-ReactNative.debug.xcconfig"; sourceTree = "<group>"; };
44
+ E60BA74DD11A700B841988C1 /* libPods-ReactNative.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ReactNative.a"; sourceTree = BUILT_PRODUCTS_DIR; };
41
45
  F4FF95D5245B92E700C19C63 /* ReactNative-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ReactNative-Bridging-Header.h"; sourceTree = "<group>"; };
42
46
  F4FF95D6245B92E800C19C63 /* UniversalCheckoutRN.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UniversalCheckoutRN.swift; sourceTree = "<group>"; };
43
47
  /* End PBXFileReference section */
@@ -47,6 +51,7 @@
47
51
  isa = PBXFrameworksBuildPhase;
48
52
  buildActionMask = 2147483647;
49
53
  files = (
54
+ F333DD089EAC90F6D7CDFD73 /* libPods-ReactNative.a in Frameworks */,
50
55
  );
51
56
  runOnlyForDeploymentPostprocessing = 0;
52
57
  };
@@ -76,6 +81,8 @@
76
81
  38076040A533828516C55677 /* Pods */ = {
77
82
  isa = PBXGroup;
78
83
  children = (
84
+ D79ACB2404DD9BE6F04FFF53 /* Pods-ReactNative.debug.xcconfig */,
85
+ 613626B5C92B8E0FCC18FCB6 /* Pods-ReactNative.release.xcconfig */,
79
86
  );
80
87
  path = Pods;
81
88
  sourceTree = "<group>";
@@ -90,9 +97,18 @@
90
97
  F4FF95D5245B92E700C19C63 /* ReactNative-Bridging-Header.h */,
91
98
  134814211AA4EA7D00B7C361 /* Products */,
92
99
  38076040A533828516C55677 /* Pods */,
100
+ B6C93F56686644F9180411E9 /* Frameworks */,
93
101
  );
94
102
  sourceTree = "<group>";
95
103
  };
104
+ B6C93F56686644F9180411E9 /* Frameworks */ = {
105
+ isa = PBXGroup;
106
+ children = (
107
+ E60BA74DD11A700B841988C1 /* libPods-ReactNative.a */,
108
+ );
109
+ name = Frameworks;
110
+ sourceTree = "<group>";
111
+ };
96
112
  /* End PBXGroup section */
97
113
 
98
114
  /* Begin PBXNativeTarget section */
@@ -100,6 +116,7 @@
100
116
  isa = PBXNativeTarget;
101
117
  buildConfigurationList = 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "ReactNative" */;
102
118
  buildPhases = (
119
+ 2AD0F2C5A48C4A9CA72E6F35 /* [CP] Check Pods Manifest.lock */,
103
120
  58B511D71A9E6C8500147676 /* Sources */,
104
121
  58B511D81A9E6C8500147676 /* Frameworks */,
105
122
  58B511D91A9E6C8500147676 /* CopyFiles */,
@@ -145,6 +162,31 @@
145
162
  };
146
163
  /* End PBXProject section */
147
164
 
165
+ /* Begin PBXShellScriptBuildPhase section */
166
+ 2AD0F2C5A48C4A9CA72E6F35 /* [CP] Check Pods Manifest.lock */ = {
167
+ isa = PBXShellScriptBuildPhase;
168
+ buildActionMask = 2147483647;
169
+ files = (
170
+ );
171
+ inputFileListPaths = (
172
+ );
173
+ inputPaths = (
174
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
175
+ "${PODS_ROOT}/Manifest.lock",
176
+ );
177
+ name = "[CP] Check Pods Manifest.lock";
178
+ outputFileListPaths = (
179
+ );
180
+ outputPaths = (
181
+ "$(DERIVED_FILE_DIR)/Pods-ReactNative-checkManifestLockResult.txt",
182
+ );
183
+ runOnlyForDeploymentPostprocessing = 0;
184
+ shellPath = /bin/sh;
185
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
186
+ showEnvVarsInLog = 0;
187
+ };
188
+ /* End PBXShellScriptBuildPhase section */
189
+
148
190
  /* Begin PBXSourcesBuildPhase section */
149
191
  58B511D71A9E6C8500147676 /* Sources */ = {
150
192
  isa = PBXSourcesBuildPhase;
@@ -268,6 +310,7 @@
268
310
  };
269
311
  58B511F01A9E6C8500147676 /* Debug */ = {
270
312
  isa = XCBuildConfiguration;
313
+ baseConfigurationReference = D79ACB2404DD9BE6F04FFF53 /* Pods-ReactNative.debug.xcconfig */;
271
314
  buildSettings = {
272
315
  HEADER_SEARCH_PATHS = (
273
316
  "$(inherited)",
@@ -287,6 +330,7 @@
287
330
  };
288
331
  58B511F11A9E6C8500147676 /* Release */ = {
289
332
  isa = XCBuildConfiguration;
333
+ baseConfigurationReference = 613626B5C92B8E0FCC18FCB6 /* Pods-ReactNative.release.xcconfig */;
290
334
  buildSettings = {
291
335
  HEADER_SEARCH_PATHS = (
292
336
  "$(inherited)",