@primer-io/react-native 2.0.0 → 2.1.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 (92) hide show
  1. package/android/build.gradle +1 -1
  2. package/android/src/main/java/com/primerioreactnative/PrimerCardNumberEditTextManager.kt +83 -0
  3. package/android/src/main/java/com/primerioreactnative/PrimerRN.kt +2 -2
  4. package/android/src/main/java/com/primerioreactnative/PrimerRNHeadlessUniversalCheckout.kt +244 -0
  5. package/android/src/main/java/com/primerioreactnative/PrimerRNHeadlessUniversalCheckoutListener.kt +276 -0
  6. package/android/src/main/java/com/primerioreactnative/ReactNativePackage.kt +14 -3
  7. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerErrorRN.kt +3 -0
  8. package/android/src/main/java/com/primerioreactnative/huc/assets/AssetsManager.kt +56 -0
  9. package/android/src/main/java/com/primerioreactnative/huc/events/PrimerHeadlessUniversalCheckoutEvent.kt +15 -0
  10. package/android/src/main/java/com/primerioreactnative/utils/PrimerHeadlessUniversalCheckoutImplementedRNCallbacks.kt +31 -0
  11. package/ios/Core/ReactNative-Bridging-Header.h +14 -0
  12. package/ios/DataModels/ImplementedRNCallbacks.swift +34 -9
  13. package/ios/DataModels/PrimerSettingsRN.swift +15 -16
  14. package/ios/Headless Universal Checkout/RNTPrimerCardNumberInputElementManager.m +23 -0
  15. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.m +62 -0
  16. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.swift +493 -0
  17. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.m +14 -0
  18. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.swift +117 -0
  19. package/ios/RNTPrimer.m +2 -0
  20. package/ios/RNTPrimer.swift +56 -51
  21. package/ios/ReactNative-Bridging-Header.h +1 -0
  22. package/lib/commonjs/Primer.js +6 -0
  23. package/lib/commonjs/Primer.js.map +1 -1
  24. package/lib/commonjs/PrimerInput.js +80 -0
  25. package/lib/commonjs/PrimerInput.js.map +1 -0
  26. package/lib/commonjs/RNPrimer.js +11 -0
  27. package/lib/commonjs/RNPrimer.js.map +1 -1
  28. package/lib/commonjs/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js +14 -0
  29. package/lib/commonjs/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js.map +1 -0
  30. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js +286 -0
  31. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +1 -0
  32. package/lib/commonjs/headless_checkout/RNPrimerHeadlessUniversalCheckout.js +197 -0
  33. package/lib/commonjs/headless_checkout/RNPrimerHeadlessUniversalCheckout.js.map +1 -0
  34. package/lib/commonjs/{models/Primer.js → headless_checkout/types.js} +1 -1
  35. package/lib/commonjs/{models/Primer.js.map → headless_checkout/types.js.map} +0 -0
  36. package/lib/commonjs/index.js +13 -5
  37. package/lib/commonjs/index.js.map +1 -1
  38. package/lib/commonjs/models/PrimerInterfaces.js +6 -0
  39. package/lib/{module/models/Primer.js.map → commonjs/models/PrimerInterfaces.js.map} +0 -0
  40. package/lib/module/Primer.js +7 -2
  41. package/lib/module/Primer.js.map +1 -1
  42. package/lib/module/PrimerInput.js +46 -0
  43. package/lib/module/PrimerInput.js.map +1 -0
  44. package/lib/module/RNPrimer.js +11 -0
  45. package/lib/module/RNPrimer.js.map +1 -1
  46. package/lib/module/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js +5 -0
  47. package/lib/module/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js.map +1 -0
  48. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js +273 -0
  49. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +1 -0
  50. package/lib/module/headless_checkout/RNPrimerHeadlessUniversalCheckout.js +188 -0
  51. package/lib/module/headless_checkout/RNPrimerHeadlessUniversalCheckout.js.map +1 -0
  52. package/lib/module/headless_checkout/types.js +2 -0
  53. package/lib/module/headless_checkout/types.js.map +1 -0
  54. package/lib/module/index.js +2 -1
  55. package/lib/module/index.js.map +1 -1
  56. package/lib/module/models/PrimerInterfaces.js +2 -0
  57. package/lib/module/models/PrimerInterfaces.js.map +1 -0
  58. package/lib/typescript/MerchantExample/App.d.ts +11 -0
  59. package/lib/typescript/src/Primer.d.ts +2 -0
  60. package/lib/typescript/src/PrimerInput.d.ts +15 -0
  61. package/lib/typescript/{RNPrimer.d.ts → src/RNPrimer.d.ts} +1 -0
  62. package/lib/typescript/src/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.d.ts +1 -0
  63. package/lib/typescript/src/headless_checkout/PrimerHeadlessUniversalCheckout.d.ts +11 -0
  64. package/lib/typescript/src/headless_checkout/RNPrimerHeadlessUniversalCheckout.d.ts +22 -0
  65. package/lib/typescript/src/headless_checkout/types.d.ts +22 -0
  66. package/lib/typescript/{index.d.ts → src/index.d.ts} +2 -1
  67. package/lib/typescript/{models → src/models}/PrimerCheckoutData.d.ts +0 -0
  68. package/lib/typescript/{models → src/models}/PrimerCheckoutPaymentMethodData.d.ts +0 -0
  69. package/lib/typescript/{models → src/models}/PrimerClientSession.d.ts +0 -0
  70. package/lib/typescript/{models → src/models}/PrimerCountryCode.d.ts +0 -0
  71. package/lib/typescript/{models → src/models}/PrimerCurrencyCode.d.ts +0 -0
  72. package/lib/typescript/{models → src/models}/PrimerError.d.ts +0 -0
  73. package/lib/typescript/{models/Primer.d.ts → src/models/PrimerInterfaces.d.ts} +2 -1
  74. package/lib/typescript/{models → src/models}/PrimerPaymentMethodTokenData.d.ts +0 -0
  75. package/lib/typescript/{models → src/models}/PrimerSessionIntent.d.ts +0 -0
  76. package/lib/typescript/{models → src/models}/PrimerSettings.d.ts +6 -2
  77. package/lib/typescript/{models → src/models}/PrimerTheme.d.ts +0 -0
  78. package/lib/typescript/{utils → src/utils}/index.d.ts +0 -0
  79. package/package.json +1 -1
  80. package/primer-io-react-native.podspec +1 -1
  81. package/src/Primer.ts +6 -1
  82. package/src/PrimerInput.tsx +73 -0
  83. package/src/RNPrimer.ts +13 -0
  84. package/src/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.tsx +2 -0
  85. package/src/headless_checkout/PrimerHeadlessUniversalCheckout.ts +327 -0
  86. package/src/headless_checkout/RNPrimerHeadlessUniversalCheckout.ts +252 -0
  87. package/src/headless_checkout/types.ts +32 -0
  88. package/src/index.tsx +4 -2
  89. package/src/models/{Primer.ts → PrimerInterfaces.ts} +2 -1
  90. package/src/models/PrimerSettings.ts +17 -2
  91. package/lib/module/models/Primer.js +0 -2
  92. package/lib/typescript/Primer.d.ts +0 -2
