@primer-io/react-native 0.15.4 → 0.16.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 (91) hide show
  1. package/android/build.gradle +1 -4
  2. package/android/src/main/java/com/primerioreactnative/PrimerCardNumberEditTextManager.kt +83 -0
  3. package/android/src/main/java/com/primerioreactnative/PrimerHeadlessUniversalCheckout.kt +198 -0
  4. package/android/src/main/java/com/primerioreactnative/PrimerRN.kt +13 -8
  5. package/android/src/main/java/com/primerioreactnative/PrimerRNEventListener.kt +2 -1
  6. package/android/src/main/java/com/primerioreactnative/ReactNativePackage.kt +14 -3
  7. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerErrorRN.kt +2 -0
  8. package/android/src/main/java/com/primerioreactnative/huc/assets/AssetsManager.kt +56 -0
  9. package/android/src/main/java/com/primerioreactnative/huc/events/PrimerHeadlessUniversalCheckoutEvent.kt +11 -0
  10. package/android/src/main/java/com/primerioreactnative/huc/extensions/Map.kt +10 -0
  11. package/android/src/main/java/com/primerioreactnative/utils/ErrorHelper.kt +1 -1
  12. package/android/src/main/java/com/primerioreactnative/utils/Keys.kt +7 -0
  13. package/ios/{ReactNative-Bridging-Header.h → Core/ReactNative-Bridging-Header.h} +1 -0
  14. package/ios/DataModels/PrimerSettingsRN.swift +2 -6
  15. package/ios/Headless Universal Checkout/RNTPrimerCardNumberInputElementManager.m +23 -0
  16. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.m +30 -0
  17. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.swift +241 -0
  18. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.m +14 -0
  19. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.swift +113 -0
  20. package/ios/{Pods/Manifest.lock → Podfile.lock} +1 -1
  21. package/ios/RNTPrimer.swift +14 -0
  22. package/lib/commonjs/Primer.js +84 -124
  23. package/lib/commonjs/Primer.js.map +1 -1
  24. package/lib/commonjs/PrimerInput.js +80 -0
  25. package/lib/commonjs/PrimerInput.js.map +1 -0
  26. package/lib/commonjs/RNPrimer.js +1 -0
  27. package/lib/commonjs/RNPrimer.js.map +1 -1
  28. package/lib/commonjs/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js +14 -0
  29. package/lib/commonjs/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js.map +1 -0
  30. package/lib/commonjs/headless_checkout/NativePrimerHeadlessUniversalCheckout.js +110 -0
  31. package/lib/commonjs/headless_checkout/NativePrimerHeadlessUniversalCheckout.js.map +1 -0
  32. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js +117 -0
  33. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +1 -0
  34. package/lib/commonjs/headless_checkout/types.js +2 -0
  35. package/lib/commonjs/headless_checkout/types.js.map +1 -0
  36. package/lib/commonjs/index.js +28 -1
  37. package/lib/commonjs/index.js.map +1 -1
  38. package/lib/commonjs/models/primer-callbacks.js +4 -0
  39. package/lib/commonjs/models/primer-config.js +4 -0
  40. package/lib/commonjs/models/primer-settings.js +4 -0
  41. package/lib/commonjs/models/primer.js +4 -0
  42. package/lib/commonjs/utils/index.js +1 -1
  43. package/lib/module/Primer.js +79 -118
  44. package/lib/module/Primer.js.map +1 -1
  45. package/lib/module/PrimerInput.js +46 -0
  46. package/lib/module/PrimerInput.js.map +1 -0
  47. package/lib/module/RNPrimer.js +1 -0
  48. package/lib/module/RNPrimer.js.map +1 -1
  49. package/lib/module/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js +5 -0
  50. package/lib/module/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js.map +1 -0
  51. package/lib/module/headless_checkout/NativePrimerHeadlessUniversalCheckout.js +98 -0
  52. package/lib/module/headless_checkout/NativePrimerHeadlessUniversalCheckout.js.map +1 -0
  53. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js +100 -0
  54. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +1 -0
  55. package/lib/module/headless_checkout/types.js +2 -0
  56. package/lib/module/headless_checkout/types.js.map +1 -0
  57. package/lib/module/index.js +4 -3
  58. package/lib/module/index.js.map +1 -1
  59. package/lib/module/models/primer-callbacks.js +1 -1
  60. package/lib/module/models/primer-config.js +1 -1
  61. package/lib/module/models/primer-settings.js +1 -1
  62. package/lib/module/models/primer.js +1 -1
  63. package/lib/typescript/PrimerInput.d.ts +15 -0
  64. package/lib/typescript/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.d.ts +1 -0
  65. package/lib/typescript/headless_checkout/NativePrimerHeadlessUniversalCheckout.d.ts +13 -0
  66. package/lib/typescript/headless_checkout/PrimerHeadlessUniversalCheckout.d.ts +13 -0
  67. package/lib/typescript/headless_checkout/types.d.ts +16 -0
  68. package/lib/typescript/index.d.ts +3 -1
  69. package/lib/typescript/models/primer-config.d.ts +4 -0
  70. package/lib/typescript/models/primer-settings.d.ts +4 -2
  71. package/package.json +1 -1
  72. package/primer-io-react-native.podspec +1 -1
  73. package/src/Primer.ts +86 -124
  74. package/src/PrimerInput.tsx +73 -0
  75. package/src/RNPrimer.ts +1 -0
  76. package/src/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.tsx +2 -0
  77. package/src/headless_checkout/NativePrimerHeadlessUniversalCheckout.ts +132 -0
  78. package/src/headless_checkout/PrimerHeadlessUniversalCheckout.ts +140 -0
  79. package/src/headless_checkout/types.ts +18 -0
  80. package/src/index.tsx +3 -2
  81. package/src/models/primer-config.ts +5 -0
  82. package/src/models/primer-settings.ts +5 -2
  83. package/ios/Pods/Pods.xcodeproj/project.pbxproj +0 -344
  84. package/ios/Pods/Pods.xcodeproj/xcuserdata/aladintaleb.xcuserdatad/xcschemes/Pods-ReactNative.xcscheme +0 -60
  85. package/ios/Pods/Pods.xcodeproj/xcuserdata/aladintaleb.xcuserdatad/xcschemes/xcschememanagement.plist +0 -16
  86. package/ios/Pods/Target Support Files/Pods-ReactNative/Pods-ReactNative-acknowledgements.markdown +0 -3
  87. package/ios/Pods/Target Support Files/Pods-ReactNative/Pods-ReactNative-acknowledgements.plist +0 -29
  88. package/ios/Pods/Target Support Files/Pods-ReactNative/Pods-ReactNative-dummy.m +0 -5
  89. package/ios/Pods/Target Support Files/Pods-ReactNative/Pods-ReactNative.debug.xcconfig +0 -8
  90. package/ios/Pods/Target Support Files/Pods-ReactNative/Pods-ReactNative.release.xcconfig +0 -8
  91. package/ios/ReactNative.xcworkspace/xcuserdata/aladintaleb.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
