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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) 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 +192 -153
  4. package/android/src/main/java/com/primerioreactnative/PrimerRNEventListener.kt +131 -86
  5. package/android/src/main/java/com/primerioreactnative/ReactNativePackage.kt +3 -14
  6. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerErrorRN.kt +3 -4
  7. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerEventsRN.kt +11 -0
  8. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerSettingsRN.kt +4 -3
  9. package/android/src/main/java/com/primerioreactnative/utils/ErrorHelper.kt +11 -0
  10. package/android/src/main/java/com/primerioreactnative/utils/PrimerImplementedRNCallbacks.kt +14 -0
  11. package/ios/DataModels/PrimerErrorRN.swift +1 -1
  12. package/ios/DataModels/PrimerSettingsRN.swift +6 -0
  13. package/ios/RNTPrimer.m +43 -0
  14. package/ios/RNTPrimer.swift +394 -0
  15. package/ios/ReactNative-Bridging-Header.h +3 -0
  16. package/ios/ReactNative.xcodeproj/project.pbxproj +44 -0
  17. package/lib/commonjs/Primer.js +220 -209
  18. package/lib/commonjs/Primer.js.map +1 -1
  19. package/lib/commonjs/RNPrimer.js +145 -0
  20. package/lib/commonjs/RNPrimer.js.map +1 -0
  21. package/lib/commonjs/index.js +1 -28
  22. package/lib/commonjs/index.js.map +1 -1
  23. package/lib/commonjs/models/primer-intent.js.map +1 -1
  24. package/lib/commonjs/models/utils/redirectScheme.js +4 -0
  25. package/lib/commonjs/models/utils/redirectScheme.js.map +1 -0
  26. package/lib/module/Primer.js +204 -210
  27. package/lib/module/Primer.js.map +1 -1
  28. package/lib/module/RNPrimer.js +136 -0
  29. package/lib/module/RNPrimer.js.map +1 -0
  30. package/lib/module/index.js +3 -4
  31. package/lib/module/index.js.map +1 -1
  32. package/lib/module/models/primer-intent.js.map +1 -1
  33. package/lib/module/models/utils/redirectScheme.js +2 -0
  34. package/lib/module/models/utils/redirectScheme.js.map +1 -0
  35. package/lib/typescript/Primer.d.ts +13 -0
  36. package/lib/typescript/RNPrimer.d.ts +24 -0
  37. package/lib/typescript/index.d.ts +1 -3
  38. package/lib/typescript/models/primer-callbacks.d.ts +7 -9
  39. package/lib/typescript/models/primer-config.d.ts +16 -13
  40. package/lib/typescript/models/primer-intent.d.ts +1 -1
  41. package/lib/typescript/models/primer-request.d.ts +2 -12
  42. package/lib/typescript/models/primer-settings.d.ts +5 -6
  43. package/lib/typescript/models/primer.d.ts +4 -4
  44. package/lib/typescript/models/utils/redirectScheme.d.ts +3 -0
  45. package/package.json +4 -1
  46. package/primer-io-react-native.podspec +2 -3
  47. package/src/Primer.ts +227 -178
  48. package/src/RNPrimer.ts +170 -0
  49. package/src/index.tsx +2 -3
  50. package/src/models/primer-callbacks.ts +9 -27
  51. package/src/models/primer-config.ts +23 -20
  52. package/src/models/primer-intent.ts +1 -1
  53. package/src/models/primer-request.ts +2 -16
  54. package/src/models/primer-settings.ts +5 -6
  55. package/src/models/primer.ts +5 -5
  56. package/src/models/utils/redirectScheme.ts +5 -0
  57. package/android/src/main/java/com/primerioreactnative/PrimerCardNumberEditTextManager.kt +0 -83
  58. package/android/src/main/java/com/primerioreactnative/PrimerHeadlessUniversalCheckout.kt +0 -201
  59. package/android/src/main/java/com/primerioreactnative/huc/assets/AssetsManager.kt +0 -56
  60. package/android/src/main/java/com/primerioreactnative/huc/events/PrimerHeadlessUniversalCheckoutEvent.kt +0 -11
  61. package/android/src/main/java/com/primerioreactnative/huc/extensions/Map.kt +0 -10
  62. package/ios/Core/PrimerRN+PrimerDelegate.swift +0 -148
  63. package/ios/Core/PrimerRN.m +0 -34
  64. package/ios/Core/PrimerRN.swift +0 -168
  65. package/ios/Core/ReactNative-Bridging-Header.h +0 -13
  66. package/ios/Headless Universal Checkout/RNTPrimerCardNumberInputElementManager.m +0 -23
  67. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.m +0 -30
  68. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.swift +0 -241
  69. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.m +0 -14
  70. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.swift +0 -117
  71. package/lib/commonjs/PrimerInput.js +0 -80
  72. package/lib/commonjs/PrimerInput.js.map +0 -1
  73. package/lib/commonjs/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js +0 -14
  74. package/lib/commonjs/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js.map +0 -1
  75. package/lib/commonjs/headless_checkout/NativePrimerHeadlessUniversalCheckout.js +0 -73
  76. package/lib/commonjs/headless_checkout/NativePrimerHeadlessUniversalCheckout.js.map +0 -1
  77. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js +0 -119
  78. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +0 -1
  79. package/lib/commonjs/headless_checkout/types.js +0 -2
  80. package/lib/commonjs/headless_checkout/types.js.map +0 -1
  81. package/lib/module/PrimerInput.js +0 -46
  82. package/lib/module/PrimerInput.js.map +0 -1
  83. package/lib/module/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js +0 -5
  84. package/lib/module/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js.map +0 -1
  85. package/lib/module/headless_checkout/NativePrimerHeadlessUniversalCheckout.js +0 -64
  86. package/lib/module/headless_checkout/NativePrimerHeadlessUniversalCheckout.js.map +0 -1
  87. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js +0 -104
  88. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +0 -1
  89. package/lib/module/headless_checkout/types.js +0 -2
  90. package/lib/module/headless_checkout/types.js.map +0 -1
  91. package/lib/typescript/PrimerInput.d.ts +0 -15
  92. package/lib/typescript/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.d.ts +0 -1
  93. package/lib/typescript/headless_checkout/NativePrimerHeadlessUniversalCheckout.d.ts +0 -10
  94. package/lib/typescript/headless_checkout/PrimerHeadlessUniversalCheckout.d.ts +0 -14
  95. package/lib/typescript/headless_checkout/types.d.ts +0 -16
  96. package/src/PrimerInput.tsx +0 -73
  97. package/src/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.tsx +0 -2
  98. package/src/headless_checkout/NativePrimerHeadlessUniversalCheckout.ts +0 -94
  99. package/src/headless_checkout/PrimerHeadlessUniversalCheckout.ts +0 -136
  100. package/src/headless_checkout/types.ts +0 -18