@@ -0,0 +1,327 @@
1
+ import RNPrimerHeadlessUniversalCheckout from './RNPrimerHeadlessUniversalCheckout';
2
+ import type { PrimerCheckoutData } from '../models/PrimerCheckoutData';
3
+ import type { PrimerCheckoutPaymentMethodData } from '../models/PrimerCheckoutPaymentMethodData';
4
+ import type { PrimerTokenizationHandler, PrimerResumeHandler, PrimerPaymentCreationHandler } from '../models/PrimerInterfaces';
5
+ import type { PrimerHeadlessUniversalCheckoutStartResponse } from './types';
6
+ import type { PrimerSettings } from '../models/PrimerSettings';
7
+ import type { PrimerClientSession } from '../models/PrimerClientSession';
8
+ import { PrimerError } from '../models/PrimerError';
9
+ import type { PrimerPaymentMethodTokenData } from '../models/PrimerPaymentMethodTokenData';
10
+
11
+ ///////////////////////////////////////////
12
+ // DECISION HANDLERS
13
+ ///////////////////////////////////////////
14
+
15
+ // Tokenization Handler
16
+
17
+ const tokenizationHandler: PrimerTokenizationHandler = {
18
+ handleFailure: async (errorMessage: string) => {
19
+ try {
20
+ RNPrimerHeadlessUniversalCheckout.handleTokenizationFailure(errorMessage);
21
+ } catch (err) {
22
+ console.error(err);
23
+ }
24
+ },
25
+
26
+ handleSuccess: async () => {
27
+ try {
28
+ RNPrimerHeadlessUniversalCheckout.handleTokenizationSuccess();
29
+ } catch (err) {
30
+ console.error(err);
31
+ }
32
+ },
33
+
34
+ continueWithNewClientToken: async (newClientToken: string) => {
35
+ try {
36
+ RNPrimerHeadlessUniversalCheckout.handleTokenizationNewClientToken(newClientToken);
37
+ } catch (err) {
38
+ console.error(err);
39
+ }
40
+ }
41
+ }
42
+
43
+ // Resume Handler
44
+
45
+ const resumeHandler: PrimerResumeHandler = {
46
+ handleFailure: async (errorMessage: string) => {
47
+ try {
48
+ RNPrimerHeadlessUniversalCheckout.handleResumeFailure(errorMessage);
49
+ } catch (err) {
50
+ console.error(err);
51
+ }
52
+ },
53
+
54
+ handleSuccess: async () => {
55
+ try {
56
+ RNPrimerHeadlessUniversalCheckout.handleResumeSuccess();
57
+ } catch (err) {
58
+ console.error(err);
59
+ }
60
+ },
61
+
62
+ continueWithNewClientToken: async (newClientToken: string) => {
63
+ try {
64
+ RNPrimerHeadlessUniversalCheckout.handleResumeWithNewClientToken(newClientToken);
65
+ } catch (err) {
66
+ console.error(err);
67
+ }
68
+ }
69
+ }
70
+
71
+ // Payment Creation Handler
72
+
73
+ const paymentCreationHandler: PrimerPaymentCreationHandler = {
74
+ abortPaymentCreation: async (errorMessage: string) => {
75
+ try {
76
+ RNPrimerHeadlessUniversalCheckout.handlePaymentCreationAbort(errorMessage);
77
+ } catch (err) {
78
+ console.error(err);
79
+ }
80
+ },
81
+
82
+ continuePaymentCreation: async () => {
83
+ try {
84
+ RNPrimerHeadlessUniversalCheckout.handlePaymentCreationContinue();
85
+ } catch (err) {
86
+ console.error(err);
87
+ }
88
+ }
89
+ }
90
+
91
+ let primerSettings: PrimerSettings | undefined = undefined;
92
+
93
+ async function configureListeners(): Promise<void> {
94
+ return new Promise(async (resolve, reject) => {
95
+ try {
96
+ RNPrimerHeadlessUniversalCheckout.removeAllListeners();
97
+
98
+ let implementedRNCallbacks: any = {
99
+ onCheckoutComplete: (primerSettings?.onCheckoutComplete !== undefined),
100
+ onBeforePaymentCreate: (primerSettings?.onBeforePaymentCreate !== undefined),
101
+ onBeforeClientSessionUpdate: (primerSettings?.onBeforeClientSessionUpdate !== undefined),
102
+ onClientSessionUpdate: (primerSettings?.onClientSessionUpdate !== undefined),
103
+ onTokenizeSuccess: (primerSettings?.onTokenizeSuccess !== undefined),
104
+ onResumeSuccess: (primerSettings?.onResumeSuccess !== undefined),
105
+ onDismiss: false,
106
+ onError: (primerSettings?.onError !== undefined),
107
+ onHUCAvailablePaymentMethodsLoaded: (primerSettings?.onAvailablePaymentMethodsLoad !== undefined),
108
+ onHUCPrepareStart: (primerSettings?.onPrepareStart !== undefined),
109
+ onHUCTokenizeStart: (primerSettings?.onTokenizeStart !== undefined),
110
+ onHUCPaymentMethodShow: (primerSettings?.onPaymentMethodShow !== undefined),
111
+ };
112
+
113
+ await RNPrimerHeadlessUniversalCheckout.setImplementedRNCallbacks(implementedRNCallbacks);
114
+
115
+ if (implementedRNCallbacks.onCheckoutComplete) {
116
+ RNPrimerHeadlessUniversalCheckout.addListener(
117
+ 'onCheckoutComplete',
118
+ (data) => {
119
+ console.log('onCheckoutComplete');
120
+ if (primerSettings && primerSettings.onCheckoutComplete) {
121
+ const checkoutData: PrimerCheckoutData = data;
122
+ primerSettings.onCheckoutComplete(checkoutData);
123
+ } else {
124
+ // Ignore!
125
+ }
126
+ }
127
+ );
128
+ }
129
+
130
+ if (implementedRNCallbacks.onHUCPrepareStart) {
131
+ RNPrimerHeadlessUniversalCheckout.addListener(
132
+ 'onHUCPrepareStart',
133
+ (data) => {
134
+ console.log('onHUCPrepareStart');
135
+ if (primerSettings && primerSettings.onPrepareStart) {
136
+ primerSettings.onPrepareStart(data.paymentMethodType || 'not implemented');
137
+ } else {
138
+ // Ignore!
139
+ }
140
+ }
141
+ );
142
+ }
143
+
144
+ if (implementedRNCallbacks.onHUCTokenizeStart) {
145
+ RNPrimerHeadlessUniversalCheckout.addListener(
146
+ 'onHUCTokenizeStart',
147
+ (data) => {
148
+ console.log('onHUCTokenizeStart');
149
+ if (primerSettings && primerSettings.onTokenizeStart) {
150
+ primerSettings.onTokenizeStart(data.paymentMethodType || 'not implemented');
151
+ } else {
152
+ // Ignore!
153
+ }
154
+ }
155
+ );
156
+ }
157
+
158
+ if (implementedRNCallbacks.onHUCPaymentMethodShow) {
159
+ RNPrimerHeadlessUniversalCheckout.addListener(
160
+ 'onHUCPaymentMethodShow',
161
+ (data) => {
162
+ console.log('onHUCPaymentMethodShow');
163
+ if (primerSettings && primerSettings.onPaymentMethodShow) {
164
+ primerSettings.onPaymentMethodShow(data.paymentMethodType || 'not implemented');
165
+ } else {
166
+ // Ignore!
167
+ }
168
+ }
169
+ );
170
+ }
171
+
172
+ if (implementedRNCallbacks.onHUCAvailablePaymentMethodsLoaded) {
173
+ RNPrimerHeadlessUniversalCheckout.addListener(
174
+ 'onHUCAvailablePaymentMethodsLoaded',
175
+ (data) => {
176
+ console.log('onHUCAvailablePaymentMethodsLoaded');
177
+ if (primerSettings && primerSettings.onAvailablePaymentMethodsLoad) {
178
+ if (data && data.paymentMethodTypes) {
179
+ const paymentMethodTypes: string[] = data.paymentMethodTypes;
180
+ const availablePaymentMethodTypes = paymentMethodTypes.filter(pmt => pmt !== 'PAYMENT_CARD');
181
+ primerSettings.onAvailablePaymentMethodsLoad(availablePaymentMethodTypes || ['not implemented']);
182
+ } else {
183
+ primerSettings.onAvailablePaymentMethodsLoad(['not implemented']);
184
+ }
185
+
186
+ } else {
187
+ // Ignore!
188
+ }
189
+ }
190
+ );
191
+ }
192
+
193
+ if (implementedRNCallbacks.onBeforePaymentCreate) {
194
+ RNPrimerHeadlessUniversalCheckout.addListener('onBeforePaymentCreate', data => {
195
+ if (primerSettings && primerSettings.onBeforePaymentCreate) {
196
+ const checkoutPaymentMethodData: PrimerCheckoutPaymentMethodData = data;
197
+ primerSettings.onBeforePaymentCreate(checkoutPaymentMethodData, paymentCreationHandler);
198
+ }
199
+ });
200
+ }
201
+
202
+ if (implementedRNCallbacks.onBeforeClientSessionUpdate) {
203
+ RNPrimerHeadlessUniversalCheckout.addListener('onBeforeClientSessionUpdate', _ => {
204
+ if (primerSettings && primerSettings.onBeforeClientSessionUpdate) {
205
+ primerSettings.onBeforeClientSessionUpdate();
206
+ }
207
+ });
208
+ }
209
+
210
+ if (implementedRNCallbacks.onClientSessionUpdate) {
211
+ RNPrimerHeadlessUniversalCheckout.addListener('onClientSessionUpdate', data => {
212
+ if (primerSettings && primerSettings.onClientSessionUpdate) {
213
+ const clientSession: PrimerClientSession = data;
214
+ primerSettings.onClientSessionUpdate(clientSession);
215
+ }
216
+ });
217
+ }
218
+
219
+ if (implementedRNCallbacks.onTokenizeSuccess) {
220
+ RNPrimerHeadlessUniversalCheckout.addListener('onTokenizeSuccess', data => {
221
+ if (primerSettings && primerSettings.onTokenizeSuccess) {
222
+ const paymentMethodTokenData: PrimerPaymentMethodTokenData = data;
223
+ primerSettings.onTokenizeSuccess(paymentMethodTokenData, tokenizationHandler);
224
+ }
225
+ });
226
+ }
227
+
228
+ if (implementedRNCallbacks.onResumeSuccess) {
229
+ RNPrimerHeadlessUniversalCheckout.addListener('onResumeSuccess', data => {
230
+ if (primerSettings && primerSettings.onResumeSuccess && data.resumeToken) {
231
+ primerSettings.onResumeSuccess(data.resumeToken, resumeHandler);
232
+ }
233
+ });
234
+ }
235
+
236
+ if (implementedRNCallbacks.onError) {
237
+ RNPrimerHeadlessUniversalCheckout.addListener('onError', data => {
238
+ if (data && data.error && data.error.errorId && primerSettings && primerSettings.onError) {
239
+ const errorId: string = data.error.errorId;
240
+ const description: string | undefined = data.error.description;
241
+ const recoverySuggestion: string | undefined = data.error.recoverySuggestion;
242
+ const primerError = new PrimerError(errorId, description || 'Unknown error', recoverySuggestion);
243
+
244
+ if (data.checkoutData) {
245
+ primerSettings.onError(primerError, data.checkoutData, undefined);
246
+ } else {
247
+ primerSettings.onError(primerError, null, undefined);
248
+ }
249
+ }
250
+ });
251
+ }
252
+
253
+ resolve();
254
+
255
+ } catch (err) {
256
+ reject(err);
257
+ }
258
+ });
259
+ }
260
+
261
+ class PrimerHeadlessUniversalCheckoutClass {
262
+
263
+ ///////////////////////////////////////////
264
+ // Init
265
+ ///////////////////////////////////////////
266
+ constructor() {
267
+
268
+ }
269
+
270
+ ///////////////////////////////////////////
271
+ // API
272
+ ///////////////////////////////////////////
273
+ startWithClientToken(
274
+ clientToken: string,
275
+ settings: PrimerSettings
276
+ ): Promise<string[]> {
277
+ primerSettings = settings;
278
+
279
+ return new Promise(async (resolve, reject) => {
280
+ try {
281
+ await configureListeners();
282
+ const hucResponse: PrimerHeadlessUniversalCheckoutStartResponse = await RNPrimerHeadlessUniversalCheckout.startWithClientToken(clientToken, settings);
283
+ const availablePaymentMethodTypes: string[] = hucResponse.paymentMethodTypes.filter(pmt => pmt !== 'PAYMENT_CARD');
284
+ resolve(availablePaymentMethodTypes);
285
+ } catch (err) {
286
+ reject(err);
287
+ }
288
+ });
289
+ }
290
+
291
+ async showPaymentMethod(paymentMethodType: string): Promise<void> {
292
+ return new Promise(async (resolve, reject) => {
293
+ try {
294
+ await RNPrimerHeadlessUniversalCheckout.showPaymentMethod(paymentMethodType);
295
+ resolve();
296
+ } catch (err) {
297
+ reject(err);
298
+ }
299
+ });
300
+ }
301
+
302
+ getAssetForPaymentMethodType(
303
+ paymentMethodType: string,
304
+ assetType: 'logo' | 'icon'
305
+ ): Promise<string> {
306
+ return RNPrimerHeadlessUniversalCheckout.getAssetForPaymentMethodType(
307
+ paymentMethodType,
308
+ assetType
309
+ );
310
+ }
311
+
312
+ getAssetForCardNetwork(
313
+ cardNetwork: string,
314
+ assetType: 'logo' | 'icon'
315
+ ): Promise<string> {
316
+ return RNPrimerHeadlessUniversalCheckout.getAssetForCardNetwork(
317
+ cardNetwork,
318
+ assetType
319
+ );
320
+ }
321
+
322
+ disposePrimerHeadlessUniversalCheckout(): Promise<void> {
323
+ return RNPrimerHeadlessUniversalCheckout.disposePrimerHeadlessUniversalCheckout();
324
+ }
325
+ }
326
+
327
+ export const PrimerHeadlessUniversalCheckout = new PrimerHeadlessUniversalCheckoutClass();
@@ -0,0 +1,252 @@
1
+ import { NativeEventEmitter, NativeModules } from 'react-native';
2
+
3
+ const { PrimerHeadlessUniversalCheckout } = NativeModules;
4
+
5
+ const eventEmitter = new NativeEventEmitter(PrimerHeadlessUniversalCheckout);
6
+
7
+ type EventType =
8
+ | 'onHUCTokenizeStart'
9
+ | 'onHUCPrepareStart'
10
+ | 'onHUCAvailablePaymentMethodsLoaded'
11
+ | 'onHUCPaymentMethodShow'
12
+ | 'onTokenizeSuccess'
13
+ | 'onResumeSuccess'
14
+ | 'onBeforePaymentCreate'
15
+ | 'onBeforeClientSessionUpdate'
16
+ | 'onClientSessionUpdate'
17
+ | 'onCheckoutComplete'
18
+ | 'onError';
19
+
20
+ const eventTypes: EventType[] = [
21
+ 'onHUCTokenizeStart',
22
+ 'onHUCPrepareStart',
23
+ 'onHUCAvailablePaymentMethodsLoaded',
24
+ 'onHUCPaymentMethodShow',
25
+ 'onTokenizeSuccess',
26
+ 'onResumeSuccess',
27
+ 'onBeforePaymentCreate',
28
+ 'onBeforeClientSessionUpdate',
29
+ 'onClientSessionUpdate',
30
+ 'onCheckoutComplete',
31
+ 'onError'
32
+ ];
33
+
34
+ const RNPrimerHeadlessUniversalCheckout = {
35
+ ///////////////////////////////////////////
36
+ // Event Emitter
37
+ ///////////////////////////////////////////
38
+ addListener: (eventType: EventType, listener: (...args: any[]) => any) => {
39
+ eventEmitter.addListener(eventType, listener);
40
+ },
41
+
42
+ removeListener: (eventType: EventType, listener: (...args: any[]) => any) => {
43
+ eventEmitter.removeListener(eventType, listener);
44
+ },
45
+
46
+ removeAllListenersForEvent(eventType: EventType) {
47
+ eventEmitter.removeAllListeners(eventType);
48
+ },
49
+
50
+ removeAllListeners() {
51
+ eventTypes.forEach((eventType) => RNPrimerHeadlessUniversalCheckout.removeAllListenersForEvent(eventType));
52
+ },
53
+
54
+ ///////////////////////////////////////////
55
+ // Native API
56
+ ///////////////////////////////////////////
57
+ getAssetForPaymentMethodType: (
58
+ paymentMethodType: string,
59
+ assetType: 'logo' | 'icon'
60
+ ): Promise<string> => {
61
+ return new Promise((resolve, reject) => {
62
+ try {
63
+ PrimerHeadlessUniversalCheckout.getAssetForPaymentMethodType(
64
+ paymentMethodType,
65
+ assetType,
66
+ (err: Error) => {
67
+ reject(err);
68
+ },
69
+ (url: string) => {
70
+ resolve(url);
71
+ }
72
+ );
73
+ } catch (e) {
74
+ reject(e);
75
+ }
76
+ });
77
+ },
78
+
79
+ getAssetForCardNetwork: (
80
+ cardNetwork: string,
81
+ assetType: 'logo' | 'icon'
82
+ ): Promise<string> => {
83
+ return new Promise((resolve, reject) => {
84
+ try {
85
+ PrimerHeadlessUniversalCheckout.getAssetForPaymentMethodType(
86
+ cardNetwork,
87
+ assetType,
88
+ (err: Error) => {
89
+ reject(err);
90
+ },
91
+ (url: string) => {
92
+ resolve(url);
93
+ }
94
+ );
95
+ } catch (e) {
96
+ reject(e);
97
+ }
98
+ });
99
+ },
100
+
101
+ startWithClientToken(clientToken: string, settings: any): Promise<any> {
102
+ return new Promise((resolve, reject) => {
103
+ PrimerHeadlessUniversalCheckout.startWithClientToken(
104
+ clientToken,
105
+ JSON.stringify(settings),
106
+ (err: Error) => {
107
+ console.error(err);
108
+ reject(err);
109
+ },
110
+ (paymentMethodTypes: string[]) => {
111
+ resolve({ paymentMethodTypes });
112
+ }
113
+ );
114
+ });
115
+ },
116
+
117
+ showPaymentMethod: (paymentMethodType: string): Promise<void> => {
118
+ return new Promise(async (resolve, reject) => {
119
+ try {
120
+ await PrimerHeadlessUniversalCheckout.showPaymentMethod(paymentMethodType);
121
+ resolve();
122
+ } catch (err) {
123
+ reject(err);
124
+ }
125
+ });
126
+ },
127
+
128
+ ///////////////////////////////////////////
129
+ // DECISION HANDLERS
130
+ ///////////////////////////////////////////
131
+
132
+ // Tokenization Handlers
133
+
134
+ handleTokenizationNewClientToken: (newClientToken: string): Promise<void> => {
135
+ return new Promise(async (resolve, reject) => {
136
+ try {
137
+ await PrimerHeadlessUniversalCheckout.handleTokenizationNewClientToken(newClientToken);
138
+ resolve();
139
+ } catch (err) {
140
+ reject(err);
141
+ }
142
+ });
143
+ },
144
+
145
+ handleTokenizationSuccess: (): Promise<void> => {
146
+ return new Promise(async (resolve, reject) => {
147
+ try {
148
+ await PrimerHeadlessUniversalCheckout.handleTokenizationSuccess();
149
+ resolve();
150
+ } catch (err) {
151
+ reject(err);
152
+ }
153
+ });
154
+ },
155
+
156
+ handleTokenizationFailure: (errorMessage: string | null): Promise<void> => {
157
+ return new Promise(async (resolve, reject) => {
158
+ try {
159
+ await PrimerHeadlessUniversalCheckout.handleTokenizationFailure(errorMessage || "");
160
+ resolve();
161
+ } catch (err) {
162
+ reject(err);
163
+ }
164
+ });
165
+ },
166
+
167
+ // Resume Handlers
168
+
169
+ handleResumeWithNewClientToken: (newClientToken: string): Promise<void> => {
170
+ return new Promise(async (resolve, reject) => {
171
+ try {
172
+ await PrimerHeadlessUniversalCheckout.handleResumeWithNewClientToken(newClientToken);
173
+ resolve();
174
+ } catch (err) {
175
+ reject(err);
176
+ }
177
+ });
178
+ },
179
+
180
+ handleResumeSuccess: (): Promise<void> => {
181
+ return new Promise(async (resolve, reject) => {
182
+ try {
183
+ await PrimerHeadlessUniversalCheckout.handleResumeSuccess();
184
+ resolve();
185
+ } catch (err) {
186
+ reject(err);
187
+ }
188
+ });
189
+ },
190
+
191
+ handleResumeFailure: (errorMessage: string | null): Promise<void> => {
192
+ return new Promise(async (resolve, reject) => {
193
+ try {
194
+ await PrimerHeadlessUniversalCheckout.handleTokenizationFailure(errorMessage || "");
195
+ resolve();
196
+ } catch (err) {
197
+ reject(err);
198
+ }
199
+ });
200
+ },
201
+
202
+ // Payment Creation Handlers
203
+
204
+ handlePaymentCreationAbort: (errorMessage: string | null): Promise<void> => {
205
+ return new Promise(async (resolve, reject) => {
206
+ try {
207
+ await PrimerHeadlessUniversalCheckout.handlePaymentCreationAbort(errorMessage || "");
208
+ resolve();
209
+ } catch (err) {
210
+ reject(err);
211
+ }
212
+ });
213
+ },
214
+
215
+ handlePaymentCreationContinue: (): Promise<void> => {
216
+ return new Promise(async (resolve, reject) => {
217
+ try {
218
+ await PrimerHeadlessUniversalCheckout.handlePaymentCreationContinue();
219
+ resolve();
220
+ } catch (err) {
221
+ reject(err);
222
+ }
223
+ });
224
+ },
225
+
226
+ // HELPERS
227
+
228
+ setImplementedRNCallbacks: (implementedRNCallbacks: any): Promise<void> => {
229
+ return new Promise(async (resolve, reject) => {
230
+ try {
231
+ await PrimerHeadlessUniversalCheckout.setImplementedRNCallbacks(JSON.stringify(implementedRNCallbacks));
232
+ resolve();
233
+ } catch (err) {
234
+ reject(err);
235
+ }
236
+ });
237
+ },
238
+
239
+
240
+ disposePrimerHeadlessUniversalCheckout: (): Promise<void> => {
241
+ return new Promise(async (resolve, reject) => {
242
+ try {
243
+ await PrimerHeadlessUniversalCheckout.disposePrimerHeadlessUniversalCheckout();
244
+ resolve();
245
+ } catch (err) {
246
+ reject(err);
247
+ }
248
+ });
249
+ },
250
+ };
251
+
252
+ export default RNPrimerHeadlessUniversalCheckout;
@@ -0,0 +1,32 @@
1
+ import type { PrimerCheckoutData } from '../models/PrimerCheckoutData';
2
+ import type { PrimerCheckoutPaymentMethodData } from '../models/PrimerCheckoutPaymentMethodData';
3
+ import type {
4
+ PrimerTokenizationHandler,
5
+ PrimerResumeHandler,
6
+ PrimerPaymentCreationHandler,
7
+ PrimerErrorHandler
8
+ } from '../models/PrimerInterfaces';
9
+ import type { PrimerClientSession } from '../models/PrimerClientSession';
10
+ import type { PrimerPaymentMethodTokenData } from '../models/PrimerPaymentMethodTokenData';
11
+ import type { PrimerError } from '../models/PrimerError';
12
+
13
+ export interface PrimerHeadlessUniversalCheckoutStartResponse {
14
+ paymentMethodTypes: string[];
15
+ }
16
+
17
+ export interface PrimerHeadlessUniversalCheckoutCallbacks {
18
+ // Common
19
+ onBeforeClientSessionUpdate?: () => void;
20
+ onClientSessionUpdate?: (clientSession: PrimerClientSession) => void;
21
+ onBeforePaymentCreate?: (checkoutPaymentMethodData: PrimerCheckoutPaymentMethodData, handler: PrimerPaymentCreationHandler) => void;
22
+ onCheckoutComplete?: (checkoutData: PrimerCheckoutData) => void;
23
+ onTokenizeSuccess?: (paymentMethodTokenData: PrimerPaymentMethodTokenData, handler: PrimerTokenizationHandler) => void;
24
+ onResumeSuccess?: (resumeToken: string, handler: PrimerResumeHandler) => void;
25
+ onError?: (error: PrimerError, checkoutData: PrimerCheckoutData | null, handler: PrimerErrorHandler | undefined) => void;
26
+
27
+ // Only on HUC
28
+ onPrepareStart?: (paymentMethodType: string) => void;
29
+ onTokenizeStart?: (paymentMethodType: string) => void;
30
+ onPaymentMethodShow?: (paymentMethodType: string) => void;
31
+ onAvailablePaymentMethodTypesLoad?: (paymentMethodTypes: string[]) => void;
32
+ }
package/src/index.tsx CHANGED
@@ -1,4 +1,3 @@
1
-
2
1
  export {
3
2
  Primer
4
3
  } from './Primer';