@@ -0,0 +1,241 @@
1
+ //
2
+ // RNTPrimerHeadlessUniversalCheckout.swift
3
+ // primer-io-react-native
4
+ //
5
+ // Created by Evangelos on 8/3/22.
6
+ //
7
+
8
+ import Foundation
9
+ import PrimerSDK
10
+
11
+ @objc
12
+ enum PrimerHeadlessUniversalCheckoutEvents: Int, CaseIterable {
13
+ case clientSessionDidSetUpSuccessfully = 0
14
+ case preparationStarted
15
+ case paymentMethodPresented
16
+ case tokenizationStarted
17
+ case tokenizationSucceeded
18
+ case resume
19
+ case error
20
+
21
+ var stringValue: String {
22
+ switch self {
23
+ case .clientSessionDidSetUpSuccessfully:
24
+ return "clientSessionDidSetUpSuccessfully"
25
+ case .preparationStarted:
26
+ return "preparationStarted"
27
+ case .paymentMethodPresented:
28
+ return "paymentMethodPresented"
29
+ case .tokenizationStarted:
30
+ return "tokenizationStarted"
31
+ case .tokenizationSucceeded:
32
+ return "tokenizationSucceeded"
33
+ case .resume:
34
+ return "resume"
35
+ case .error:
36
+ return "error"
37
+ }
38
+ }
39
+ }
40
+
41
+ @objc(PrimerHeadlessUniversalCheckout)
42
+ class RNTPrimerHeadlessUniversalCheckout: RCTEventEmitter {
43
+
44
+ private var resumeTokenCompletion: ((_ resumeToken: String) -> Void)?
45
+
46
+ override class func requiresMainQueueSetup() -> Bool {
47
+ return true
48
+ }
49
+
50
+ override init() {
51
+ super.init()
52
+ PrimerHeadlessUniversalCheckout.current.delegate = self
53
+ }
54
+
55
+ override func supportedEvents() -> [String]! {
56
+ return PrimerHeadlessUniversalCheckoutEvents.allCases.compactMap({ $0.stringValue })
57
+ }
58
+
59
+ // MARK: - API
60
+
61
+ @objc
62
+ public func startWithClientToken(_ clientToken: String,
63
+ settingsStr: String?,
64
+ errorCallback: @escaping RCTResponseSenderBlock,
65
+ successCallback: @escaping RCTResponseSenderBlock)
66
+ {
67
+ var settings: PrimerSettings?
68
+ if let settingsStr = settingsStr {
69
+ do {
70
+ let settingsData = settingsStr.data(using: .utf8)!
71
+ let settingsRN = try JSONDecoder().decode(PrimerSettingsRN.self, from: settingsData)
72
+ settings = settingsRN.asPrimerSettings()
73
+ } catch {
74
+ errorCallback([error.rnError])
75
+ return
76
+ }
77
+ }
78
+
79
+ PrimerHeadlessUniversalCheckout.current.start(withClientToken: clientToken, settings: settings, delegate: self) { paymentMethodTypes, err in
80
+ if let err = err {
81
+ errorCallback([err.rnError])
82
+ } else if let paymentMethodTypes = paymentMethodTypes {
83
+ successCallback([paymentMethodTypes.compactMap({$0.rawValue})])
84
+ }
85
+ }
86
+ }
87
+
88
+ @objc
89
+ public func resumeWithClientToken(_ resumeToken: String) {
90
+ self.resumeTokenCompletion?(resumeToken)
91
+ }
92
+
93
+ @objc
94
+ public func getAssetForPaymentMethodType(_ paymentMethodTypeStr: String,
95
+ assetType assetTypeStr: String,
96
+ errorCallback: @escaping RCTResponseSenderBlock,
97
+ successCallback: @escaping RCTResponseSenderBlock)
98
+ {
99
+ do {
100
+ try validate(assetStr: paymentMethodTypeStr, assetTypeStr: assetTypeStr)
101
+ let paymentMethodType = PaymentMethodConfigType(rawValue: paymentMethodTypeStr)
102
+
103
+ guard let image = PrimerHeadlessUniversalCheckout.getAsset(for: paymentMethodType, assetType: PrimerAsset.ImageType(rawValue: assetTypeStr)!) else {
104
+ let err = NativeError(errorId: "missing-asset", errorDescription: "Failed to find \(assetTypeStr) for \(paymentMethodTypeStr)", recoverySuggestion: nil)
105
+ errorCallback([err.rnError])
106
+ return
107
+ }
108
+
109
+
110
+ let imageURL = try self.tempStoreImage(image: image, name: paymentMethodTypeStr)
111
+ successCallback([imageURL.absoluteString])
112
+ } catch {
113
+ errorCallback([error.rnError])
114
+ }
115
+ }
116
+
117
+ @objc
118
+ public func getAssetForCardNetwork(_ cardNetworkStr: String,
119
+ assetType assetTypeStr: String,
120
+ errorCallback: @escaping RCTResponseSenderBlock,
121
+ successCallback: @escaping RCTResponseSenderBlock)
122
+ {
123
+ do {
124
+ try validate(assetStr: cardNetworkStr, assetTypeStr: assetTypeStr)
125
+ guard let cardNetwork = CardNetwork(rawValue: cardNetworkStr) else {
126
+ let err = NativeError(errorId: "invalid-card-network", errorDescription: "Card network for \(cardNetworkStr) does not exist, make sure you don't have any typos.", recoverySuggestion: nil)
127
+ errorCallback([err.rnError])
128
+ return
129
+ }
130
+
131
+ guard let image = PrimerHeadlessUniversalCheckout.getAsset(for: cardNetwork, assetType: PrimerAsset.ImageType(rawValue: assetTypeStr)!) else {
132
+ let err = NativeError(errorId: "missing-asset", errorDescription: "Failed to find \(assetTypeStr) for \(cardNetworkStr)", recoverySuggestion: nil)
133
+ errorCallback([err.rnError])
134
+ return
135
+ }
136
+
137
+
138
+ let imageURL = try self.tempStoreImage(image: image, name: cardNetworkStr)
139
+ successCallback([imageURL.absoluteString])
140
+ } catch {
141
+ errorCallback([error.rnError])
142
+ }
143
+ }
144
+
145
+ @objc
146
+ public func showPaymentMethod(_ paymentMethodTypeStr: String) {
147
+ let paymentMethodType = PrimerPaymentMethodType(rawValue: paymentMethodTypeStr)
148
+ PrimerHeadlessUniversalCheckout.current.showPaymentMethod(paymentMethodType)
149
+ }
150
+
151
+ // MARK: - HELPERS
152
+
153
+ private func validate(assetStr: String, assetTypeStr: String) throws {
154
+ var errors: [NativeError] = []
155
+
156
+ if PaymentMethodConfigType(rawValue: assetStr) != .other(rawValue: assetStr) {
157
+ // ...
158
+ } else if CardNetwork(rawValue: assetStr) != nil {
159
+ // ...
160
+ } else {
161
+ let err = NativeError(errorId: "invalid-payment-method-type", errorDescription: "Asset for \(assetStr) does not exist, make sure you don't have any typos.", recoverySuggestion: nil)
162
+ errors.append(err)
163
+ }
164
+
165
+
166
+ if PrimerAsset.ImageType(rawValue: assetTypeStr) == nil {
167
+ let err = NativeError(errorId: "mismatch", errorDescription: "You have provided assetType=\(assetTypeStr), which is not valid", recoverySuggestion: "Use one of the following values: \(PrimerAsset.ImageType.allCases.compactMap({ $0.rawValue }))")
168
+ errors.append(err)
169
+ }
170
+
171
+ if errors.isEmpty {
172
+ return
173
+ } else if errors.count == 1 {
174
+ throw errors.first!
175
+ } else {
176
+ let errorDescription: String = errors.compactMap({ $0.errorDescription }).joined(separator: "/n")
177
+ let recoverySuggestion = errors.compactMap({ $0.recoverySuggestion }).joined(separator: "/n")
178
+ let err = NativeError(errorId: "underlying-errors", errorDescription: errorDescription, recoverySuggestion: recoverySuggestion)
179
+ throw err
180
+ }
181
+ }
182
+
183
+ private func tempStoreImage(image: UIImage, name: String) throws -> URL {
184
+ guard let imageURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("\(name).png") else {
185
+ let err = NativeError(errorId: "error", errorDescription: "Failed to create URL for asset", recoverySuggestion: nil)
186
+ throw err
187
+ }
188
+
189
+ guard let pngData = image.pngData() else {
190
+ let err = NativeError(errorId: "error", errorDescription: "Failed to get image's PNG data", recoverySuggestion: nil)
191
+ throw err
192
+ }
193
+
194
+ try pngData.write(to: imageURL)
195
+ return imageURL
196
+ }
197
+ }
198
+
199
+ // MARK: - EVENTS
200
+
201
+ extension RNTPrimerHeadlessUniversalCheckout: PrimerHeadlessUniversalCheckoutDelegate {
202
+ func primerHeadlessUniversalCheckoutClientSessionDidSetUpSuccessfully() {
203
+ sendEvent(withName: PrimerHeadlessUniversalCheckoutEvents.clientSessionDidSetUpSuccessfully.stringValue, body: nil)
204
+ }
205
+
206
+ func primerHeadlessUniversalCheckoutPreparationStarted() {
207
+ sendEvent(withName: PrimerHeadlessUniversalCheckoutEvents.preparationStarted.stringValue, body: nil)
208
+ }
209
+
210
+ func primerHeadlessUniversalCheckoutTokenizationStarted() {
211
+ sendEvent(withName: PrimerHeadlessUniversalCheckoutEvents.tokenizationStarted.stringValue, body: nil)
212
+ }
213
+
214
+ func primerHeadlessUniversalCheckoutPaymentMethodPresented() {
215
+ sendEvent(withName: PrimerHeadlessUniversalCheckoutEvents.paymentMethodPresented.stringValue, body: nil)
216
+ }
217
+
218
+ func primerHeadlessUniversalCheckoutTokenizationSucceeded(paymentMethodToken: PaymentMethodToken, resumeHandler: ResumeHandlerProtocol?) {
219
+ do {
220
+ let paymentMethodTokenData = try JSONEncoder().encode(paymentMethodToken)
221
+ let paymentMethodTokenStr = String(data: paymentMethodTokenData, encoding: .utf8)!
222
+
223
+ self.resumeTokenCompletion = { (resumeToken) in
224
+ resumeHandler?.handle(newClientToken: resumeToken)
225
+ }
226
+
227
+ sendEvent(withName: PrimerHeadlessUniversalCheckoutEvents.tokenizationSucceeded.stringValue, body: ["paymentMethodToken": paymentMethodTokenStr])
228
+
229
+ } catch {
230
+ self.primerHeadlessUniversalCheckoutUniversalCheckoutDidFail(withError: error)
231
+ }
232
+ }
233
+
234
+ func primerHeadlessUniversalCheckoutResume(withResumeToken resumeToken: String, resumeHandler: ResumeHandlerProtocol?) {
235
+ sendEvent(withName: PrimerHeadlessUniversalCheckoutEvents.resume.stringValue, body: ["resumeToken": resumeToken])
236
+ }
237
+
238
+ func primerHeadlessUniversalCheckoutUniversalCheckoutDidFail(withError err: Error) {
239
+ sendEvent(withName: PrimerHeadlessUniversalCheckoutEvents.error.stringValue, body: ["error": err.rnError])
240
+ }
241
+ }
@@ -0,0 +1,14 @@
1
+ #import <React/RCTBridgeModule.h>
2
+ #import <React/RCTViewManager.h>
3
+ #import <React/RCTUIManager.h>
4
+ #import <React/RCTView.h>
5
+
6
+ @interface RCT_EXTERN_MODULE(PrimerHeadlessUniversalCheckoutCardFormUIManager, NSObject)
7
+
8
+ RCT_EXTERN_METHOD(setInputElements:(NSString *)inputElements errorCallback: (RCTResponseSenderBlock)errorCallback successCallback: (RCTResponseSenderBlock)successCallback)
9
+
10
+ RCT_EXTERN_METHOD(tokenize)
11
+
12
+ RCT_EXTERN_METHOD(addInput:(NSNumber* __nonnull)tag)
13
+
14
+ @end
@@ -0,0 +1,113 @@
1
+ //
2
+ // RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.swift
3
+ // primer-io-react-native
4
+ //
5
+ // Created by Evangelos on 4/3/22.
6
+ //
7
+
8
+ import Foundation
9
+ import PrimerSDK
10
+
11
+ @objc(PrimerHeadlessUniversalCheckoutCardFormUIManager)
12
+ class RNTPrimerHeadlessUniversalCheckoutCardFormUIManager: RCTViewManager {
13
+
14
+ @objc
15
+ override static func requiresMainQueueSetup() -> Bool {
16
+ return true
17
+ }
18
+
19
+ private lazy var cardFormUIManager: PrimerHeadlessUniversalCheckout.CardFormUIManager = {
20
+ return try! PrimerHeadlessUniversalCheckout.CardFormUIManager()
21
+ }()
22
+ private var successCallback: RCTResponseSenderBlock?
23
+
24
+ deinit {
25
+ print("🧨 deinit: \(self) \(Unmanaged.passUnretained(self).toOpaque())")
26
+ }
27
+
28
+ override init() {
29
+ super.init()
30
+ do {
31
+ self.cardFormUIManager = try PrimerHeadlessUniversalCheckout.CardFormUIManager()
32
+ self.cardFormUIManager.cardFormUIManagerDelegate = self
33
+ } catch {
34
+
35
+ }
36
+
37
+ print("⭐ init: \(self) \(Unmanaged.passUnretained(self).toOpaque())")
38
+ }
39
+
40
+ @objc
41
+ override func constantsToExport() -> [AnyHashable : Any]! {
42
+ return ["message": "Hello from native code"]
43
+ }
44
+
45
+ func cardFormUIManager(_ cardFormUIManager: PrimerHeadlessUniversalCheckout.CardFormUIManager, isCardFormValid: Bool) {
46
+
47
+ }
48
+
49
+ @objc
50
+ func setInputElements(_ inputElements: String, errorCallback: RCTResponseSenderBlock, successCallback: @escaping RCTResponseSenderBlock) {
51
+ print("RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.setInputElements\n\(inputElements)")
52
+ print("⭐ \(self) \(Unmanaged.passUnretained(self).toOpaque())")
53
+ self.successCallback = successCallback
54
+ self.successCallback?(["what??"])
55
+ }
56
+
57
+ @objc
58
+ func setInputElementsWithTags(_ tags: [NSNumber]) {
59
+ RCTUnsafeExecuteOnMainQueueSync {
60
+ guard let rctUIManager = self.bridge.module(for: RCTUIManager.self) as? RCTUIManager else {
61
+ return
62
+ }
63
+
64
+ for tag in tags {
65
+ if let view = rctUIManager.view(forReactTag: tag) {
66
+ if let inputElement = view as? PrimerInputElement {
67
+ self.cardFormUIManager.inputElements = [inputElement]
68
+ }
69
+ }
70
+ }
71
+ }
72
+ }
73
+
74
+ @objc
75
+ func addInput(_ tag: NSNumber) {
76
+ RCTUnsafeExecuteOnMainQueueSync {
77
+ guard let rctUIManager = self.bridge.module(for: RCTUIManager.self) as? RCTUIManager else {
78
+ return
79
+ }
80
+
81
+ if let view = rctUIManager.view(forReactTag: tag) {
82
+ if let inputElement = view as? PrimerInputElement {
83
+ self.cardFormUIManager.inputElements = [inputElement]
84
+ }
85
+ }
86
+
87
+ }
88
+ }
89
+
90
+ @objc
91
+ func tokenize() {
92
+ print("RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.tokenize")
93
+ }
94
+
95
+ }
96
+
97
+ extension RNTPrimerHeadlessUniversalCheckoutCardFormUIManager: PrimerInputElementDelegate {
98
+
99
+ func inputElementDidFocus(_ sender: PrimerInputElement) {
100
+
101
+ }
102
+
103
+ func inputElementDidBlur(_ sender: PrimerInputElement) {
104
+
105
+ }
106
+
107
+ }
108
+
109
+ extension RNTPrimerHeadlessUniversalCheckoutCardFormUIManager: PrimerCardFormDelegate {
110
+
111
+
112
+
113
+ }
@@ -1,3 +1,3 @@
1
1
  PODFILE CHECKSUM: 0984f720d2439f86374726bfdebe32d895fdcf46
