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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/android/build.gradle +6 -2
  2. package/android/consumer-rules.pro +12 -0
  3. package/android/gradle.properties +1 -1
  4. package/android/src/main/java/com/primerioreactnative/PrimerRN.kt +192 -153
  5. package/android/src/main/java/com/primerioreactnative/PrimerRNEventListener.kt +131 -86
  6. package/android/src/main/java/com/primerioreactnative/ReactNativePackage.kt +3 -14
  7. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerErrorRN.kt +3 -4
  8. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerEventsRN.kt +11 -0
  9. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerSettingsRN.kt +4 -3
  10. package/android/src/main/java/com/primerioreactnative/utils/ErrorHelper.kt +11 -0
  11. package/android/src/main/java/com/primerioreactnative/utils/PrimerImplementedRNCallbacks.kt +14 -0
  12. package/ios/DataModels/PrimerErrorRN.swift +1 -1
  13. package/ios/DataModels/PrimerSettingsRN.swift +6 -0
  14. package/ios/RNTPrimer.m +43 -0
  15. package/ios/RNTPrimer.swift +394 -0
  16. package/ios/ReactNative-Bridging-Header.h +3 -0
  17. package/ios/ReactNative.xcodeproj/project.pbxproj +44 -0
  18. package/lib/commonjs/Primer.js +220 -209
  19. package/lib/commonjs/Primer.js.map +1 -1
  20. package/lib/commonjs/RNPrimer.js +145 -0
  21. package/lib/commonjs/RNPrimer.js.map +1 -0
  22. package/lib/commonjs/index.js +1 -28
  23. package/lib/commonjs/index.js.map +1 -1
  24. package/lib/commonjs/models/primer-intent.js.map +1 -1
  25. package/lib/commonjs/models/utils/redirectScheme.js +4 -0
  26. package/lib/commonjs/models/utils/redirectScheme.js.map +1 -0
  27. package/lib/module/Primer.js +204 -210
  28. package/lib/module/Primer.js.map +1 -1
  29. package/lib/module/RNPrimer.js +136 -0
  30. package/lib/module/RNPrimer.js.map +1 -0
  31. package/lib/module/index.js +3 -4
  32. package/lib/module/index.js.map +1 -1
  33. package/lib/module/models/primer-intent.js.map +1 -1
  34. package/lib/module/models/utils/redirectScheme.js +2 -0
  35. package/lib/module/models/utils/redirectScheme.js.map +1 -0
  36. package/lib/typescript/Primer.d.ts +13 -0
  37. package/lib/typescript/RNPrimer.d.ts +24 -0
  38. package/lib/typescript/index.d.ts +1 -3
  39. package/lib/typescript/models/primer-callbacks.d.ts +7 -9
  40. package/lib/typescript/models/primer-config.d.ts +16 -13
  41. package/lib/typescript/models/primer-intent.d.ts +1 -1
  42. package/lib/typescript/models/primer-request.d.ts +2 -12
  43. package/lib/typescript/models/primer-settings.d.ts +5 -6
  44. package/lib/typescript/models/primer.d.ts +4 -4
  45. package/lib/typescript/models/utils/redirectScheme.d.ts +3 -0
  46. package/package.json +4 -1
  47. package/primer-io-react-native.podspec +2 -3
  48. package/src/Primer.ts +227 -178
  49. package/src/RNPrimer.ts +170 -0
  50. package/src/index.tsx +2 -3
  51. package/src/models/primer-callbacks.ts +9 -27
  52. package/src/models/primer-config.ts +23 -20
  53. package/src/models/primer-intent.ts +1 -1
  54. package/src/models/primer-request.ts +2 -16
  55. package/src/models/primer-settings.ts +5 -6
  56. package/src/models/primer.ts +5 -5
  57. package/src/models/utils/redirectScheme.ts +5 -0
  58. package/android/src/main/java/com/primerioreactnative/PrimerCardNumberEditTextManager.kt +0 -83
  59. package/android/src/main/java/com/primerioreactnative/PrimerHeadlessUniversalCheckout.kt +0 -201
  60. package/android/src/main/java/com/primerioreactnative/huc/assets/AssetsManager.kt +0 -56
  61. package/android/src/main/java/com/primerioreactnative/huc/events/PrimerHeadlessUniversalCheckoutEvent.kt +0 -11
  62. package/android/src/main/java/com/primerioreactnative/huc/extensions/Map.kt +0 -10
  63. package/ios/Core/PrimerRN+PrimerDelegate.swift +0 -148
  64. package/ios/Core/PrimerRN.m +0 -34
  65. package/ios/Core/PrimerRN.swift +0 -168
  66. package/ios/Core/ReactNative-Bridging-Header.h +0 -13
  67. package/ios/Headless Universal Checkout/RNTPrimerCardNumberInputElementManager.m +0 -23
  68. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.m +0 -30
  69. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.swift +0 -241
  70. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.m +0 -14
  71. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.swift +0 -117
  72. package/lib/commonjs/PrimerInput.js +0 -80
  73. package/lib/commonjs/PrimerInput.js.map +0 -1
  74. package/lib/commonjs/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js +0 -14
  75. package/lib/commonjs/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js.map +0 -1
  76. package/lib/commonjs/headless_checkout/NativePrimerHeadlessUniversalCheckout.js +0 -73
  77. package/lib/commonjs/headless_checkout/NativePrimerHeadlessUniversalCheckout.js.map +0 -1
  78. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js +0 -119
  79. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +0 -1
  80. package/lib/commonjs/headless_checkout/types.js +0 -2
  81. package/lib/commonjs/headless_checkout/types.js.map +0 -1
  82. package/lib/module/PrimerInput.js +0 -46
  83. package/lib/module/PrimerInput.js.map +0 -1
  84. package/lib/module/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js +0 -5
  85. package/lib/module/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js.map +0 -1
  86. package/lib/module/headless_checkout/NativePrimerHeadlessUniversalCheckout.js +0 -64
  87. package/lib/module/headless_checkout/NativePrimerHeadlessUniversalCheckout.js.map +0 -1
  88. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js +0 -104
  89. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +0 -1
  90. package/lib/module/headless_checkout/types.js +0 -2
  91. package/lib/module/headless_checkout/types.js.map +0 -1
  92. package/lib/typescript/PrimerInput.d.ts +0 -15
  93. package/lib/typescript/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.d.ts +0 -1
  94. package/lib/typescript/headless_checkout/NativePrimerHeadlessUniversalCheckout.d.ts +0 -10
  95. package/lib/typescript/headless_checkout/PrimerHeadlessUniversalCheckout.d.ts +0 -14
  96. package/lib/typescript/headless_checkout/types.d.ts +0 -16
  97. package/src/PrimerInput.tsx +0 -73
  98. package/src/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.tsx +0 -2
  99. package/src/headless_checkout/NativePrimerHeadlessUniversalCheckout.ts +0 -94
  100. package/src/headless_checkout/PrimerHeadlessUniversalCheckout.ts +0 -136
  101. package/src/headless_checkout/types.ts +0 -18
@@ -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
- }
@@ -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
@@ -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
- }
@@ -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