package/src/Primer.ts CHANGED
@@ -1,203 +1,252 @@
1
- import { NativeModules } from 'react-native';
2
- import type { ClientSessionActionsRequest } from './models/client-session-actions-request';
3
1
  import type { PaymentInstrumentToken } from './models/payment-instrument-token';
4
2
  import type { IPrimer } from './models/primer';
5
- import type {
6
- OnClientSessionActionsCallback,
7
- OnDismissCallback,
8
- OnPrimerErrorCallback,
9
- OnTokenAddedToVaultCallback,
10
- OnTokenizeSuccessCallback,
11
- } from './models/primer-callbacks';
12
- import type { PrimerConfig } from './models/primer-config';
13
- import type { PrimerError } from './models/primer-error';
14
- import type {
15
- PrimerIntent,
16
- PrimerPaymentMethodIntent,
17
- } from './models/primer-intent';
18
- import type { PrimerSettings } from './models/primer-settings';
19
- import type { PrimerTheme } from './models/primer-theme';
20
- import { parseCallback } from './utils';
21
-
22
- const { PrimerRN: NativeModule } = NativeModules;
3
+ import type { IPrimerConfig } from './models/primer-config';
4
+ import type { PrimerPaymentMethodIntent } from './models/primer-intent';
5
+ import type { PrimerResumeHandler } from './models/primer-request';
6
+ import RNPrimer, { IPrimerError } from './RNPrimer';
23
7
 
