@primer-io/react-native 0.16.2 → 2.1.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 (233) hide show
  1. package/README.md +114 -24
  2. package/android/build.gradle +10 -2
  3. package/android/gradle.properties +3 -3
  4. package/android/src/main/java/com/primerioreactnative/PrimerRN.kt +124 -150
  5. package/android/src/main/java/com/primerioreactnative/PrimerRNEventListener.kt +212 -128
  6. package/android/src/main/java/com/primerioreactnative/PrimerRNHeadlessUniversalCheckout.kt +244 -0
  7. package/android/src/main/java/com/primerioreactnative/PrimerRNHeadlessUniversalCheckoutListener.kt +275 -0
  8. package/android/src/main/java/com/primerioreactnative/ReactNativePackage.kt +2 -2
  9. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerCheckoutDataRN.kt +12 -0
  10. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerClientSessionRN.kt +54 -0
  11. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerErrorRN.kt +6 -9
  12. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerEvents.kt +13 -0
  13. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerPaymentInstrumentTokenRN.kt +4 -4
  14. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerPaymentMethodDataRN.kt +8 -0
  15. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerSettingsRN.kt +43 -125
  16. package/android/src/main/java/com/primerioreactnative/extensions/Payment.kt +6 -0
  17. package/android/src/main/java/com/primerioreactnative/extensions/PrimerAddress.kt +15 -0
  18. package/android/src/main/java/com/primerioreactnative/extensions/PrimerCheckoutData.kt +7 -0
  19. package/android/src/main/java/com/primerioreactnative/extensions/PrimerClientSession.kt +15 -0
  20. package/android/src/main/java/com/primerioreactnative/extensions/PrimerCustomer.kt +13 -0
  21. package/android/src/main/java/com/primerioreactnative/extensions/PrimerLineItem.kt +8 -0
  22. package/android/src/main/java/com/primerioreactnative/extensions/PrimerOrder.kt +6 -0
  23. package/android/src/main/java/com/primerioreactnative/extensions/PrimerPaymentMethodData.kt +7 -0
  24. package/android/src/main/java/com/primerioreactnative/huc/events/PrimerHeadlessUniversalCheckoutEvent.kt +11 -7
  25. package/android/src/main/java/com/primerioreactnative/utils/ErrorHelper.kt +1 -3
  26. package/android/src/main/java/com/primerioreactnative/utils/JsonConverter.kt +45 -0
  27. package/android/src/main/java/com/primerioreactnative/utils/PrimerHeadlessUniversalCheckoutImplementedRNCallbacks.kt +31 -0
  28. package/android/src/main/java/com/primerioreactnative/utils/PrimerImplementedRNCallbacks.kt +16 -6
  29. package/ios/Core/ReactNative-Bridging-Header.h +10 -0
  30. package/ios/DataModels/ImplementedRNCallbacks.swift +56 -0
  31. package/ios/DataModels/PrimerErrorRN.swift +0 -17
  32. package/ios/DataModels/PrimerSettingsRN.swift +78 -156
  33. package/ios/DataModels/PrimerThemeRN.swift +1 -10
  34. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.m +33 -1
  35. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.swift +306 -54
  36. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.swift +5 -1
  37. package/ios/RNTPrimer.m +28 -12
  38. package/ios/RNTPrimer.swift +273 -222
  39. package/ios/ReactNative-Bridging-Header.h +4 -0
  40. package/ios/ReactNative.xcodeproj/project.pbxproj +14 -14
  41. package/lib/commonjs/Primer.js +206 -149
  42. package/lib/commonjs/Primer.js.map +1 -1
  43. package/lib/commonjs/RNPrimer.js +113 -41
  44. package/lib/commonjs/RNPrimer.js.map +1 -1
  45. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js +240 -71
  46. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +1 -1
  47. package/lib/commonjs/headless_checkout/RNPrimerHeadlessUniversalCheckout.js +197 -0
  48. package/lib/commonjs/headless_checkout/RNPrimerHeadlessUniversalCheckout.js.map +1 -0
  49. package/lib/commonjs/headless_checkout/types.js +4 -0
  50. package/lib/commonjs/index.js +118 -24
  51. package/lib/commonjs/index.js.map +1 -1
  52. package/lib/commonjs/models/PrimerCheckoutData.js +9 -0
  53. package/lib/commonjs/models/PrimerCheckoutData.js.map +1 -0
  54. package/lib/commonjs/models/PrimerCheckoutPaymentMethodData.js +2 -0
  55. package/lib/commonjs/models/{action-request.js.map → PrimerCheckoutPaymentMethodData.js.map} +0 -0
  56. package/lib/commonjs/models/PrimerClientSession.js +2 -0
  57. package/lib/commonjs/models/{client-session-actions-request.js.map → PrimerClientSession.js.map} +0 -0
  58. package/lib/commonjs/models/{utils/countryCode.js → PrimerCountryCode.js} +1 -1
  59. package/lib/commonjs/models/PrimerCountryCode.js.map +1 -0
  60. package/lib/commonjs/models/{utils/currencyCode.js → PrimerCurrencyCode.js} +1 -1
  61. package/lib/commonjs/models/PrimerCurrencyCode.js.map +1 -0
  62. package/lib/commonjs/models/PrimerError.js +28 -0
  63. package/lib/commonjs/models/PrimerError.js.map +1 -0
  64. package/lib/commonjs/models/{primer-settings.js → PrimerInterfaces.js} +1 -1
  65. package/lib/commonjs/models/{primer-callbacks.js.map → PrimerInterfaces.js.map} +0 -0
  66. package/lib/commonjs/models/PrimerPaymentMethodTokenData.js +14 -0
  67. package/lib/commonjs/models/PrimerPaymentMethodTokenData.js.map +1 -0
  68. package/lib/commonjs/models/PrimerSessionIntent.js +14 -0
  69. package/lib/commonjs/models/PrimerSessionIntent.js.map +1 -0
  70. package/lib/commonjs/models/{primer.js → PrimerSettings.js} +1 -1
  71. package/lib/commonjs/models/{primer-config.js.map → PrimerSettings.js.map} +0 -0
  72. package/lib/commonjs/models/PrimerTheme.js +2 -0
  73. package/lib/commonjs/models/{primer-request.js.map → PrimerTheme.js.map} +0 -0
  74. package/lib/commonjs/utils/index.js.map +1 -1
  75. package/lib/module/Primer.js +205 -136
  76. package/lib/module/Primer.js.map +1 -1
  77. package/lib/module/RNPrimer.js +113 -41
  78. package/lib/module/RNPrimer.js.map +1 -1
  79. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js +243 -70
  80. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +1 -1
  81. package/lib/module/headless_checkout/RNPrimerHeadlessUniversalCheckout.js +188 -0
  82. package/lib/module/headless_checkout/RNPrimerHeadlessUniversalCheckout.js.map +1 -0
  83. package/lib/module/headless_checkout/types.js +1 -1
  84. package/lib/module/index.js +10 -5
  85. package/lib/module/index.js.map +1 -1
  86. package/lib/module/models/PrimerCheckoutData.js +7 -0
  87. package/lib/module/models/PrimerCheckoutData.js.map +1 -0
  88. package/lib/module/models/PrimerCheckoutPaymentMethodData.js +2 -0
  89. package/lib/{commonjs/models/primer-settings.js.map → module/models/PrimerCheckoutPaymentMethodData.js.map} +0 -0
  90. package/lib/module/models/PrimerClientSession.js +2 -0
  91. package/lib/{commonjs/models/primer-theme.js.map → module/models/PrimerClientSession.js.map} +0 -0
  92. package/lib/module/models/{utils/countryCode.js → PrimerCountryCode.js} +1 -1
  93. package/lib/module/models/PrimerCountryCode.js.map +1 -0
  94. package/lib/module/models/{utils/currencyCode.js → PrimerCurrencyCode.js} +1 -1
  95. package/lib/module/models/PrimerCurrencyCode.js.map +1 -0
  96. package/lib/module/models/PrimerError.js +19 -0
  97. package/lib/module/models/PrimerError.js.map +1 -0
  98. package/lib/module/models/PrimerInterfaces.js +2 -0
  99. package/lib/{commonjs/models/primer.js.map → module/models/PrimerInterfaces.js.map} +0 -0
  100. package/lib/module/models/PrimerPaymentMethodTokenData.js +7 -0
  101. package/lib/module/models/PrimerPaymentMethodTokenData.js.map +1 -0
  102. package/lib/module/models/PrimerSessionIntent.js +7 -0
  103. package/lib/module/models/PrimerSessionIntent.js.map +1 -0
  104. package/lib/module/models/PrimerSettings.js +2 -0
  105. package/lib/module/models/{action-request.js.map → PrimerSettings.js.map} +0 -0
  106. package/lib/module/models/PrimerTheme.js +2 -0
  107. package/lib/module/models/{client-session-actions-request.js.map → PrimerTheme.js.map} +0 -0
  108. package/lib/module/utils/index.js.map +1 -1
  109. package/lib/typescript/MerchantExample/App.d.ts +11 -0
  110. package/lib/typescript/src/Primer.d.ts +2 -0
  111. package/lib/typescript/{PrimerInput.d.ts → src/PrimerInput.d.ts} +0 -0
  112. package/lib/typescript/src/RNPrimer.d.ts +32 -0
  113. package/lib/typescript/{RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.d.ts → src/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.d.ts} +0 -0
  114. package/lib/typescript/src/headless_checkout/PrimerHeadlessUniversalCheckout.d.ts +11 -0
  115. package/lib/typescript/src/headless_checkout/RNPrimerHeadlessUniversalCheckout.d.ts +22 -0
  116. package/lib/typescript/src/headless_checkout/types.d.ts +22 -0
  117. package/lib/typescript/src/index.d.ts +10 -0
  118. package/lib/typescript/src/models/PrimerCheckoutData.d.ts +15 -0
  119. package/lib/typescript/src/models/PrimerCheckoutPaymentMethodData.d.ts +5 -0
  120. package/lib/typescript/src/models/PrimerClientSession.d.ts +45 -0
  121. package/lib/typescript/{models/utils/countryCode.d.ts → src/models/PrimerCountryCode.d.ts} +1 -1
  122. package/lib/typescript/{models/utils/currencyCode.d.ts → src/models/PrimerCurrencyCode.d.ts} +1 -1
  123. package/lib/typescript/src/models/PrimerError.d.ts +11 -0
  124. package/lib/typescript/src/models/PrimerInterfaces.d.ts +27 -0
  125. package/lib/typescript/src/models/PrimerPaymentMethodTokenData.d.ts +116 -0
  126. package/lib/typescript/src/models/PrimerSessionIntent.d.ts +4 -0
  127. package/lib/typescript/src/models/PrimerSettings.d.ts +77 -0
  128. package/lib/typescript/{models/primer-theme.d.ts → src/models/PrimerTheme.d.ts} +1 -1
  129. package/lib/typescript/{utils → src/utils}/index.d.ts +1 -1
  130. package/package.json +1 -1
  131. package/primer-io-react-native.podspec +1 -1
  132. package/src/Primer.ts +231 -170
  133. package/src/RNPrimer.ts +148 -51
  134. package/src/headless_checkout/PrimerHeadlessUniversalCheckout.ts +281 -94
  135. package/src/headless_checkout/RNPrimerHeadlessUniversalCheckout.ts +252 -0
  136. package/src/headless_checkout/types.ts +26 -12
  137. package/src/index.tsx +36 -8
  138. package/src/models/PrimerCheckoutData.ts +18 -0
  139. package/src/models/PrimerCheckoutPaymentMethodData.ts +5 -0
  140. package/src/models/PrimerClientSession.ts +53 -0
  141. package/src/models/{utils/countryCode.ts → PrimerCountryCode.ts} +1 -1
  142. package/src/models/{utils/currencyCode.ts → PrimerCurrencyCode.ts} +1 -1
  143. package/src/models/PrimerError.ts +20 -0
  144. package/src/models/PrimerInterfaces.ts +36 -0
  145. package/src/models/PrimerPaymentMethodTokenData.ts +130 -0
  146. package/src/models/PrimerSessionIntent.ts +4 -0
  147. package/src/models/PrimerSettings.ts +108 -0
  148. package/src/models/{primer-theme.ts → PrimerTheme.ts} +1 -1
  149. package/src/utils/index.ts +1 -1
  150. package/android/src/main/java/com/primerioreactnative/PrimerHeadlessUniversalCheckout.kt +0 -198
  151. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerEventsRN.kt +0 -11
  152. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerIntentRN.kt +0 -80
  153. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerOnClientSessionActionsRequestRN.kt +0 -65
  154. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerRequestRN.kt +0 -9
  155. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerThemeRN.kt +0 -51
  156. package/android/src/main/java/com/primerioreactnative/huc/extensions/Map.kt +0 -10
  157. package/android/src/main/java/com/primerioreactnative/utils/Keys.kt +0 -7
  158. package/android/src/main/java/com/primerioreactnative/utils/PrimerEventQueueRN.kt +0 -30
  159. package/ios/DataModels/PrimerIntentRN.swift +0 -10
  160. package/ios/DataModels/PrimerRequestRN.swift +0 -14
  161. package/lib/commonjs/headless_checkout/NativePrimerHeadlessUniversalCheckout.js +0 -110
  162. package/lib/commonjs/headless_checkout/NativePrimerHeadlessUniversalCheckout.js.map +0 -1
  163. package/lib/commonjs/models/action-request.js +0 -2
  164. package/lib/commonjs/models/client-session-actions-request.js +0 -2
  165. package/lib/commonjs/models/payment-instrument-token.js +0 -30
  166. package/lib/commonjs/models/payment-instrument-token.js.map +0 -1
  167. package/lib/commonjs/models/primer-callbacks.js +0 -6
  168. package/lib/commonjs/models/primer-config.js +0 -6
  169. package/lib/commonjs/models/primer-error.js +0 -4
  170. package/lib/commonjs/models/primer-error.js.map +0 -1
  171. package/lib/commonjs/models/primer-intent.js +0 -4
  172. package/lib/commonjs/models/primer-intent.js.map +0 -1
  173. package/lib/commonjs/models/primer-request.js +0 -2
  174. package/lib/commonjs/models/primer-theme.js +0 -2
  175. package/lib/commonjs/models/utils/countryCode.js.map +0 -1
  176. package/lib/commonjs/models/utils/currencyCode.js.map +0 -1
  177. package/lib/commonjs/models/utils/redirectScheme.js +0 -4
  178. package/lib/commonjs/models/utils/redirectScheme.js.map +0 -1
  179. package/lib/module/headless_checkout/NativePrimerHeadlessUniversalCheckout.js +0 -98
  180. package/lib/module/headless_checkout/NativePrimerHeadlessUniversalCheckout.js.map +0 -1
  181. package/lib/module/models/action-request.js +0 -2
  182. package/lib/module/models/client-session-actions-request.js +0 -2
  183. package/lib/module/models/payment-instrument-token.js +0 -28
  184. package/lib/module/models/payment-instrument-token.js.map +0 -1
  185. package/lib/module/models/primer-callbacks.js +0 -2
  186. package/lib/module/models/primer-callbacks.js.map +0 -1
  187. package/lib/module/models/primer-config.js +0 -2
  188. package/lib/module/models/primer-config.js.map +0 -1
  189. package/lib/module/models/primer-error.js +0 -2
  190. package/lib/module/models/primer-error.js.map +0 -1
  191. package/lib/module/models/primer-intent.js +0 -2
  192. package/lib/module/models/primer-intent.js.map +0 -1
  193. package/lib/module/models/primer-request.js +0 -2
  194. package/lib/module/models/primer-request.js.map +0 -1
  195. package/lib/module/models/primer-settings.js +0 -2
  196. package/lib/module/models/primer-settings.js.map +0 -1
  197. package/lib/module/models/primer-theme.js +0 -2
  198. package/lib/module/models/primer-theme.js.map +0 -1
  199. package/lib/module/models/primer.js +0 -2
  200. package/lib/module/models/primer.js.map +0 -1
  201. package/lib/module/models/utils/countryCode.js.map +0 -1
  202. package/lib/module/models/utils/currencyCode.js.map +0 -1
  203. package/lib/module/models/utils/redirectScheme.js +0 -2
  204. package/lib/module/models/utils/redirectScheme.js.map +0 -1
  205. package/lib/typescript/Primer.d.ts +0 -15
  206. package/lib/typescript/RNPrimer.d.ts +0 -24
  207. package/lib/typescript/headless_checkout/NativePrimerHeadlessUniversalCheckout.d.ts +0 -13
  208. package/lib/typescript/headless_checkout/PrimerHeadlessUniversalCheckout.d.ts +0 -13
  209. package/lib/typescript/headless_checkout/types.d.ts +0 -16
  210. package/lib/typescript/index.d.ts +0 -5
  211. package/lib/typescript/models/action-request.d.ts +0 -10
  212. package/lib/typescript/models/client-session-actions-request.d.ts +0 -15
  213. package/lib/typescript/models/payment-instrument-token.d.ts +0 -76
  214. package/lib/typescript/models/primer-callbacks.d.ts +0 -10
  215. package/lib/typescript/models/primer-config.d.ts +0 -44
  216. package/lib/typescript/models/primer-error.d.ts +0 -8
  217. package/lib/typescript/models/primer-intent.d.ts +0 -13
  218. package/lib/typescript/models/primer-request.d.ts +0 -7
  219. package/lib/typescript/models/primer-settings.d.ts +0 -65
  220. package/lib/typescript/models/primer.d.ts +0 -33
  221. package/lib/typescript/models/utils/redirectScheme.d.ts +0 -3
  222. package/src/headless_checkout/NativePrimerHeadlessUniversalCheckout.ts +0 -132
  223. package/src/models/action-request.ts +0 -12
  224. package/src/models/client-session-actions-request.ts +0 -21
  225. package/src/models/payment-instrument-token.ts +0 -109
  226. package/src/models/primer-callbacks.ts +0 -14
  227. package/src/models/primer-config.ts +0 -55
  228. package/src/models/primer-error.ts +0 -19
  229. package/src/models/primer-intent.ts +0 -49
  230. package/src/models/primer-request.ts +0 -7
  231. package/src/models/primer-settings.ts +0 -73
  232. package/src/models/primer.ts +0 -41
  233. package/src/models/utils/redirectScheme.ts +0 -5
