@primer-io/react-native 0.12.5 → 0.15.1

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 (55) hide show
  1. package/android/build.gradle +2 -2
  2. package/android/gradle.properties +1 -1
  3. package/android/src/main/java/com/primerioreactnative/PrimerRN.kt +191 -152
  4. package/android/src/main/java/com/primerioreactnative/PrimerRNEventListener.kt +131 -86
  5. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerErrorRN.kt +3 -2
  6. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerEventsRN.kt +11 -0
  7. package/android/src/main/java/com/primerioreactnative/utils/ErrorHelper.kt +11 -0
  8. package/android/src/main/java/com/primerioreactnative/utils/PrimerImplementedRNCallbacks.kt +14 -0
  9. package/ios/DataModels/PrimerErrorRN.swift +32 -2
  10. package/ios/RNTPrimer.m +43 -0
  11. package/ios/RNTPrimer.swift +394 -0
  12. package/ios/ReactNative-Bridging-Header.h +1 -9
  13. package/ios/ReactNative.xcodeproj/project.pbxproj +44 -0
  14. package/lib/commonjs/Primer.js +221 -209
  15. package/lib/commonjs/Primer.js.map +1 -1
  16. package/lib/commonjs/RNPrimer.js +145 -0
  17. package/lib/commonjs/RNPrimer.js.map +1 -0
  18. package/lib/commonjs/index.js +1 -0
  19. package/lib/commonjs/index.js.map +1 -1
  20. package/lib/commonjs/models/primer-intent.js.map +1 -1
  21. package/lib/commonjs/models/utils/redirectScheme.js +4 -0
  22. package/lib/commonjs/models/utils/redirectScheme.js.map +1 -0
  23. package/lib/module/Primer.js +203 -209
  24. package/lib/module/Primer.js.map +1 -1
  25. package/lib/module/RNPrimer.js +136 -0
  26. package/lib/module/RNPrimer.js.map +1 -0
  27. package/lib/module/index.js +2 -1
  28. package/lib/module/index.js.map +1 -1
  29. package/lib/module/models/primer-intent.js.map +1 -1
  30. package/lib/module/models/utils/redirectScheme.js +2 -0
  31. package/lib/module/models/utils/redirectScheme.js.map +1 -0
  32. package/lib/typescript/Primer.d.ts +13 -0
  33. package/lib/typescript/RNPrimer.d.ts +24 -0
  34. package/lib/typescript/models/primer-callbacks.d.ts +7 -10
  35. package/lib/typescript/models/primer-config.d.ts +16 -13
  36. package/lib/typescript/models/primer-intent.d.ts +1 -1
  37. package/lib/typescript/models/primer-request.d.ts +2 -12
  38. package/lib/typescript/models/primer-settings.d.ts +3 -5
  39. package/lib/typescript/models/primer.d.ts +4 -4
  40. package/lib/typescript/models/utils/redirectScheme.d.ts +3 -0
  41. package/package.json +4 -1
  42. package/primer-io-react-native.podspec +2 -3
  43. package/src/Primer.ts +227 -177
  44. package/src/RNPrimer.ts +170 -0
  45. package/src/index.tsx +1 -0
  46. package/src/models/primer-callbacks.ts +9 -32
  47. package/src/models/primer-config.ts +23 -21
  48. package/src/models/primer-intent.ts +1 -1
  49. package/src/models/primer-request.ts +2 -16
  50. package/src/models/primer-settings.ts +3 -5
  51. package/src/models/primer.ts +5 -5
  52. package/src/models/utils/redirectScheme.ts +5 -0
  53. package/ios/PrimerRN+PrimerDelegate.swift +0 -147
  54. package/ios/PrimerRN.swift +0 -166
  55. package/ios/ReactNative.m +0 -34