24
- export const PrimerNativeMapping: IPrimer = {
25
- showUniversalCheckout(token: String, config: PrimerConfig): void {
26
- configureIntent({ vault: false, paymentMethod: 'Any' });
27
- configure(config);
28
- NativeModule.initialize(token);
29
- },
30
-
31
- showVaultManager(token: String, config: PrimerConfig): void {
32
- configureIntent({ vault: true, paymentMethod: 'Any' });
33
- configure(config);
34
- NativeModule.initialize(token);
35
- },
36
-
37
- showPaymentMethod(
38
- token: String,
39
- intent: PrimerPaymentMethodIntent,
40
- config: PrimerConfig
41
- ): void {
42
- configureIntent(intent);
43
- configure(config);
44
- NativeModule.initialize(token);
8
+ const resumeHandler: PrimerResumeHandler = {
9
+ handleNewClientToken: async (clientToken) => {
10
+ try {
11
+ await RNPrimer.handleNewClientToken(clientToken);
12
+ } catch (err) {
13
+ let primerError: IPrimerError;
14
+ if (err instanceof Error) {
15
+ primerError = {
16
+ errorId: "react-native-bridge",
17
+ errorDescription: err.message
18
+ }
19
+ } else {
20
+ primerError = {
21
+ errorId: "react-native-bridge",
22
+ errorDescription: "unknown error"
23
+ }
24
+ }
25
+ await RNPrimer.handleError(primerError);
26
+ }
45
27
  },
46
-
47
- // todo: refactor
48
- // fetchSavedPaymentInstruments(token: String, config: PrimerConfig): void {
49
- // configure(config);
50
- // NativeModule.fetchSavedPaymentInstruments(token);
51
- // },
52
-
53
- dispose(): void {
54
- NativeModule.dispose();
28
+ handleError: async (err) => {
29
+ try {
30
+ const primerError: IPrimerError = {
31
+ errorId: "react-native",
32
+ errorDescription: err.message
33
+ }
34
+ await RNPrimer.handleError(primerError);
35
+ } catch (err) {
36
+ let primerError: IPrimerError;
37
+ if (err instanceof Error) {
38
+ primerError = {
39
+ errorId: "react-native-bridge",
40
+ errorDescription: err.message
41
+ }
42
+ } else {
43
+ primerError = {
44
+ errorId: "react-native-bridge",
45
+ errorDescription: "unknown error"
46
+ }
47
+ }
48
+ await RNPrimer.handleError(primerError);
49
+ }
55
50
  },
56
- };
57
-
58
- //
59
-
60
- function configure(config: PrimerConfig): void {
61
- configureTheme(config.theme);
62
- configureSettings(config.settings);
63
- configureOnVaultSuccess(config.onTokenAddedToVault);
64
- configureOnDismiss(config.onDismiss);
65
- configureOnError(config.onError);
66
- configureOnTokenizeSuccess(config.onTokenizeSuccess);
67
- configureOnClientSessionActions(config.onClientSessionActions);
68
- configureOnResumeSuccess(config.onResumeSuccess);
51
+ handleSuccess: async () => {
52
+ try {
53
+ await RNPrimer.handleSuccess();
54
+ } catch (err) {
55
+ let primerError: IPrimerError;
56
+ if (err instanceof Error) {
57
+ primerError = {
58
+ errorId: "react-native-bridge",
59
+ errorDescription: err.message
60
+ }
61
+ } else {
62
+ primerError = {
63
+ errorId: "react-native-bridge",
64
+ errorDescription: "unknown error"
65
+ }
66
+ }
67
+ await RNPrimer.handleError(primerError);
68
+ }
69
+ }
69
70
  }
70
71
 
71
- function configureSettings(settings: PrimerSettings = {}): void {
72
- const data = JSON.stringify(settings);
73
- NativeModule.configureSettings(data);
72
+ export interface IClientSessionAction {
73
+ type:
74
+ | 'SELECT_PAYMENT_METHOD'
75
+ | 'UNSELECT_PAYMENT_METHOD'
76
+ | 'SET_BILLING_ADDRESS';
77
+ params?: IActionParams;
74
78
  }
75
79
 
76
- function configureTheme(theme: PrimerTheme = {}): void {
77
- const data = JSON.stringify(theme);
78
- NativeModule.configureTheme(data);
80
+ interface IActionParams {
81
+ billingAddress: Record<string, string | null>;
82
+ paymentMethodType?: string;
83
+ binData?: IBinData;
79
84
  }
80
85
 
81
- function configureIntent(
82
- intent: PrimerIntent = { vault: false, paymentMethod: 'Any' }
83
- ): void {
84
- const data = JSON.stringify(intent);
85
- NativeModule.configureIntent(data);
86
+ interface IBinData {
87
+ network: string;
86
88
  }
87
89
 
88
- function resume(request: ResumeRequest) {
89
- const data = JSON.stringify(request);
90
- NativeModule.resume(data);
91
- }
90
+ export const PrimerNativeMapping: IPrimer = {
92
91
 
93
- function configureOnTokenizeSuccess(
94
- callback: OnTokenizeSuccessCallback = (_, __) => {}
95
- ) {
96
- NativeModule.configureOnTokenizeSuccess((data: any) => {
97
- try {
98
- const parsedData = JSON.parse(data) as PaymentInstrumentToken;
99
- callback(parsedData, {
100
- handleError: (error) => resume({ error, token: null }),
101
- handleSuccess: () => resume({ error: null, token: null }),
102
- handleNewClientToken: (token) => resume({ error: null, token }),
103
- // deprecated
104
- resumeWithError: (error) => resume({ error, token: null }),
105
- resumeWithSuccess: (token) => resume({ error: null, token }),
106
- });
107
- } catch (e) {
108
- console.log('failed to parse json', e);
92
+ showUniversalCheckout(clientToken: string, config: IPrimerConfig): void {
93
+ RNPrimer.removeAllListeners();
94
+
95
+ if (config.settings || config.theme) {
96
+ RNPrimer.configure(config.settings || null, config.theme || null);
97
+
98
+ let implementedRNCallbacks: any = {
99
+ // isClientTokenCallbackImplemented: (config.onClientTokenCallback !== undefined),
100
+ isTokenAddedToVaultImplemented: (config.onTokenAddedToVault !== undefined),
101
+ isOnResumeSuccessImplemented: (config.onResumeSuccess !== undefined),
102
+ isOnResumeErrorImplemented: (config.onError !== undefined),
103
+ isOnCheckoutDismissedImplemented: (config.onDismiss !== undefined),
104
+ isCheckoutFailedImplemented: (config.onError !== undefined),
105
+ isClientSessionActionsImplemented: (config.onClientSessionActions !== undefined)
106
+ };
107
+
108
+ RNPrimer.setImplementedRNCallbacks(implementedRNCallbacks)
109
+ .then(() => {
110
+ RNPrimer.addListener('onClientSessionActions', data => {
111
+ const clientSessionActions: IClientSessionAction[] = data;
112
+ if (config.onClientSessionActions) {
113
+ config.onClientSessionActions(clientSessionActions, resumeHandler);
114
+ }
115
+ });
116
+
117
+ RNPrimer.addListener('onTokenizeSuccessCallback', data => {
118
+ const paymentInstrumentToken: PaymentInstrumentToken = data;
119
+ if (config.onTokenizeSuccess) {
120
+ config.onTokenizeSuccess(paymentInstrumentToken, resumeHandler);
121
+ }
122
+ });
123
+
124
+ RNPrimer.addListener('onResumeSuccess', data => {
125
+ const resumeToken: string = data.resumeToken;
126
+ if (config.onResumeSuccess) {
127
+ config.onResumeSuccess(resumeToken, resumeHandler);
128
+ }
129
+ });
130
+
131
+ RNPrimer.addListener('onCheckoutDismissed', _ => {
132
+ if (config.onDismiss) {
133
+ config.onDismiss();
134
+ }
135
+ });
136
+
137
+ RNPrimer.addListener('onError', data => {
138
+ const err: IPrimerError = data.error;
139
+ if (config.onError) {
140
+ config.onError(err, resumeHandler);
141
+ }
142
+ });
143
+
144
+ RNPrimer.showUniversalCheckout(clientToken);
145
+ })
146
+ .catch( err => {
147
+ console.error(err);
148
+ })
149
+ }
150
+
151
+ // RNPrimer.addListener('onClientTokenCallback', _ => {
152
+ // if (config.onClientTokenCallback) {
153
+ // config.onClientTokenCallback(resumeHandler);
154
+ // }
155
+ // });
156
+ },
157
+
158
+ showVaultManager(clientToken: string, config: IPrimerConfig): void {
159
+ RNPrimer.removeAllListeners();
160
+
161
+ if (config.settings || config.theme) {
162
+ RNPrimer.configure(config.settings || null, config.theme || null);
163
+
164
+ let implementedRNCallbacks: any = {
165
+ // isClientTokenCallbackImplemented: (config.onClientTokenCallback !== undefined),
166
+ isTokenAddedToVaultImplemented: (config.onTokenAddedToVault !== undefined),
167
+ isOnResumeSuccessImplemented: (config.onResumeSuccess !== undefined),
168
+ isOnResumeErrorImplemented: (config.onError !== undefined),
169
+ isOnCheckoutDismissedImplemented: (config.onDismiss !== undefined),
170
+ isCheckoutFailedImplemented: (config.onError !== undefined),
171
+ isClientSessionActionsImplemented: (config.onClientSessionActions !== undefined)
172
+ };
173
+
174
+ RNPrimer.setImplementedRNCallbacks(implementedRNCallbacks);
109
175
  }
110
- });
111
- }
112
176
 
113
- function actionResume(request: ResumeRequest) {
114
- const data = JSON.stringify(request);
115
- NativeModule.actionResume(data);
116
- }
177
+ // RNPrimer.addListener('onClientTokenCallback', _ => {
178
+ // if (config.onClientTokenCallback) {
179
+ // config.onClientTokenCallback(resumeHandler);
180
+ // }
181
+ // });
117
182
 
118
- /**
119
- * Call @method configureOnClientSessionActions on the native bridge, passing
120
- * in a callback that the native side will call every time a client session
121
- * action is triggered.
122
- */
123
- function configureOnClientSessionActions(
124
- callback?: OnClientSessionActionsCallback // defined by integrating developer.
125
- ) {
126
- NativeModule.configureOnClientSessionActions((data: any) => {
127
- try {
128
- // parse the client session action JSON string.
129
- const parsedData = JSON.parse(data) as ClientSessionActionsRequest;
130
-
131
- if (!callback) {
132
- /**
133
- * if @param callback is undefined immediately call the native bridge
134
- * and resume with null values. This will resume the SDK flow without
135
- * triggering extra configuration API fetch calls.
136
- */
137
- actionResume({ error: null, token: null });
183
+ RNPrimer.addListener('onClientSessionActions', data => {
184
+ const clientSessionActions: IClientSessionAction[] = data;
185
+ if (config.onClientSessionActions) {
186
+ config.onClientSessionActions(clientSessionActions, resumeHandler);
138
187
  } else {
139
- /**
140
- * send the parsed data back to the developer through the defined callback.
141
- * The developer will determine how to resume the flow using one of the provided
142
- * resume handlers.
143
- */
144
- callback(parsedData, {
145
- handleError: (error) => actionResume({ error, token: null }),
146
- handleSuccess: () => actionResume({ error: null, token: null }),
147
- handleNewClientToken: (token) => actionResume({ error: null, token }),
148
- // deprecated, remove in next major version update.
149
- resumeWithError: (error) => actionResume({ error, token: null }),
150
- resumeWithSuccess: (token) => actionResume({ error: null, token }),
151
- });
188
+ RNPrimer.handleSuccess();
152
189
  }
190
+ });
153
191
 
154
- // reset the client session action callback (native bridge callbacks are disposed once they're invoked).
155
- configureOnClientSessionActions(callback);
156
- } catch (e) {
157
- // log error if the client session action JSON string cannot be parsed (this should never happen!).
158
- console.error('[OnClientSessionActions]', 'failed to parse json', e);
159
- }
160
- });
161
- }
192
+ RNPrimer.addListener('onTokenizeSuccessCallback', data => {
193
+ const paymentInstrumentToken: PaymentInstrumentToken = data;
194
+ if (config.onTokenizeSuccess) {
195
+ config.onTokenizeSuccess(paymentInstrumentToken, resumeHandler);
196
+ }
197
+ });
162
198
 
163
- function configureOnResumeSuccess(
164
- callback: OnTokenizeSuccessCallback = (_, __) => {}
165
- ) {
166
- NativeModule.configureOnResumeSuccess((paymentMethodToken: any) => {
167
- try {
168
- callback(paymentMethodToken, {
169
- handleError: (error) => resume({ error, token: null }),
170
- handleSuccess: () => resume({ error: null, token: null }),
171
- handleNewClientToken: (token) => resume({ error: null, token }),
172
- // deprecated
173
- resumeWithError: (error) => resume({ error, token: null }),
174
- resumeWithSuccess: (token) => resume({ error: null, token }),
175
- });
176
- } catch (e) {
177
- console.log('failed to parse json', e);
178
- }
179
- });
180
- }
199
+ RNPrimer.addListener('onResumeSuccess', data => {
200
+ const resumeToken: string = data.resumeToken;
201
+ if (config.onResumeSuccess) {
202
+ config.onResumeSuccess(resumeToken, resumeHandler);
203
+ }
204
+ });
181
205
 
182
- function configureOnVaultSuccess(
183
- callback: OnTokenAddedToVaultCallback = (_) => {}
184
- ) {
185
- NativeModule.configureOnVaultSuccess((data: any) => {
186
- parseCallback<PaymentInstrumentToken>(data, callback);
187
- });
188
- }
206
+ RNPrimer.addListener('onCheckoutDismissed', () => {
207
+ if (config.onDismiss) {
208
+ config.onDismiss();
209
+ }
210
+ });
189
211
 
190
- function configureOnDismiss(callback: OnDismissCallback = () => {}) {
191
- NativeModule.configureOnDismiss((_: any) => callback());
192
- }
212
+ RNPrimer.addListener('onError', data => {
213
+ const err: IPrimerError = data.error;
214
+ if (config.onError) {
215
+ config.onError(err, resumeHandler);
216
+ }
217
+ });
193
218
 
194
- function configureOnError(callback: OnPrimerErrorCallback = (_) => {}) {
195
- NativeModule.configureOnPrimerError((data: any) => {
196
- parseCallback<PrimerError>(data, callback);
197
- });
198
- }
219
+ RNPrimer.showVaultManager(clientToken);
220
+ },
199
221
 
200
- interface ResumeRequest {
201
- error: string | null;
202
- token: string | null;
203
- }
222
+ showPaymentMethod(
223
+ clientToken: string,
224
+ intent: PrimerPaymentMethodIntent,
225
+ config: IPrimerConfig
226
+ ): void {
227
+ RNPrimer.removeAllListeners();
228
+
229
+ if (config.settings || config.theme) {
230
+ RNPrimer.configure(config.settings || null, config.theme || null);
231
+ }
232
+
233
+ let implementedRNCallbacks: any = {
234
+ // isClientTokenCallbackImplemented: (config.onClientTokenCallback !== undefined),
235
+ isTokenAddedToVaultImplemented: (config.onTokenAddedToVault !== undefined),
236
+ isOnResumeSuccessImplemented: (config.onResumeSuccess !== undefined),
237
+ isOnResumeErrorImplemented: (config.onError !== undefined),
238
+ isOnCheckoutDismissedImplemented: (config.onDismiss !== undefined),
239
+ isCheckoutFailedImplemented: (config.onError !== undefined),
240
+ isClientSessionActionsImplemented: (config.onClientSessionActions !== undefined)
241
+ };
242
+
243
+ RNPrimer.setImplementedRNCallbacks(implementedRNCallbacks);
244
+ RNPrimer.showPaymentMethod(clientToken, intent.paymentMethod, intent.vault === true ? "vault" : "checkout");
245
+ },
246
+
247
+ dispose(): void {
248
+ RNPrimer.removeAllListeners();
249
+ RNPrimer.dispose();
250
+ },
251
+
252
+ };
@@ -0,0 +1,170 @@
1
+ import { NativeEventEmitter, NativeModules } from 'react-native';
2
+ import type { PrimerSettings } from './models/primer-settings';
3
+ import type { PrimerTheme } from './models/primer-theme';
4
+
5
+ const { NativePrimer } = NativeModules;
6
+ const eventEmitter = new NativeEventEmitter(NativePrimer);
7
+
8
+ type EventType =
9
+ | 'onClientTokenCallback'
10
+ | 'onClientSessionActions'
11
+ | 'onTokenizeSuccessCallback'
12
+ | 'onVaultSuccess'
13
+ | 'onResumeSuccess'
14
+ | 'onCheckoutDismissed'
15
+ | 'onError'
16
+ | 'detectImplementedRNCallbacks';
17
+
18
+ export interface IPrimerError {
19
+ errorId: string
20
+ errorDescription?: string
21
+ recoverySuggestion?: string
22
+ }
23
+
24
+ const RNPrimer = {
25
+ ///////////////////////////////////////////
26
+ // Event Emitter
27
+ ///////////////////////////////////////////
28
+ addListener: (eventType: EventType, listener: (...args: any[]) => any) => {
29
+ eventEmitter.addListener(eventType, listener);
30
+ },
31
+
32
+ removeListener: (eventType: EventType, listener: (...args: any[]) => any) => {
33
+ eventEmitter.removeListener(eventType, listener);
34
+ },
35
+
36
+ removeAllListenersForEvent(eventType: EventType) {
37
+ eventEmitter.removeAllListeners(eventType);
38
+ },
39
+
40
+ removeAllListeners() {
41
+ eventEmitter.removeAllListeners('onClientTokenCallback');
42
+ eventEmitter.removeAllListeners('onClientSessionActions');
43
+ eventEmitter.removeAllListeners('onTokenizeSuccessCallback');
44
+ eventEmitter.removeAllListeners('onResumeSuccess');
45
+ eventEmitter.removeAllListeners('onCheckoutDismissed');
46
+ eventEmitter.removeAllListeners('onError');
47
+ eventEmitter.removeAllListeners('detectImplementedRNCallbacks');
48
+ },
49
+
50
+ ///////////////////////////////////////////
51
+ // Native API
52
+ ///////////////////////////////////////////
53
+ configure: (
54
+ settings: PrimerSettings | null,
55
+ theme: PrimerTheme | null
56
+ ): Promise<void> => {
57
+ return new Promise(async (resolve, reject) => {
58
+ try {
59
+ if (settings === null && theme === null) {
60
+ // Do nothing, SDK will use default settings and theme.
61
+ } else if (settings && theme === null) {
62
+ await NativePrimer.configureWithSettings(JSON.stringify(settings));
63
+ } else if (settings === null && theme) {
64
+ await NativePrimer.configureWithTheme(JSON.stringify(theme));
65
+ } else {
66
+ await NativePrimer.configureWithSettings(JSON.stringify(settings));
67
+ await NativePrimer.configureWithTheme(JSON.stringify(theme));
68
+ }
69
+ resolve();
70
+ } catch (err) {
71
+ reject(err);
72
+ }
73
+ });
74
+ },
75
+
76
+ showUniversalCheckout: (clientToken: string | undefined): Promise<void> => {
77
+ return new Promise(async (resolve, reject) => {
78
+ try {
79
+ if (clientToken) {
80
+ await NativePrimer.showUniversalCheckoutWithClientToken(clientToken);
81
+ } else {
82
+ await NativePrimer.showUniversalCheckout();
83
+ }
84
+ resolve();
85
+ } catch (err) {
86
+ reject(err);
87
+ }
88
+ });
89
+ },
90
+
91
+ showVaultManager: (clientToken: string | undefined): Promise<void> => {
92
+ return new Promise(async (resolve, reject) => {
93
+ try {
94
+ if (clientToken) {
95
+ await NativePrimer.showVaultManager(clientToken);
96
+ } else {
97
+ await NativePrimer.showVaultManager();
98
+ }
99
+ resolve();
100
+ } catch (err) {
101
+ reject(err);
102
+ }
103
+ });
104
+ },
105
+
106
+ showPaymentMethod: (
107
+ clientToken: string,
108
+ paymentMethodType: string,
109
+ intent: "checkout" | "vault"
110
+ ): Promise<void> => {
111
+ return new Promise(async (resolve, reject) => {
112
+ try {
113
+ await NativePrimer.showPaymentMethod(clientToken, paymentMethodType, intent);
114
+ resolve();
115
+ } catch (err) {
116
+ reject(err);
117
+ }
118
+ });
119
+ },
120
+
121
+ handleNewClientToken: (clientToken: string | undefined): Promise<void> => {
122
+ return new Promise(async (resolve, reject) => {
123
+ try {
124
+ await NativePrimer.handleNewClientToken(clientToken);
125
+ resolve();
126
+ } catch (err) {
127
+ reject(err);
128
+ }
129
+ });
130
+ },
131
+
132
+ handleError: (err: IPrimerError): Promise<void> => {
133
+ return new Promise(async (resolve, reject) => {
134
+ try {
135
+ await NativePrimer.handleError(JSON.stringify(err));
136
+ resolve();
137
+ } catch (err) {
138
+ reject(err);
139
+ }
140
+ });
141
+ },
142
+
143
+ handleSuccess: (): Promise<void> => {
144
+ return new Promise(async (resolve, reject) => {
145
+ try {
146
+ await NativePrimer.handleSuccess();
147
+ resolve();
148
+ } catch (err) {
149
+ reject(err);
150
+ }
151
+ });
152
+ },
153
+
154
+ setImplementedRNCallbacks: (implementedRNCallbacks: any): Promise<void> => {
155
+ return new Promise(async (resolve, reject) => {
156
+ try {
157
+ await NativePrimer.setImplementedRNCallbacks(JSON.stringify(implementedRNCallbacks));
158
+ resolve();
159
+ } catch (err) {
160
+ reject(err);
161
+ }
162
+ });
163
+ },
164
+
165
+ dispose: (): void => {
166
+
167
+ }
168
+ };
169
+
170
+ export default RNPrimer;
package/src/index.tsx CHANGED
@@ -1,8 +1,7 @@
1
- import PrimerHeadlessUniversalCheckout from './headless_checkout/PrimerHeadlessUniversalCheckout';
2
1
  import type { IPrimer } from './models/primer';
3
2
  import { PrimerNativeMapping } from './Primer';
4
- export * from './PrimerInput';
3
+ // import type { IPrimerConfig as PrimerConfig } from './models/primer-config';
5
4
 
6
5
  const Primer: IPrimer = PrimerNativeMapping;
7
6
 
8
- export { Primer, PrimerHeadlessUniversalCheckout as HeadlessUniversalCheckout };
7
+ export { Primer };
@@ -1,32 +1,14 @@
1
- import type { ActionRequest } from './action-request';
2
- import type { ClientSessionActionsRequest } from './client-session-actions-request';
1
+ import type { IPrimerError } from 'src/RNPrimer';
2
+ import type { IClientSessionAction } from 'src/Primer';
3
3
  import type { PaymentInstrumentToken } from './payment-instrument-token';
4
- import type { PrimerError } from './primer-error';
5
4
  import type { PrimerResumeHandler } from './primer-request';
6
5
 
7
- export type OnTokenizeSuccessCallback = (
8
- req: PaymentInstrumentToken,
9
- completion: PrimerResumeHandler
10
- ) => void;
11
-
12
- export type OnClientSessionActionsCallback = (
13
- req: ClientSessionActionsRequest,
14
- completion: PrimerResumeHandler
15
- ) => void;
16
-
17
- export type OnDataChangeCallback = (
18
- req: ActionRequest,
19
- completion: PrimerResumeHandler
20
- ) => void;
21
-
22
- export type OnTokenAddedToVaultCallback = (
23
- data: PaymentInstrumentToken
24
- ) => void;
6
+ // Not implemented
7
+ // export type OnClientTokenCallback = (resumeHandler: PrimerResumeHandler) => void;
25
8
 
9
+ export type OnClientSessionActionsCallback = (clientSessionActions: IClientSessionAction[], resumeHandler: PrimerResumeHandler | null) => void;
10
+ export type OnTokenizeSuccessCallback = (paymentInstrument: PaymentInstrumentToken, resumeHandler: PrimerResumeHandler) => void;
11
+ export type OnTokenAddedToVaultCallback = (paymentInstrument: PaymentInstrumentToken) => void;
12
+ export type OnResumeCallback = (resumeToken: string, resumeHandler: PrimerResumeHandler | null) => void;
13
+ export type OnPrimerErrorCallback = (err: IPrimerError, resumeHandler: PrimerResumeHandler) => void;
26
14
  export type OnDismissCallback = () => void;
27
-
28
- export type OnPrimerErrorCallback = (data: PrimerError) => void;
29
-
30
- export type OnSavedPaymentInstrumentsFetchedCallback = (
31
- data: PaymentInstrumentToken[]
32
- ) => void;