@@ -1,80 +1,270 @@
1
- import type { PaymentInstrumentToken } from 'src/models/payment-instrument-token';
2
- import type { PrimerError } from 'src/models/primer-error';
3
- import type { PrimerSettings } from 'src/models/primer-settings';
4
- import NativePrimerHeadlessUniversalCheckout from './NativePrimerHeadlessUniversalCheckout';
5
- import type {
6
- PrimerHeadlessUniversalCheckoutStartResponse,
7
- PrimerHeadlessUniversalCheckoutCallbacks,
8
- } from './types';
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';
9
10
 
10
- let callbacks: PrimerHeadlessUniversalCheckoutCallbacks | undefined;
11
+ ///////////////////////////////////////////
12
+ // DECISION HANDLERS
13
+ ///////////////////////////////////////////
11
14
 
12
- class PrimerHeadlessUniversalCheckoutClass {
15
+ // Tokenization Handler
13
16
 
14
- ///////////////////////////////////////////
15
- // Init
16
- ///////////////////////////////////////////
17
- constructor() {
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
18
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
+ }
19
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();
20
97
 
21
- private configureListeners() {
22
- NativePrimerHeadlessUniversalCheckout.removeAllListeners();
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
+ };
23
112
 
24
- NativePrimerHeadlessUniversalCheckout.addListener(
25
- 'preparationStarted',
26
- () => {
27
- console.log('preparationStarted');
28
- callbacks?.onPreparationStarted?.();
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
+ );
29
128
  }
30
- );
31
129
 
