@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
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// PrimerRN+PrimerDelegate.swift
|
|
3
|
-
// primer-io-react-native
|
|
4
|
-
//
|
|
5
|
-
// Created by Carl Eriksson on 22/09/2021.
|
|
6
|
-
//
|
|
7
|
-
import PrimerSDK
|
|
8
|
-
|
|
9
|
-
extension PrimerRN: PrimerDelegate {
|
|
10
|
-
|
|
11
|
-
func clientTokenCallback(_ completion: @escaping (String?, Error?) -> Void) {
|
|
12
|
-
guard let clientToken = clientToken else {
|
|
13
|
-
checkoutFailed(with: ErrorTypeRN.clientTokenNotConfigured)
|
|
14
|
-
completion(nil, ErrorTypeRN.clientTokenNotConfigured)
|
|
15
|
-
return
|
|
16
|
-
}
|
|
17
|
-
completion(clientToken, nil)
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
func onTokenizeSuccess(
|
|
21
|
-
_ paymentMethodToken: PaymentMethodToken,
|
|
22
|
-
resumeHandler: ResumeHandlerProtocol
|
|
23
|
-
) {
|
|
24
|
-
do {
|
|
25
|
-
let paymentMethodTokenData = try encoder.encode(paymentMethodToken)
|
|
26
|
-
let paymentMethodTokenStr = String(data: paymentMethodTokenData, encoding: .utf8)!
|
|
27
|
-
self.onTokenizeSuccessCallback?([paymentMethodTokenStr])
|
|
28
|
-
} catch {
|
|
29
|
-
checkoutFailed(with: ErrorTypeRN.ParseJsonFailed)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
onResumeFlowCallback = { error, clientToken in
|
|
33
|
-
if let error = error {
|
|
34
|
-
resumeHandler.handle(error: error)
|
|
35
|
-
} else if let clientToken = clientToken {
|
|
36
|
-
resumeHandler.handle(newClientToken: clientToken)
|
|
37
|
-
} else {
|
|
38
|
-
resumeHandler.handleSuccess()
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
func onClientSessionActions(_ actions: [ClientSession.Action], resumeHandler: ResumeHandlerProtocol?) {
|
|
44
|
-
do {
|
|
45
|
-
let actionsRN: [[String: Any]] = actions.compactMap {
|
|
46
|
-
|
|
47
|
-
if ($0.`type` == "SELECT_PAYMENT_METHOD") {
|
|
48
|
-
let network = ($0.params?["binData"] as? [String: Any])?["network"] as? String
|
|
49
|
-
return [
|
|
50
|
-
"type": "SELECT_PAYMENT_METHOD",
|
|
51
|
-
"paymentMethodType": $0.params?["paymentMethodType"] as? String,
|
|
52
|
-
"network": network,
|
|
53
|
-
]
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if ($0.`type` == "UNSELECT_PAYMENT_METHOD") {
|
|
57
|
-
return [
|
|
58
|
-
"type": "UNSELECT_PAYMENT_METHOD",
|
|
59
|
-
]
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
if ($0.`type` == "SET_BILLING_ADDRESS") {
|
|
63
|
-
|
|
64
|
-
var billingAddress: [String: String] = [:]
|
|
65
|
-
|
|
66
|
-
$0.params?.forEach { entry in
|
|
67
|
-
if let value = entry.value as? String, !value.isEmpty {
|
|
68
|
-
billingAddress[entry.key] = value
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
return [
|
|
73
|
-
"type": "SET_BILLING_ADDRESS",
|
|
74
|
-
"params": [ "billingAddress": billingAddress ]
|
|
75
|
-
]
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
return [ "type": "UNKNOWN" ]
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
let request: [String: Any] = [
|
|
82
|
-
"actions": actionsRN
|
|
83
|
-
]
|
|
84
|
-
|
|
85
|
-
let data = try JSONSerialization.data(withJSONObject: request, options: .fragmentsAllowed)
|
|
86
|
-
let jsonString = String(data: data, encoding: .utf8)!
|
|
87
|
-
self.onClientSessionActionsCallback?([jsonString])
|
|
88
|
-
self.onClientSessionActionsCallback = nil
|
|
89
|
-
} catch {
|
|
90
|
-
checkoutFailed(with: ErrorTypeRN.ParseJsonFailed)
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
onActionResumeCallback = { error, token in
|
|
94
|
-
if let token = token {
|
|
95
|
-
resumeHandler?.handle(newClientToken: token)
|
|
96
|
-
} else if let error = error {
|
|
97
|
-
resumeHandler?.handle(error: error)
|
|
98
|
-
} else {
|
|
99
|
-
resumeHandler?.handle(error: ErrorTypeRN.generic)
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
func onResumeSuccess(_ clientToken: String, resumeHandler: ResumeHandlerProtocol) {
|
|
105
|
-
self.onResumeSuccessCallback?([clientToken])
|
|
106
|
-
|
|
107
|
-
onResumeFlowCallback = { error, clientToken in
|
|
108
|
-
if let error = error {
|
|
109
|
-
resumeHandler.handle(error: error)
|
|
110
|
-
} else if let clientToken = clientToken {
|
|
111
|
-
resumeHandler.handle(newClientToken: clientToken)
|
|
112
|
-
} else {
|
|
113
|
-
resumeHandler.handleSuccess()
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
func tokenAddedToVault(_ token: PaymentMethodToken) {
|
|
119
|
-
do {
|
|
120
|
-
let json = try encoder.encode(token)
|
|
121
|
-
let data = String(data: json, encoding: .utf8)!
|
|
122
|
-
self.onVaultSuccessCallback?([data])
|
|
123
|
-
} catch {
|
|
124
|
-
checkoutFailed(with: ErrorTypeRN.ParseJsonFailed)
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
func onCheckoutDismissed() {
|
|
129
|
-
self.onDismissCallback?([])
|
|
130
|
-
self.onDismissCallback = nil
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
func checkoutFailed(with error: Error) {
|
|
134
|
-
do {
|
|
135
|
-
if let error = error as? ErrorTypeRN {
|
|
136
|
-
let exception = PrimerErrorRN(exceptionType: error, description: nil)
|
|
137
|
-
let json = try encoder.encode(exception)
|
|
138
|
-
let data = String(data: json, encoding: .utf8)!
|
|
139
|
-
self.onPrimerErrorCallback?([data])
|
|
140
|
-
} else {
|
|
141
|
-
self.onPrimerErrorCallback?(["{\"exceptionType\":\"CheckoutFlowFailed\"}"])
|
|
142
|
-
}
|
|
143
|
-
} catch {
|
|
144
|
-
self.onPrimerErrorCallback?(["{\"exceptionType\":\"ParseJsonFailed\"}"])
|
|
145
|
-
}
|
|
146
|
-
haltExecution = true
|
|
147
|
-
}
|
|
148
|
-
}
|
package/ios/Core/PrimerRN.m
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
#import <React/RCTBridgeModule.h>
|
|
2
|
-
#import <React/RCTViewManager.h>
|
|
3
|
-
|
|
4
|
-
@interface RCT_EXTERN_MODULE(PrimerRN, NSObject)
|
|
5
|
-
|
|
6
|
-
RCT_EXTERN_METHOD(configureSettings: (NSString *)request)
|
|
7
|
-
|
|
8
|
-
RCT_EXTERN_METHOD(configureTheme: (NSString *)request)
|
|
9
|
-
|
|
10
|
-
RCT_EXTERN_METHOD(configureIntent: (NSString *)request)
|
|
11
|
-
|
|
12
|
-
RCT_EXTERN_METHOD(configureOnTokenizeSuccess: (RCTResponseSenderBlock)callback)
|
|
13
|
-
|
|
14
|
-
RCT_EXTERN_METHOD(configureOnClientSessionActions: (RCTResponseSenderBlock)callback)
|
|
15
|
-
|
|
16
|
-
RCT_EXTERN_METHOD(configureOnResumeSuccess: (RCTResponseSenderBlock)callback)
|
|
17
|
-
|
|
18
|
-
RCT_EXTERN_METHOD(configureOnVaultSuccess: (RCTResponseSenderBlock)callback)
|
|
19
|
-
|
|
20
|
-
RCT_EXTERN_METHOD(configureOnDismiss: (RCTResponseSenderBlock)callback)
|
|
21
|
-
|
|
22
|
-
RCT_EXTERN_METHOD(configureOnPrimerError: (RCTResponseSenderBlock)callback)
|
|
23
|
-
|
|
24
|
-
RCT_EXTERN_METHOD(configureOnSavedPaymentInstrumentsFetched: (RCTResponseSenderBlock)callback)
|
|
25
|
-
|
|
26
|
-
RCT_EXTERN_METHOD(initialize: (NSString *)data)
|
|
27
|
-
|
|
28
|
-
RCT_EXTERN_METHOD(resume: (NSString *)data)
|
|
29
|
-
|
|
30
|
-
RCT_EXTERN_METHOD(actionResume: (NSString *)data)
|
|
31
|
-
|
|
32
|
-
RCT_EXTERN_METHOD(dispose)
|
|
33
|
-
|
|
34
|
-
@end
|
package/ios/Core/PrimerRN.swift
DELETED
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
import UIKit
|
|
2
|
-
import PrimerSDK
|
|
3
|
-
|
|
4
|
-
typealias BasicCompletionBlock = ((Error?, String?) -> Void)
|
|
5
|
-
|
|
6
|
-
@objc(PrimerRN)
|
|
7
|
-
class PrimerRN: NSObject {
|
|
8
|
-
|
|
9
|
-
let encoder = JSONEncoder()
|
|
10
|
-
|
|
11
|
-
override init() {
|
|
12
|
-
encoder.outputFormatting = .prettyPrinted
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
var clientToken: String?
|
|
16
|
-
var settings: PrimerSettingsRN?
|
|
17
|
-
var theme: PrimerThemeRN?
|
|
18
|
-
var intent: PrimerIntentRN?
|
|
19
|
-
var onTokenizeSuccessCallback: RCTResponseSenderBlock?
|
|
20
|
-
var onClientSessionActionsCallback: RCTResponseSenderBlock?
|
|
21
|
-
var onResumeSuccessCallback: RCTResponseSenderBlock?
|
|
22
|
-
var onVaultSuccessCallback: RCTResponseSenderBlock?
|
|
23
|
-
var onDismissCallback: RCTResponseSenderBlock?
|
|
24
|
-
var onPrimerErrorCallback: RCTResponseSenderBlock?
|
|
25
|
-
var onResumeFlowCallback: BasicCompletionBlock?
|
|
26
|
-
var onActionResumeCallback: BasicCompletionBlock?
|
|
27
|
-
|
|
28
|
-
private var sdkWasInitialised = false
|
|
29
|
-
internal var haltExecution = false
|
|
30
|
-
|
|
31
|
-
@objc func configureSettings(_ settingsStr: String) {
|
|
32
|
-
do {
|
|
33
|
-
let settingsData = settingsStr.data(using: .utf8)!
|
|
34
|
-
let settingsRN = try JSONDecoder().decode(PrimerSettingsRN.self, from: settingsData)
|
|
35
|
-
self.settings = settingsRN
|
|
36
|
-
} catch {
|
|
37
|
-
checkoutFailed(with: ErrorTypeRN.ParseJsonFailed)
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
@objc func configureTheme(_ themeStr: String) {
|
|
42
|
-
do {
|
|
43
|
-
let themeData = themeStr.data(using: .utf8)!
|
|
44
|
-
let themeRN = try JSONDecoder().decode(PrimerThemeRN.self, from: themeData)
|
|
45
|
-
self.theme = themeRN
|
|
46
|
-
} catch {
|
|
47
|
-
checkoutFailed(with: ErrorTypeRN.ParseJsonFailed)
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
@objc func configureIntent(_ intentStr: String) {
|
|
52
|
-
do {
|
|
53
|
-
let intentData = intentStr.data(using: .utf8)!
|
|
54
|
-
let intentRN = try JSONDecoder().decode(PrimerIntentRN.self, from: intentData)
|
|
55
|
-
self.intent = intentRN
|
|
56
|
-
} catch {
|
|
57
|
-
checkoutFailed(with: ErrorTypeRN.ParseJsonFailed)
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
@objc func configureOnTokenizeSuccess(_ callback: @escaping RCTResponseSenderBlock) {
|
|
62
|
-
self.onTokenizeSuccessCallback = callback
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
@objc func configureOnClientSessionActions(_ callback: @escaping RCTResponseSenderBlock) {
|
|
66
|
-
self.onClientSessionActionsCallback = callback
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
@objc func configureOnResumeSuccess(_ callback: @escaping RCTResponseSenderBlock) {
|
|
70
|
-
self.onResumeSuccessCallback = callback
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
@objc func configureOnVaultSuccess(_ callback: @escaping RCTResponseSenderBlock) {
|
|
74
|
-
self.onVaultSuccessCallback = callback
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
@objc func configureOnDismiss(_ callback: @escaping RCTResponseSenderBlock) {
|
|
78
|
-
self.onDismissCallback = callback
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
@objc func configureOnPrimerError(_ callback: @escaping RCTResponseSenderBlock) {
|
|
82
|
-
self.onPrimerErrorCallback = callback
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
@objc func initialize(_ token: String) -> Void {
|
|
86
|
-
DispatchQueue.main.async { [weak self] in
|
|
87
|
-
do {
|
|
88
|
-
guard let viewController = RCTPresentedViewController() else {
|
|
89
|
-
throw ErrorTypeRN.noIosViewController
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
guard let intent = self?.intent else {
|
|
93
|
-
throw ErrorTypeRN.invalidPrimerIntent
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
guard
|
|
97
|
-
let settings = self?.settings?.asPrimerSettings(),
|
|
98
|
-
let theme = self?.theme?.asPrimerTheme()
|
|
99
|
-
else {
|
|
100
|
-
throw ErrorTypeRN.settingsNotConfigured
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
self?.clientToken = token
|
|
104
|
-
|
|
105
|
-
Primer.shared.delegate = self
|
|
106
|
-
Primer.shared.configure(settings: settings, theme: theme)
|
|
107
|
-
|
|
108
|
-
DispatchQueue.main.async {
|
|
109
|
-
if (intent.vault) {
|
|
110
|
-
Primer.shared.showVaultManager(on: viewController, clientToken: token)
|
|
111
|
-
} else {
|
|
112
|
-
Primer.shared.showUniversalCheckout(on: viewController, clientToken: token)
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
} catch {
|
|
117
|
-
self?.checkoutFailed(with: error)
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
@objc func resume(_ resumeRequestStr: String) -> Void {
|
|
123
|
-
DispatchQueue.main.async { [weak self] in
|
|
124
|
-
do {
|
|
125
|
-
let resumeRequestData = resumeRequestStr.data(using: .utf8)!
|
|
126
|
-
let resumeRequest = try JSONDecoder().decode(PrimerResumeRequest.self, from: resumeRequestData)
|
|
127
|
-
|
|
128
|
-
if let errorDescription = resumeRequest.error {
|
|
129
|
-
let errorRN = NativeError(errorId: "server-error", errorDescription: errorDescription, recoverySuggestion: nil)
|
|
130
|
-
self?.onResumeFlowCallback?(errorRN, nil)
|
|
131
|
-
} else if let clientToken = resumeRequest.token {
|
|
132
|
-
self?.onResumeFlowCallback?(nil, clientToken)
|
|
133
|
-
} else {
|
|
134
|
-
self?.onResumeFlowCallback?(nil, nil)
|
|
135
|
-
}
|
|
136
|
-
self?.onResumeFlowCallback = nil
|
|
137
|
-
} catch {
|
|
138
|
-
self?.checkoutFailed(with: error)
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
@objc func actionResume(_ resumeRequestStr: String) -> Void {
|
|
144
|
-
DispatchQueue.main.async { [weak self] in
|
|
145
|
-
do {
|
|
146
|
-
let resumeRequestData = resumeRequestStr.data(using: .utf8)!
|
|
147
|
-
let resumeRequestRN = try JSONDecoder().decode(PrimerResumeRequest.self, from: resumeRequestData)
|
|
148
|
-
|
|
149
|
-
if let errorDescription = resumeRequestRN.error {
|
|
150
|
-
let errorRN = NativeError(errorId: "server-error", errorDescription: errorDescription, recoverySuggestion: nil)
|
|
151
|
-
self?.onActionResumeCallback?(errorRN, nil)
|
|
152
|
-
} else if let clientToken = resumeRequestRN.token {
|
|
153
|
-
self?.onActionResumeCallback?(nil, clientToken)
|
|
154
|
-
} else {
|
|
155
|
-
self?.onActionResumeCallback?(nil, self?.clientToken)
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
self?.onActionResumeCallback = nil
|
|
159
|
-
} catch {
|
|
160
|
-
self?.checkoutFailed(with: error)
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
@objc func dispose() -> Void {
|
|
166
|
-
|
|
167
|
-
}
|
|
168
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
#import <React/RCTBridgeModule.h>
|
|
2
|
-
#import <React/RCTViewManager.h>
|
|
3
|
-
#import <React/RCTUIManager.h>
|
|
4
|
-
#import <React/RCTView.h>
|
|
5
|
-
// for view controller implementation https://stackoverflow.com/questions/45741903/react-native-ios-how-can-i-navigate-to-a-non-react-native-view-native-ios-vie/46007680#46007680
|
|
6
|
-
#import "React/RCTBridge.h"
|
|
7
|
-
#import "React/RCTEventDispatcher.h"
|
|
8
|
-
#import "React/RCTRootView.h"
|
|
9
|
-
#import "React/RCTUtils.h"
|
|
10
|
-
#import "React/RCTConvert.h"
|
|
11
|
-
#import "React/RCTBundleURLProvider.h"
|
|
12
|
-
#import "RCTViewManager.h"
|
|
13
|
-
#import "React/RCTEventEmitter.h"
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// RNTPrimerCardNumberInputElementManager.m
|
|
3
|
-
// primer-io-react-native
|
|
4
|
-
//
|
|
5
|
-
// Created by Evangelos on 3/3/22.
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
#import <React/RCTViewManager.h>
|
|
9
|
-
@import PrimerSDK;
|
|
10
|
-
|
|
11
|
-
@interface RNTPrimerCardNumberInputElementManager : RCTViewManager
|
|
12
|
-
@end
|
|
13
|
-
|
|
14
|
-
@implementation RNTPrimerCardNumberInputElementManager
|
|
15
|
-
|
|
16
|
-
RCT_EXPORT_MODULE(PrimerCardNumberEditText)
|
|
17
|
-
|
|
18
|
-
- (UIView *)view
|
|
19
|
-
{
|
|
20
|
-
return [[PrimerCardNumberInputElement alloc] init];
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
@end
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// RNTPrimerHeadlessUniversalCheckout.m
|
|
3
|
-
// primer-io-react-native
|
|
4
|
-
//
|
|
5
|
-
// Created by Evangelos on 8/3/22.
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
#import <React/RCTBridgeModule.h>
|
|
9
|
-
#import <React/RCTEventEmitter.h>
|
|
10
|
-
|
|
11
|
-
@interface RCT_EXTERN_MODULE(PrimerHeadlessUniversalCheckout, RCTEventEmitter)
|
|
12
|
-
|
|
13
|
-
RCT_EXTERN_METHOD(startWithClientToken:(NSString *)clientToken settingsStr:(NSString *)settingsStr errorCallback:(RCTResponseSenderBlock)errorCallback successCallback: (RCTResponseSenderBlock)successCallback)
|
|
14
|
-
|
|
15
|
-
RCT_EXTERN_METHOD(resumeWithClientToken:(NSString *)resumeToken)
|
|
16
|
-
|
|
17
|
-
RCT_EXTERN_METHOD(showPaymentMethod:(NSString *)paymentMethodTypeStr)
|
|
18
|
-
|
|
19
|
-
RCT_EXTERN_METHOD(getAssetForPaymentMethodType:(NSString *)paymentMethodTypeStr
|
|
20
|
-
assetType:(NSString *)assetTypeStr
|
|
21
|
-
errorCallback:(RCTResponseSenderBlock)errorCallback
|
|
22
|
-
successCallback: (RCTResponseSenderBlock)successCallback)
|
|
23
|
-
|
|
24
|
-
RCT_EXTERN_METHOD(getAssetForCardNetwork:(NSString *)cardNetworkStr
|
|
25
|
-
assetType:(NSString *)assetTypeStr
|
|
26
|
-
errorCallback:(RCTResponseSenderBlock)errorCallback
|
|
27
|
-
successCallback: (RCTResponseSenderBlock)successCallback)
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
@end
|
|
@@ -1,241 +0,0 @@
|
|
|
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
|
-
}
|
package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.m
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
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
|