@@ -1,48 +1,50 @@
1
- import type {
2
- OnClientSessionActionsCallback,
3
- OnDismissCallback,
4
- OnPrimerErrorCallback,
5
- OnResumeSuccessCallback,
6
- OnSavedPaymentInstrumentsFetchedCallback,
7
- OnTokenAddedToVaultCallback,
8
- OnTokenizeSuccessCallback,
9
- } from './primer-callbacks';
1
+ import type { IClientSessionAction } from 'src/Primer';
2
+ import type { IPrimerError } from 'src/RNPrimer';
3
+ import type { PaymentInstrumentToken } from './payment-instrument-token';
4
+ import type { PrimerResumeHandler } from './primer-request';
10
5
  import type { PrimerSettings } from './primer-settings';
11
6
  import type { PrimerTheme } from './primer-theme';
12
7
 
13
- export type PrimerConfig = IPrimerConfig;
14
- interface IPrimerConfig {
8
+ export interface IPrimerConfig {
15
9
  /**
16
10
  * Include data for different payment methods (e.g. amount or business details)
17
11
  */
18
12
  settings?: PrimerSettings;
13
+
19
14
  /**
20
15
  * Set colors and dimensions for the Primer UI.
21
16
  */
22
17
  theme?: PrimerTheme;
18
+
19
+ // onClientTokenCallback?: (resumeHandler: PrimerResumeHandler) => void;
20
+
23
21
  /**
24
- * Use this callback to grab a Primer payment instrument token and complete a payment.
22
+ * Use this callback to grab a Primer payment instrument and complete a payment.
25
23
  */
26
- onTokenizeSuccess?: OnTokenizeSuccessCallback;
24
+ onTokenizeSuccess?: (paymentInstrument: PaymentInstrumentToken, resumeHandler: PrimerResumeHandler) => void;
27
25
 
28
- onResumeSuccess?: OnResumeSuccessCallback;
26
+ /**
27
+ * Use this callback to resume a PENDING payment with the token provided.
28
+ */
29
+ onResumeSuccess?: (resumeToken: string, resumeHandler: PrimerResumeHandler | null) => void;
29
30
 
30
31
  /**
31
32
  * Use this callback to perform some action when a payment instrument was saved to Primer.
32
33
  */
33
- onTokenAddedToVault?: OnTokenAddedToVaultCallback;
34
+ onTokenAddedToVault?: (paymentInstrument: PaymentInstrumentToken) => void;
35
+
34
36
  /**
35
37
  * Use this callback to perform some action when the Primer UI is dismissed.
36
38
  */
37
- onDismiss?: OnDismissCallback;
39
+ onDismiss?: () => void;
40
+
38
41
  /**
39
42
  * Use this callback to perform some action when the SDK throws an error.
40
43
  */
41
- onError?: OnPrimerErrorCallback;
44
+ onError?: (err: IPrimerError, resumeHandler: PrimerResumeHandler) => void;
45
+
42
46
  /**
43
- * Use this to receive saved payment instruments fetch result.
47
+ * Use this callback to perform actions on payment methods, like surcharging.
44
48
  */
45
- onSavedPaymentInstrumentsFetched?: OnSavedPaymentInstrumentsFetchedCallback;
46
-
47
- onClientSessionActions?: OnClientSessionActionsCallback;
49
+ onClientSessionActions?: (clientSessionActions: IClientSessionAction[], resumeHandler: PrimerResumeHandler | null) => void;
48
50
  }
@@ -34,7 +34,7 @@ const paymentMethods = [
34
34
  export type SinglePrimerPaymentMethod = typeof paymentMethods[number];
35
35
  export interface AnyPrimerPaymentMethodIntent {
36
36
  vault: boolean;
37
- paymentMethod: 'Any';
37
+ paymentMethod: SinglePrimerPaymentMethod;
38
38
  }
39
39
 
40
40
  export type PrimerPaymentMethodIntent = ISinglePrimerPaymentMethodIntent;
@@ -1,21 +1,7 @@
1
1
  export type PrimerResumeHandler = IPrimerResumeHandler;
2
2
 
3
3
  interface IPrimerResumeHandler {
4
- handleError: (error: string) => void;
5
-
4
+ handleNewClientToken: (clientToken: string) => void;
5
+ handleError: (error: Error) => void;
6
6
  handleSuccess: () => void;
7
-
8
- handleNewClientToken: (token: string) => void;
9
-
10
- /**
11
- * @deprecated This method should not be used
12
- * Please use handleError instead.
13
- */
14
- resumeWithError: (error: string | null) => void;
15
-
16
- /**
17
- * @deprecated This method should not be used.
18
- * Please use handleSuccess or handleNewClientToken instead.
19
- */
20
- resumeWithSuccess: (clientToken: string | null) => void;
21
7
  }
@@ -1,5 +1,6 @@
1
1
  import type { CountryCode } from './utils/countryCode';
2
2
  import type { CurrencyCode } from './utils/currencyCode';
3
+ import type { RedirectScheme } from './utils/redirectScheme';
3
4
 
4
5
  export type PrimerSettings = IPrimerSettings;
5
6
  interface IPrimerSettings {
@@ -20,7 +21,7 @@ interface IOrder {
20
21
 
21
22
  interface IOrderItem {
22
23
  name: string;
23
- unitAmount?: number;
24
+ amount: number;
24
25
  quantity: number;
25
26
  isPending?: boolean;
26
27
  }
@@ -50,7 +51,7 @@ interface IOptions {
50
51
  is3DSDevelopmentModeEnabled?: boolean;
51
52
  locale?: string;
52
53
  ios?: IIosOptions;
53
- android?: IAndroidOptions;
54
+ redirectScheme?: RedirectScheme;
54
55
  }
55
56
 
56
57
  interface IIosOptions {
@@ -58,9 +59,6 @@ interface IIosOptions {
58
59
  urlSchemeIdentifier?: string;
59
60
  merchantIdentifier?: string;
60
61
  }
61
- interface IAndroidOptions {
62
- redirectScheme?: string;
63
- }
64
62
 
65
63
  interface IAddress {
66
64
  line1?: String;
@@ -1,4 +1,4 @@
1
- import type { PrimerConfig } from './primer-config';
1
+ import type { IPrimerConfig } from './primer-config';
2
2
  import type { PrimerPaymentMethodIntent } from './primer-intent';
3
3
 
4
4
  export interface IPrimer {
@@ -11,7 +11,7 @@ export interface IPrimer {
11
11
  * @param config Configuration object for the SDK. Use this to set listeners, theme,
12
12
  * and payment method specific settings.
13
13
  */
14
- showUniversalCheckout(token: String, config: PrimerConfig): void;
14
+ showUniversalCheckout(token: string | null, config: IPrimerConfig): void;
15
15
 
16
16
  /**
17
17
  * Launch Primer's Vault Manager.
@@ -20,7 +20,7 @@ export interface IPrimer {
20
20
  * @param config Configuration object for the SDK. Use this to set listeners, theme,
21
21
  * and payment method specific settings.
22
22
  */
23
- showVaultManager(token: String, config: PrimerConfig): void;
23
+ showVaultManager(token: string | null, config: IPrimerConfig): void;
24
24
 
25
25
  /**
26
26
  * Launch checkout with a specific payment method
@@ -29,9 +29,9 @@ export interface IPrimer {
29
29
  * @param config Configuration for the SDK.
30
30
  */
31
31
  showPaymentMethod(
32
- token: String,
32
+ token: string | null,
33
33
  intent: PrimerPaymentMethodIntent,
34
- config: PrimerConfig
34
+ config: IPrimerConfig
35
35
  ): void;
36
36
 
37
37
  /**
@@ -0,0 +1,5 @@
1
+ var redirectSchemes = [
2
+ 'primer'
3
+ ] as const;
4
+
5
+ export type RedirectScheme = typeof redirectSchemes[number];
@@ -1,147 +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 json = try encoder.encode(paymentMethodToken)
26
- let data = String(data: json, encoding: .utf8)!
27
- self.onTokenizeSuccessCallback?([data])
28
- } catch {
29
- checkoutFailed(with: ErrorTypeRN.ParseJsonFailed)
30
- }
31
- onResumeFlowCallback = { error, clientToken in
32
- if let error = error {
33
- resumeHandler.handle(error: error)
34
- } else if let clientToken = clientToken {
35
- resumeHandler.handle(newClientToken: clientToken)
36
- } else {
37
- resumeHandler.handleSuccess()
38
- }
39
- }
40
- }
41
-
42
- func onClientSessionActions(_ actions: [ClientSession.Action], resumeHandler: ResumeHandlerProtocol?) {
43
- do {
44
- let actionsRN: [[String: Any]] = actions.compactMap {
45
-
46
- if ($0.`type` == "SELECT_PAYMENT_METHOD") {
47
- let network = ($0.params?["binData"] as? [String: Any])?["network"] as? String
48
- return [
49
- "type": "SELECT_PAYMENT_METHOD",
50
- "paymentMethodType": $0.params?["paymentMethodType"] as? String,
51
- "network": network,
52
- ]
53
- }
54
-
55
- if ($0.`type` == "UNSELECT_PAYMENT_METHOD") {
56
- return [
57
- "type": "UNSELECT_PAYMENT_METHOD",
58
- ]
59
- }
60
-
61
- if ($0.`type` == "SET_BILLING_ADDRESS") {
62
-
63
- var billingAddress: [String: String] = [:]
64
-
65
- $0.params?.forEach { entry in
66
- if let value = entry.value as? String, !value.isEmpty {
67
- billingAddress[entry.key] = value
68
- }
69
- }
70
-
71
- return [
72
- "type": "SET_BILLING_ADDRESS",
73
- "params": [ "billingAddress": billingAddress ]
74
- ]
75
- }
76
-
77
- return [ "type": "UNKNOWN" ]
78
- }
79
-
80
- let request: [String: Any] = [
81
- "actions": actionsRN
82
- ]
83
-
84
- let data = try JSONSerialization.data(withJSONObject: request, options: .fragmentsAllowed)
85
- let jsonString = String(data: data, encoding: .utf8)!
86
- self.onClientSessionActionsCallback?([jsonString])
87
- self.onClientSessionActionsCallback = nil
88
- } catch {
89
- checkoutFailed(with: ErrorTypeRN.ParseJsonFailed)
90
- }
91
-
92
- onActionResumeCallback = { error, token in
93
- if let token = token {
94
- resumeHandler?.handle(newClientToken: token)
95
- } else if let error = error {
96
- resumeHandler?.handle(error: error)
97
- } else {
98
- resumeHandler?.handle(error: ErrorTypeRN.generic)
99
- }
100
- }
101
- }
102
-
103
- func onResumeSuccess(_ clientToken: String, resumeHandler: ResumeHandlerProtocol) {
104
- self.onResumeSuccessCallback?([clientToken])
105
-
106
- onResumeFlowCallback = { error, clientToken in
107
- if let error = error {
108
- resumeHandler.handle(error: error)
109
- } else if let clientToken = clientToken {
110
- resumeHandler.handle(newClientToken: clientToken)
111
- } else {
112
- resumeHandler.handleSuccess()
113
- }
114
- }
115
- }
116
-
117
- func tokenAddedToVault(_ token: PaymentMethodToken) {
118
- do {
119
- let json = try encoder.encode(token)
120
- let data = String(data: json, encoding: .utf8)!
121
- self.onVaultSuccessCallback?([data])
122
- } catch {
123
- checkoutFailed(with: ErrorTypeRN.ParseJsonFailed)
124
- }
125
- }
126
-
127
- func onCheckoutDismissed() {
128
- self.onDismissCallback?([])
129
- self.onDismissCallback = nil
130
- }
131
-
132
- func checkoutFailed(with error: Error) {
133
- do {
134
- if let error = error as? ErrorTypeRN {
135
- let exception = PrimerErrorRN(exceptionType: error, description: nil)
136
- let json = try encoder.encode(exception)
137
- let data = String(data: json, encoding: .utf8)!
138
- self.onPrimerErrorCallback?([data])
139
- } else {
140
- self.onPrimerErrorCallback?(["{\"exceptionType\":\"CheckoutFlowFailed\"}"])
141
- }
142
- } catch {
143
- self.onPrimerErrorCallback?(["{\"exceptionType\":\"ParseJsonFailed\"}"])
144
- }
145
- haltExecution = true
146
- }
147
- }
@@ -1,166 +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(_ request: String) {
32
- do {
33
- let json = request.data(using: .utf8)!
34
- let settings = try JSONDecoder().decode(PrimerSettingsRN.self, from: json)
35
- self.settings = settings
36
- } catch {
37
- checkoutFailed(with: ErrorTypeRN.ParseJsonFailed)
38
- }
39
- }
40
-
41
- @objc func configureTheme(_ request: String) {
42
- do {
43
- let json = request.data(using: .utf8)!
44
- let themeRN = try JSONDecoder().decode(PrimerThemeRN.self, from: json)
45
- self.theme = themeRN
46
- } catch {
47
- checkoutFailed(with: ErrorTypeRN.ParseJsonFailed)
48
- }
49
- }
50
-
51
- @objc func configureIntent(_ request: String) {
52
- do {
53
- let json = request.data(using: .utf8)!
54
- let intent = try JSONDecoder().decode(PrimerIntentRN.self, from: json)
55
- self.intent = intent
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
- } catch {
116
- self?.checkoutFailed(with: error)
117
- }
118
- }
119
- }
120
-
121
- @objc func resume(_ request: String) -> Void {
122
- DispatchQueue.main.async { [weak self] in
123
- do {
124
- let json = request.data(using: .utf8)!
125
- let request = try JSONDecoder().decode(PrimerResumeRequest.self, from: json)
126
-
127
- if let error = request.error {
128
- self?.onResumeFlowCallback?(ErrorRN(message: error), nil)
129
- } else if let clientToken = request.token {
130
- self?.onResumeFlowCallback?(nil, clientToken)
131
- } else {
132
- self?.onResumeFlowCallback?(nil, nil)
133
- }
134
-
135
- self?.onResumeFlowCallback = nil
136
- } catch {
137
- self?.checkoutFailed(with: error)
138
- }
139
- }
140
- }
141
-
142
- @objc func actionResume(_ request: String) -> Void {
143
- DispatchQueue.main.async { [weak self] in
144
- do {
145
- let json = request.data(using: .utf8)!
146
- let request = try JSONDecoder().decode(PrimerResumeRequest.self, from: json)
147
-
148
- if let error = request.error {
149
- self?.onActionResumeCallback?(ErrorRN(message: error), nil)
150
- } else if let clientToken = request.token {
151
- self?.onActionResumeCallback?(nil, clientToken)
152
- } else {
153
- self?.onActionResumeCallback?(nil, self?.clientToken)
154
- }
155
-
156
- self?.onActionResumeCallback = nil
157
- } catch {
158
- self?.checkoutFailed(with: error)
159
- }
160
- }
161
- }
162
-
163
- @objc func dispose() -> Void {
164
-
165
- }
166
- }
package/ios/ReactNative.m DELETED
@@ -1,34 +0,0 @@
1
- #import <React/RCTBridgeModule.h>
2
- #import <React/RCTViewManager.h>
3
-
4
- @interface RCT_EXTERN_MODULE(PrimerRN, RCTViewManager)
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