32
- NativePrimerHeadlessUniversalCheckout.addListener(
33
- 'paymentMethodPresented',
34
- () => {
35
- console.log('paymentMethodPresented');
36
- callbacks?.onPaymentMethodPresented?.();
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
+ );
37
142
  }
38
- );
39
143
 
40
- NativePrimerHeadlessUniversalCheckout.addListener(
41
- 'tokenizationStarted',
42
- () => {
43
- console.log('tokenizationStarted');
44
- callbacks?.onTokenizeStart?.();
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
+ );
45
156
  }
46
- );
47
157
 
48
- NativePrimerHeadlessUniversalCheckout.addListener(
49
- 'tokenizationSucceeded',
50
- (data) => {
51
- console.log('tokenizationSucceeded', data);
52
-
53
- if (data.paymentMethodToken) {
54
- const paymentMethodTokenObj: PaymentInstrumentToken = JSON.parse(
55
- data.paymentMethodToken
56
- );
57
- callbacks?.onTokenizeSuccess?.(paymentMethodTokenObj);
58
- } else {
59
- const err: PrimerError = {
60
- name: 'ParseJsonFailed',
61
- description: 'Failed to parse payment method token',
62
- };
63
- //@ts-ignore
64
- callbacks?.onFailure?.(err);
65
- }
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
+ );
66
170
  }