2
2
 
3
- COCOAPODS: 1.10.1
3
+ COCOAPODS: 1.11.2
@@ -320,6 +320,20 @@ extension RNTPrimer: PrimerDelegate {
320
320
  }
321
321
  }
322
322
 
323
+ func tokenAddedToVault(_ token: PaymentMethodToken) {
324
+ DispatchQueue.main.async {
325
+ if self.implementedReactNativeCallbacks?.isTokenAddedToVaultImplemented == true {
326
+ do {
327
+ let paymentMethodTokenData = try JSONEncoder().encode(token)
328
+ let paymentMethodTokenJson = try JSONSerialization.jsonObject(with: paymentMethodTokenData, options: .allowFragments)
329
+ self.sendEvent(withName: PrimerEvents.onVaultSuccess.stringValue, body: paymentMethodTokenJson)
330
+ } catch {
331
+ self.checkoutFailed(with: error)
332
+ }
333
+ }
334
+ }
335
+ }
336
+
323
337
  func onTokenizeSuccess(_ paymentMethodToken: PaymentMethodToken, resumeHandler: ResumeHandlerProtocol) {
324
338
  DispatchQueue.main.async {
325
339
  self.onTokenizeSuccess = { (newClientToken, err) in
@@ -78,151 +78,107 @@ const resumeHandler = {
78
78
  }
79
79
  }
80
80
  };
81
- const PrimerNativeMapping = {
82
- showUniversalCheckout(clientToken, config) {
83
- _RNPrimer.default.removeAllListeners();
84
81
 
85
- if (config.settings || config.theme) {
86
- _RNPrimer.default.configure(config.settings || null, config.theme || null);
87
-
88
- let implementedRNCallbacks = {
89
- // isClientTokenCallbackImplemented: (config.onClientTokenCallback !== undefined),
90
- isTokenAddedToVaultImplemented: config.onTokenAddedToVault !== undefined,
91
- isOnResumeSuccessImplemented: config.onResumeSuccess !== undefined,
92
- isOnResumeErrorImplemented: config.onError !== undefined,
93
- isOnCheckoutDismissedImplemented: config.onDismiss !== undefined,
94
- isCheckoutFailedImplemented: config.onError !== undefined,
95
- isClientSessionActionsImplemented: config.onClientSessionActions !== undefined
96
- };
82
+ function configureListeners(config) {
83
+ _RNPrimer.default.removeAllListeners();
97
84
 
98
- _RNPrimer.default.setImplementedRNCallbacks(implementedRNCallbacks).then(() => {
99
- _RNPrimer.default.addListener('onClientSessionActions', data => {
100
- const clientSessionActions = data;
101
-
102
- if (config.onClientSessionActions) {
103
- config.onClientSessionActions(clientSessionActions, resumeHandler);
104
- }
105
- });
106
-
107
- _RNPrimer.default.addListener('onTokenizeSuccessCallback', data => {
108
- const paymentInstrumentToken = data;
109
-
110
- if (config.onTokenizeSuccess) {
111
- config.onTokenizeSuccess(paymentInstrumentToken, resumeHandler);
112
- }
113
- });
114
-
115
- _RNPrimer.default.addListener('onResumeSuccess', data => {
116
- const resumeToken = data.resumeToken;
117
-
118
- if (config.onResumeSuccess) {
119
- config.onResumeSuccess(resumeToken, resumeHandler);
120
- }
121
- });
122
-
123
- _RNPrimer.default.addListener('onCheckoutDismissed', _ => {
124
- if (config.onDismiss) {
125
- config.onDismiss();
126
- }
127
- });
128
-
129
- _RNPrimer.default.addListener('onError', data => {
130
- const err = data.error;
131
-
132
- if (config.onError) {
133
- config.onError(err, resumeHandler);
134
- }
135
- });
136
-
137
- _RNPrimer.default.showUniversalCheckout(clientToken);
138
- }).catch(err => {
139
- console.error(err);
140
- });
141
- } // RNPrimer.addListener('onClientTokenCallback', _ => {
142
- // if (config.onClientTokenCallback) {
143
- // config.onClientTokenCallback(resumeHandler);
144
- // }
145
- // });
85
+ _RNPrimer.default.addListener('onVaultSuccess', data => {
86
+ const paymentInstrumentToken = data;
146
87
 
147
- },
88
+ if (config.onVaultSuccess) {
89
+ config.onVaultSuccess(paymentInstrumentToken);
90
+ }
91
+ });
148
92
 
149
- showVaultManager(clientToken, config) {
150
- _RNPrimer.default.removeAllListeners();
93
+ _RNPrimer.default.addListener('onClientSessionActions', data => {
94
+ const clientSessionActions = data;
151
95
 
152
- if (config.settings || config.theme) {
153
- _RNPrimer.default.configure(config.settings || null, config.theme || null);
154
-
155
- let implementedRNCallbacks = {
156
- // isClientTokenCallbackImplemented: (config.onClientTokenCallback !== undefined),
157
- isTokenAddedToVaultImplemented: config.onTokenAddedToVault !== undefined,
158
- isOnResumeSuccessImplemented: config.onResumeSuccess !== undefined,
159
- isOnResumeErrorImplemented: config.onError !== undefined,
160
- isOnCheckoutDismissedImplemented: config.onDismiss !== undefined,
161
- isCheckoutFailedImplemented: config.onError !== undefined,
162
- isClientSessionActionsImplemented: config.onClientSessionActions !== undefined
163
- };
96
+ if (config.onClientSessionActions) {
97
+ config.onClientSessionActions(clientSessionActions, resumeHandler);
98
+ }
99
+ });
164
100
 
165
- _RNPrimer.default.setImplementedRNCallbacks(implementedRNCallbacks);
166
- } // RNPrimer.addListener('onClientTokenCallback', _ => {
167
- // if (config.onClientTokenCallback) {
168
- // config.onClientTokenCallback(resumeHandler);
169
- // }
170
- // });
101
+ _RNPrimer.default.addListener('onTokenizeSuccessCallback', data => {
102
+ const paymentInstrumentToken = data;
171
103
 
104
+ if (config.onTokenizeSuccess) {
105
+ config.onTokenizeSuccess(paymentInstrumentToken, resumeHandler);
106
+ }
107
+ });
172
108
 
173
- _RNPrimer.default.addListener('onClientSessionActions', data => {
174
- const clientSessionActions = data;
109
+ _RNPrimer.default.addListener('onResumeSuccess', data => {
110
+ const resumeToken = data.resumeToken;
175
111
 
176
- if (config.onClientSessionActions) {
177
- config.onClientSessionActions(clientSessionActions, resumeHandler);
178
- } else {
179
- _RNPrimer.default.handleSuccess();
180
- }
181
- });
112
+ if (config.onResumeSuccess) {
113
+ config.onResumeSuccess(resumeToken, resumeHandler);
114
+ }
115
+ });
182
116
 
183
- _RNPrimer.default.addListener('onTokenizeSuccessCallback', data => {
184
- const paymentInstrumentToken = data;
117
+ _RNPrimer.default.addListener('onCheckoutDismissed', _ => {
118
+ if (config.onDismiss) {
119
+ config.onDismiss();
120
+ }
185
121
 
186
- if (config.onTokenizeSuccess) {
187
- config.onTokenizeSuccess(paymentInstrumentToken, resumeHandler);
188
- }
189
- });
122
+ _RNPrimer.default.removeAllListeners();
123
+ });
190
124
 
191
- _RNPrimer.default.addListener('onResumeSuccess', data => {
192
- const resumeToken = data.resumeToken;
125
+ _RNPrimer.default.addListener('onError', data => {
126
+ const err = data.error;
193
127
 
194
- if (config.onResumeSuccess) {
195
- config.onResumeSuccess(resumeToken, resumeHandler);
196
- }
197
- });
128
+ if (config.onError) {
129
+ config.onError(err, resumeHandler);
130
+ }
131
+ });
132
+ }
198
133
 
199
- _RNPrimer.default.addListener('onCheckoutDismissed', () => {
200
- if (config.onDismiss) {
201
- config.onDismiss();
202
- }
203
- });
134
+ const PrimerNativeMapping = {
135
+ showUniversalCheckout(clientToken, config) {
136
+ _RNPrimer.default.configure(config.settings || null, config.theme || null);
204
137
 
205
- _RNPrimer.default.addListener('onError', data => {
206
- const err = data.error;
138
+ let implementedRNCallbacks = {
139
+ isTokenAddedToVaultImplemented: config.onVaultSuccess !== undefined,
140
+ isOnResumeSuccessImplemented: config.onResumeSuccess !== undefined,
141
+ isOnResumeErrorImplemented: config.onError !== undefined,
142
+ isOnCheckoutDismissedImplemented: config.onDismiss !== undefined,
143
+ isCheckoutFailedImplemented: config.onError !== undefined,
144
+ isClientSessionActionsImplemented: config.onClientSessionActions !== undefined
145
+ };
207
146
 
208
- if (config.onError) {
209
- config.onError(err, resumeHandler);
210
- }
147
+ _RNPrimer.default.setImplementedRNCallbacks(implementedRNCallbacks).then(() => {
148
+ configureListeners(config);
149
+
150
+ _RNPrimer.default.showUniversalCheckout(clientToken);
151
+ }).catch(err => {
152
+ console.error(err);
211
153
  });
154
+ },
155
+
156
+ showVaultManager(clientToken, config) {
157
+ _RNPrimer.default.configure(config.settings || null, config.theme || null);
158
+
159
+ let implementedRNCallbacks = {
160
+ isTokenAddedToVaultImplemented: config.onVaultSuccess !== undefined,
161
+ isOnResumeSuccessImplemented: config.onResumeSuccess !== undefined,
162
+ isOnResumeErrorImplemented: config.onError !== undefined,
163
+ isOnCheckoutDismissedImplemented: config.onDismiss !== undefined,
164
+ isCheckoutFailedImplemented: config.onError !== undefined,
165
+ isClientSessionActionsImplemented: config.onClientSessionActions !== undefined
166
+ };
212
167
 
213
- _RNPrimer.default.showVaultManager(clientToken);
168
+ _RNPrimer.default.setImplementedRNCallbacks(implementedRNCallbacks).then(() => {
169
+ configureListeners(config);
170
+
171
+ _RNPrimer.default.showVaultManager(clientToken);
172
+ }).catch(err => {
173
+ console.error(err);
174
+ });
214
175
  },
215
176
 
216
177
  showPaymentMethod(clientToken, intent, config) {
217
- _RNPrimer.default.removeAllListeners();
218
-
219
- if (config.settings || config.theme) {
220
- _RNPrimer.default.configure(config.settings || null, config.theme || null);
221
- }
178
+ _RNPrimer.default.configure(config.settings || null, config.theme || null);
222
179
 
223
180
  let implementedRNCallbacks = {
224
- // isClientTokenCallbackImplemented: (config.onClientTokenCallback !== undefined),
225
- isTokenAddedToVaultImplemented: config.onTokenAddedToVault !== undefined,
181
+ isTokenAddedToVaultImplemented: config.onVaultSuccess !== undefined,
226
182
  isOnResumeSuccessImplemented: config.onResumeSuccess !== undefined,
227
183
  isOnResumeErrorImplemented: config.onError !== undefined,
228
184
  isOnCheckoutDismissedImplemented: config.onDismiss !== undefined,
@@ -230,9 +186,13 @@ const PrimerNativeMapping = {
230
186
  isClientSessionActionsImplemented: config.onClientSessionActions !== undefined
231
187
  };
232
188
 
233
- _RNPrimer.default.setImplementedRNCallbacks(implementedRNCallbacks);
189
+ _RNPrimer.default.setImplementedRNCallbacks(implementedRNCallbacks).then(() => {
190
+ configureListeners(config);
234
191
 
235
- _RNPrimer.default.showPaymentMethod(clientToken, intent.paymentMethod, intent.vault === true ? "vault" : "checkout");
192
+ _RNPrimer.default.showPaymentMethod(clientToken, intent.paymentMethod, intent.vault === true ? "vault" : "checkout");
193
+ }).catch(err => {
194
+ console.error(err);
195
+ });
236
196
  },
237
197
 
238
198
  dispose() {