@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.
- package/android/build.gradle +6 -2
- package/android/consumer-rules.pro +12 -0
- package/android/gradle.properties +1 -1
- package/android/src/main/java/com/primerioreactnative/PrimerRN.kt +192 -153
- package/android/src/main/java/com/primerioreactnative/PrimerRNEventListener.kt +131 -86
- package/android/src/main/java/com/primerioreactnative/ReactNativePackage.kt +3 -14
- package/android/src/main/java/com/primerioreactnative/datamodels/PrimerErrorRN.kt +3 -4
- package/android/src/main/java/com/primerioreactnative/datamodels/PrimerEventsRN.kt +11 -0
- package/android/src/main/java/com/primerioreactnative/datamodels/PrimerSettingsRN.kt +4 -3
- package/android/src/main/java/com/primerioreactnative/utils/ErrorHelper.kt +11 -0
- package/android/src/main/java/com/primerioreactnative/utils/PrimerImplementedRNCallbacks.kt +14 -0
- package/ios/DataModels/PrimerErrorRN.swift +1 -1
- package/ios/DataModels/PrimerSettingsRN.swift +6 -0
- package/ios/RNTPrimer.m +43 -0
- package/ios/RNTPrimer.swift +394 -0
- package/ios/ReactNative-Bridging-Header.h +3 -0
- package/ios/ReactNative.xcodeproj/project.pbxproj +44 -0
- package/lib/commonjs/Primer.js +220 -209
- package/lib/commonjs/Primer.js.map +1 -1
- package/lib/commonjs/RNPrimer.js +145 -0
- package/lib/commonjs/RNPrimer.js.map +1 -0
- package/lib/commonjs/index.js +1 -28
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/models/primer-intent.js.map +1 -1
- package/lib/commonjs/models/utils/redirectScheme.js +4 -0
- package/lib/commonjs/models/utils/redirectScheme.js.map +1 -0
- package/lib/module/Primer.js +204 -210
- package/lib/module/Primer.js.map +1 -1
- package/lib/module/RNPrimer.js +136 -0
- package/lib/module/RNPrimer.js.map +1 -0
- package/lib/module/index.js +3 -4
- package/lib/module/index.js.map +1 -1
- package/lib/module/models/primer-intent.js.map +1 -1
- package/lib/module/models/utils/redirectScheme.js +2 -0
- package/lib/module/models/utils/redirectScheme.js.map +1 -0
- package/lib/typescript/Primer.d.ts +13 -0
- package/lib/typescript/RNPrimer.d.ts +24 -0
- package/lib/typescript/index.d.ts +1 -3
- package/lib/typescript/models/primer-callbacks.d.ts +7 -9
- package/lib/typescript/models/primer-config.d.ts +16 -13
- package/lib/typescript/models/primer-intent.d.ts +1 -1
- package/lib/typescript/models/primer-request.d.ts +2 -12
- package/lib/typescript/models/primer-settings.d.ts +5 -6
- package/lib/typescript/models/primer.d.ts +4 -4
- package/lib/typescript/models/utils/redirectScheme.d.ts +3 -0
- package/package.json +4 -1
- package/primer-io-react-native.podspec +2 -3
- package/src/Primer.ts +227 -178
- package/src/RNPrimer.ts +170 -0
- package/src/index.tsx +2 -3
- package/src/models/primer-callbacks.ts +9 -27
- package/src/models/primer-config.ts +23 -20
- package/src/models/primer-intent.ts +1 -1
- package/src/models/primer-request.ts +2 -16
- package/src/models/primer-settings.ts +5 -6
- package/src/models/primer.ts +5 -5
- package/src/models/utils/redirectScheme.ts +5 -0
- package/android/src/main/java/com/primerioreactnative/PrimerCardNumberEditTextManager.kt +0 -83
- package/android/src/main/java/com/primerioreactnative/PrimerHeadlessUniversalCheckout.kt +0 -201
- package/android/src/main/java/com/primerioreactnative/huc/assets/AssetsManager.kt +0 -56
- package/android/src/main/java/com/primerioreactnative/huc/events/PrimerHeadlessUniversalCheckoutEvent.kt +0 -11
- package/android/src/main/java/com/primerioreactnative/huc/extensions/Map.kt +0 -10
- package/ios/Core/PrimerRN+PrimerDelegate.swift +0 -148
- package/ios/Core/PrimerRN.m +0 -34
- package/ios/Core/PrimerRN.swift +0 -168
- package/ios/Core/ReactNative-Bridging-Header.h +0 -13
- package/ios/Headless Universal Checkout/RNTPrimerCardNumberInputElementManager.m +0 -23
- package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.m +0 -30
- package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.swift +0 -241
- package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.m +0 -14
- package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.swift +0 -117
- package/lib/commonjs/PrimerInput.js +0 -80
- package/lib/commonjs/PrimerInput.js.map +0 -1
- package/lib/commonjs/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js +0 -14
- package/lib/commonjs/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js.map +0 -1
- package/lib/commonjs/headless_checkout/NativePrimerHeadlessUniversalCheckout.js +0 -73
- package/lib/commonjs/headless_checkout/NativePrimerHeadlessUniversalCheckout.js.map +0 -1
- package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js +0 -119
- package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +0 -1
- package/lib/commonjs/headless_checkout/types.js +0 -2
- package/lib/commonjs/headless_checkout/types.js.map +0 -1
- package/lib/module/PrimerInput.js +0 -46
- package/lib/module/PrimerInput.js.map +0 -1
- package/lib/module/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js +0 -5
- package/lib/module/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js.map +0 -1
- package/lib/module/headless_checkout/NativePrimerHeadlessUniversalCheckout.js +0 -64
- package/lib/module/headless_checkout/NativePrimerHeadlessUniversalCheckout.js.map +0 -1
- package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js +0 -104
- package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +0 -1
- package/lib/module/headless_checkout/types.js +0 -2
- package/lib/module/headless_checkout/types.js.map +0 -1
- package/lib/typescript/PrimerInput.d.ts +0 -15
- package/lib/typescript/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.d.ts +0 -1
- package/lib/typescript/headless_checkout/NativePrimerHeadlessUniversalCheckout.d.ts +0 -10
- package/lib/typescript/headless_checkout/PrimerHeadlessUniversalCheckout.d.ts +0 -14
- package/lib/typescript/headless_checkout/types.d.ts +0 -16
- package/src/PrimerInput.tsx +0 -73
- package/src/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.tsx +0 -2
- package/src/headless_checkout/NativePrimerHeadlessUniversalCheckout.ts +0 -94
- package/src/headless_checkout/PrimerHeadlessUniversalCheckout.ts +0 -136
- 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
|
+
}
|
|
@@ -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)",
|