@@ -13,7 +12,7 @@ export {
13
12
  PrimerTokenizationHandler,
14
13
  PrimerResumeHandler,
15
14
  PrimerErrorHandler,
16
- } from './models/Primer';
15
+ } from './models/PrimerInterfaces';
17
16
  export { PrimerPaymentMethodTokenData } from './models/PrimerPaymentMethodTokenData';
18
17
  export {
19
18
  PrimerClientSession,
@@ -32,3 +31,6 @@ export {
32
31
  export {
33
32
  PrimerError
34
33
  } from './models/PrimerError';
34
+ export {
35
+ PrimerHeadlessUniversalCheckout
36
+ } from './headless_checkout/PrimerHeadlessUniversalCheckout';
@@ -1,7 +1,7 @@
1
1
  import type { PrimerSessionIntent } from "./PrimerSessionIntent";
2
2
  import type { PrimerSettings } from "./PrimerSettings";
3
3
 
4
- export interface Primer {
4
+ export interface IPrimer {
5
5
  configure(settings: PrimerSettings): Promise<void>;
6
6
  showUniversalCheckout(clientToken: string): Promise<void>;
7
7
  showVaultManager(clientToken: string): Promise<void>;
@@ -11,6 +11,7 @@ export interface Primer {
11
11
  clientToken: string
12
12
  ): Promise<void>
13
13
  dismiss(): void;
14
+ dispose(): void;
14
15
  }
15
16
 
16
17
  export interface PrimerPaymentCreationHandler {
@@ -1,4 +1,9 @@
1
- import type { PrimerErrorHandler, PrimerPaymentCreationHandler, PrimerResumeHandler, PrimerTokenizationHandler } from "./Primer";
1
+ import type {
2
+ PrimerErrorHandler,
3
+ PrimerPaymentCreationHandler,
4
+ PrimerResumeHandler,
5
+ PrimerTokenizationHandler
6
+ } from "./PrimerInterfaces";
2
7
  import type { PrimerCheckoutData } from "./PrimerCheckoutData";
3
8
  import type { PrimerCheckoutPaymentMethodData } from "./PrimerCheckoutPaymentMethodData";
4
9
  import type { PrimerClientSession } from "./PrimerClientSession";
@@ -15,14 +20,24 @@ interface IPrimerSettings {
15
20
  uiOptions?: IPrimerUIOptions;
16
21
  debugOptions?: IPrimerDebugOptions;
17
22
 
23
+ // Common
18
24
  onBeforeClientSessionUpdate?: () => void;
19
25
  onClientSessionUpdate?: (clientSession: PrimerClientSession) => void;
20
26
  onBeforePaymentCreate?: (checkoutPaymentMethodData: PrimerCheckoutPaymentMethodData, handler: PrimerPaymentCreationHandler) => void;
21
27
  onCheckoutComplete?: (checkoutData: PrimerCheckoutData) => void;
22
28
  onTokenizeSuccess?: (paymentMethodTokenData: PrimerPaymentMethodTokenData, handler: PrimerTokenizationHandler) => void;
23
29
  onResumeSuccess?: (resumeToken: string, handler: PrimerResumeHandler) => void;
24
- onError?: (error: PrimerError, checkoutData: PrimerCheckoutData | null, handler: PrimerErrorHandler) => void;
30
+ // PrimerErrorHandler will be undefined on the HUC flow.
31
+ onError?: (error: PrimerError, checkoutData: PrimerCheckoutData | null, handler: PrimerErrorHandler | undefined) => void;
32
+
33
+ // Only on main SDK
25
34
  onDismiss?: () => void;
35
+
36
+ // Only on HUC
37
+ onPrepareStart?: (paymentMethod: string) => void;
38
+ onTokenizeStart?: (paymentMethod: string) => void;
39
+ onPaymentMethodShow?: (paymentMethod: string) => void;
40
+ onAvailablePaymentMethodsLoad?: (paymentMethods: string[]) => void;
26
41
  }
27
42
 
28
43
  //----------------------------------------
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=Primer.js.map
@@ -1,2 +0,0 @@
1
- import type { Primer as IPrimer } from './models/Primer';
2
- export declare const Primer: IPrimer;