67
- );
68
171
 
69
- NativePrimerHeadlessUniversalCheckout.addListener('resume', (data) => {
70
- console.log('resume', data);
71
- callbacks?.onResumeSuccess?.(data.resumeToken);
72
- });
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() {
73
267
 
74
- NativePrimerHeadlessUniversalCheckout.addListener('error', (data) => {
75
- console.log('error', data);
76
- callbacks?.onFailure?.(data.error);
77
- });
78
268
  }
79
269
 
80
270
  ///////////////////////////////////////////
@@ -82,43 +272,38 @@ class PrimerHeadlessUniversalCheckoutClass {
82
272
  ///////////////////////////////////////////
83
273
  startWithClientToken(
84
274
  clientToken: string,
85
- settings: PrimerSettings & PrimerHeadlessUniversalCheckoutCallbacks
86
- ): Promise<PrimerHeadlessUniversalCheckoutStartResponse> {
87
- // Copy callback
88
- callbacks = {
89
- onPreparationStarted: settings.onPreparationStarted,
90
- onPaymentMethodPresented: settings.onPaymentMethodPresented,
91
- onTokenizeStart: settings.onTokenizeStart,
92
- onTokenizeSuccess: settings.onTokenizeSuccess,
93
- onResumeSuccess: settings.onResumeSuccess,
94
- onFailure: settings.onFailure,
95
- };
96
-
97
- return NativePrimerHeadlessUniversalCheckout.startWithClientToken(
98
- clientToken,
99
- settings
100
- );
101
- }
102
-
103
- showPaymentMethod(paymentMethod: string) {
104
- this.configureListeners();
275
+ settings: PrimerSettings
276
+ ): Promise<string[]> {
277
+ primerSettings = settings;
105
278
 
106
- return NativePrimerHeadlessUniversalCheckout.showPaymentMethod(
107
- paymentMethod
108
- );
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
+ });
109
289
  }
110
290
 
111
- resumeWithClientToken(resumeToken: string) {
112
- return NativePrimerHeadlessUniversalCheckout.resumeWithClientToken(
113
- resumeToken
114
- );
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
+ });
115
300
  }
116
301
 
117
- getAssetForPaymentMethod(
302
+ getAssetForPaymentMethodType(
118
303
  paymentMethodType: string,
119
304
  assetType: 'logo' | 'icon'
120
305
  ): Promise<string> {
121
- return NativePrimerHeadlessUniversalCheckout.getAssetForPaymentMethod(
306
+ return RNPrimerHeadlessUniversalCheckout.getAssetForPaymentMethodType(
122
307
  paymentMethodType,
123
308
  assetType
124
309
  );
@@ -128,13 +313,15 @@ class PrimerHeadlessUniversalCheckoutClass {
128
313
  cardNetwork: string,
129
314
  assetType: 'logo' | 'icon'
130
315
  ): Promise<string> {
131
- return NativePrimerHeadlessUniversalCheckout.getAssetForCardNetwork(
316
+ return RNPrimerHeadlessUniversalCheckout.getAssetForCardNetwork(
132
317
  cardNetwork,
133
318
  assetType
134
319
  );
135
320
  }
136
- }
137
321
 
138
- const PrimerHeadlessUniversalCheckout = new PrimerHeadlessUniversalCheckoutClass();
322
+ disposePrimerHeadlessUniversalCheckout(): Promise<void> {
323
+ return RNPrimerHeadlessUniversalCheckout.disposePrimerHeadlessUniversalCheckout();
324
+ }
325
+ }
139
326
 
140
- export default PrimerHeadlessUniversalCheckout;
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;