@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
@@ -0,0 +1,275 @@
1
+ package com.primerioreactnative
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.Callback
5
+ import com.facebook.react.bridge.Promise
6
+ import com.primerioreactnative.datamodels.*
7
+ import com.primerioreactnative.extensions.toPrimerCheckoutDataRN
8
+ import com.primerioreactnative.extensions.toPrimerClientSessionRN
9
+ import com.primerioreactnative.extensions.toPrimerPaymentMethodDataRN
10
+ import com.primerioreactnative.huc.events.PrimerHeadlessUniversalCheckoutEvent
11
+ import com.primerioreactnative.utils.PrimerHeadlessUniversalCheckoutImplementedRNCallbacks
12
+ import com.primerioreactnative.utils.errorTo
13
+ import io.primer.android.ExperimentalPrimerApi
14
+ import io.primer.android.completion.PrimerPaymentCreationDecisionHandler
15
+ import io.primer.android.completion.PrimerResumeDecisionHandler
16
+ import io.primer.android.components.PrimerHeadlessUniversalCheckoutListener
17
+ import io.primer.android.components.domain.core.models.PrimerHeadlessUniversalCheckoutPaymentMethod
18
+ import io.primer.android.data.configuration.models.PrimerPaymentMethodType
19
+ import io.primer.android.domain.PrimerCheckoutData
20
+ import io.primer.android.domain.action.models.PrimerClientSession
21
+ import io.primer.android.domain.error.models.PrimerError
22
+ import io.primer.android.domain.tokenization.models.PrimerPaymentMethodData
23
+ import io.primer.android.domain.tokenization.models.PrimerPaymentMethodTokenData
24
+ import kotlinx.serialization.encodeToString
25
+ import kotlinx.serialization.json.Json
26
+ import org.json.JSONObject
27
+
28
+ @OptIn(ExperimentalPrimerApi::class)
29
+ class PrimerRNHeadlessUniversalCheckoutListener : PrimerHeadlessUniversalCheckoutListener {
30
+ private var paymentCreationDecisionHandler: ((errorMessage: String?) -> Unit)? = null
31
+ private var tokenizeSuccessDecisionHandler: ((resumeToken: String?, errorMessage: String?) -> Unit)? =
32
+ null
33
+ private var resumeSuccessDecisionHandler: ((resumeToken: String?, errorMessage: String?) -> Unit)? =
34
+ null
35
+ private var implementedRNCallbacks: PrimerHeadlessUniversalCheckoutImplementedRNCallbacks? = null
36
+
37
+ var sendEvent: ((eventName: String, paramsJson: JSONObject?) -> Unit)? = null
38
+
39
+ var sendError: ((error: PrimerErrorRN) -> Unit)? = null
40
+ var sendErrorWithCheckoutData: ((error: PrimerErrorRN, checkoutData: PrimerCheckoutDataRN?) -> Unit)? =
41
+ null
42
+
43
+ var successCallback: Callback? = null
44
+
45
+ override fun onAvailablePaymentMethodsLoaded(paymentMethods: List<PrimerHeadlessUniversalCheckoutPaymentMethod>) {
46
+ sendEvent?.invoke(
47
+ PrimerHeadlessUniversalCheckoutEvent.ON_HUC_AVAILABLE_PAYMENT_METHODS_LOADED.eventName,
48
+ JSONObject().apply {
49
+ put("paymentMethodTypes", paymentMethods.map { it.paymentMethodType.name })
50
+ }
51
+ )
52
+ successCallback?.invoke(
53
+ Arguments.fromList(paymentMethods.map { it.paymentMethodType.name })
54
+ )
55
+ }
56
+
57
+ override fun onPreparationStarted(paymentMethodType: PrimerPaymentMethodType) {
58
+ sendEvent?.invoke(
59
+ PrimerHeadlessUniversalCheckoutEvent.ON_HUC_PREPARE_START.eventName,
60
+ JSONObject(Json.encodeToString(PrimerPaymentMethodDataRN(paymentMethodType)))
61
+ )
62
+ }
63
+
64
+ override fun onPaymentMethodShowed(paymentMethodType: PrimerPaymentMethodType) {
65
+ sendEvent?.invoke(
66
+ PrimerHeadlessUniversalCheckoutEvent.ON_HUC_PAYMENT_METHOD_SHOW.eventName,
67
+ JSONObject(Json.encodeToString(PrimerPaymentMethodDataRN(paymentMethodType)))
68
+ )
69
+ }
70
+
71
+ override fun onTokenizationStarted(paymentMethodType: PrimerPaymentMethodType) {
72
+ sendEvent?.invoke(
73
+ PrimerHeadlessUniversalCheckoutEvent.ON_HUC_TOKENIZE_START.eventName,
74
+ JSONObject(Json.encodeToString(PrimerPaymentMethodDataRN(paymentMethodType)))
75
+ )
76
+ }
77
+
78
+ override fun onCheckoutCompleted(checkoutData: PrimerCheckoutData) {
79
+ if (implementedRNCallbacks?.isOnCheckoutCompleteImplemented == true) {
80
+ sendEvent?.invoke(
81
+ PrimerHeadlessUniversalCheckoutEvent.ON_CHECKOUT_COMPLETE.eventName,
82
+ JSONObject(Json.encodeToString(checkoutData.toPrimerCheckoutDataRN()))
83
+ )
84
+ } else {
85
+ sendError?.invoke(
86
+ ErrorTypeRN.NativeBridgeFailed
87
+ errorTo "Callback [onCheckoutComplete] should be implemented."
88
+ )
89
+ }
90
+ }
91
+
92
+ override fun onBeforePaymentCreated(
93
+ paymentMethodData: PrimerPaymentMethodData,
94
+ createPaymentHandler: PrimerPaymentCreationDecisionHandler
95
+ ) {
96
+ if (implementedRNCallbacks?.isOnBeforePaymentCreateImplemented == true) {
97
+ paymentCreationDecisionHandler = { errorMessage ->
98
+ when {
99
+ errorMessage != null -> createPaymentHandler.abortPaymentCreation(errorMessage.ifBlank { null })
100
+ else -> createPaymentHandler.continuePaymentCreation()
101
+ }
102
+ }
103
+ sendEvent?.invoke(
104
+ PrimerHeadlessUniversalCheckoutEvent.ON_BEFORE_PAYMENT_CREATE.eventName,
105
+ JSONObject(Json.encodeToString(paymentMethodData.toPrimerPaymentMethodDataRN()))
106
+ )
107
+ } else {
108
+ super.onBeforePaymentCreated(paymentMethodData, createPaymentHandler)
109
+ }
110
+ }
111
+
112
+ override fun onBeforeClientSessionUpdated() {
113
+ if (implementedRNCallbacks?.isOnBeforeClientSessionUpdateImplemented == true) {
114
+ sendEvent?.invoke(
115
+ PrimerHeadlessUniversalCheckoutEvent.ON_BEFORE_CLIENT_SESSION_UPDATE.eventName,
116
+ null
117
+ )
118
+ } else {
119
+ super.onBeforeClientSessionUpdated()
120
+ }
121
+ }
122
+
123
+ override fun onClientSessionUpdated(clientSession: PrimerClientSession) {
124
+ if (implementedRNCallbacks?.isOnClientSessionUpdateImplemented == true) {
125
+ sendEvent?.invoke(
126
+ PrimerHeadlessUniversalCheckoutEvent.ON_CLIENT_SESSION_UPDATE.eventName,
127
+ JSONObject(Json.encodeToString(clientSession.toPrimerClientSessionRN()))
128
+ )
129
+ } else {
130
+ super.onClientSessionUpdated(clientSession)
131
+ }
132
+ }
133
+
134
+ override fun onTokenizeSuccess(
135
+ paymentMethodTokenData: PrimerPaymentMethodTokenData,
136
+ decisionHandler: PrimerResumeDecisionHandler
137
+ ) {
138
+ if (implementedRNCallbacks?.isOnTokenizeSuccessImplemented == true) {
139
+ val token = PrimerPaymentInstrumentTokenRN.fromPaymentMethodToken(paymentMethodTokenData)
140
+ val request = JSONObject(Json.encodeToString(token))
141
+ tokenizeSuccessDecisionHandler = { newClientToken, err ->
142
+ when {
143
+ err != null -> decisionHandler.handleFailure(err.ifBlank { null })
144
+ newClientToken != null -> decisionHandler.continueWithNewClientToken(newClientToken)
145
+ else -> decisionHandler.handleSuccess()
146
+ }
147
+ }
148
+ sendEvent?.invoke(PrimerHeadlessUniversalCheckoutEvent.ON_TOKENIZE_SUCCESS.eventName, request)
149
+ } else {
150
+ sendError?.invoke(
151
+ ErrorTypeRN.NativeBridgeFailed
152
+ errorTo "Callback [onTokenizeSuccess] should be implemented."
153
+ )
154
+ }
155
+ }
156
+
157
+ override fun onResumeSuccess(
158
+ resumeToken: String,
159
+ decisionHandler: PrimerResumeDecisionHandler
160
+ ) {
161
+ if (implementedRNCallbacks?.isOnResumeSuccessImplemented == true) {
162
+ resumeSuccessDecisionHandler = { newClientToken, err ->
163
+ when {
164
+ err != null -> decisionHandler.handleFailure(err.ifBlank { null })
165
+ newClientToken != null -> decisionHandler.continueWithNewClientToken(newClientToken)
166
+ else -> decisionHandler.handleSuccess()
167
+ }
168
+ }
169
+
170
+ val resumeToken = mapOf(Keys.RESUME_TOKEN to resumeToken)
171
+ sendEvent?.invoke(
172
+ PrimerHeadlessUniversalCheckoutEvent.ON_RESUME_SUCCESS.eventName,
173
+ JSONObject(Json.encodeToString(resumeToken))
174
+ )
175
+ } else {
176
+ sendError?.invoke(
177
+ ErrorTypeRN.NativeBridgeFailed
178
+ errorTo "Callback [onResumeSuccess] should be implemented."
179
+ )
180
+ }
181
+ }
182
+
183
+ override fun onFailed(
184
+ error: PrimerError,
185
+ checkoutData: PrimerCheckoutData?,
186
+ ) {
187
+ if (implementedRNCallbacks?.isOnErrorImplemented == true) {
188
+ sendErrorWithCheckoutData?.invoke(
189
+ PrimerErrorRN(
190
+ error.errorId,
191
+ error.description,
192
+ error.recoverySuggestion
193
+ ), checkoutData?.toPrimerCheckoutDataRN()
194
+ )
195
+ } else {
196
+ super.onFailed(error, checkoutData)
197
+ }
198
+ }
199
+
200
+ override fun onFailed(error: PrimerError) {
201
+ if (implementedRNCallbacks?.isOnErrorImplemented == true) {
202
+ sendError?.invoke(PrimerErrorRN(error.errorId, error.description, error.recoverySuggestion))
203
+ } else {
204
+ super.onFailed(error)
205
+ }
206
+ }
207
+
208
+ // region tokenization handlers
209
+ fun handleTokenizationNewClientToken(newClientToken: String) {
210
+ tokenizeSuccessDecisionHandler?.invoke(newClientToken, null)
211
+ tokenizeSuccessDecisionHandler = null
212
+ }
213
+
214
+ fun handleTokenizationSuccess(promise: Promise) {
215
+ val error =
216
+ ErrorTypeRN.NativeBridgeFailed errorTo "PrimerTokenizationHandler's " +
217
+ "handleSuccess function is not available on HUC."
218
+ promise.reject(error.errorId, error.description)
219
+ }
220
+
221
+ fun handleTokenizationFailure(errorMessage: String, promise: Promise) {
222
+ val error =
223
+ ErrorTypeRN.NativeBridgeFailed errorTo "PrimerTokenizationHandler's " +
224
+ "handleFailure function is not available on HUC."
225
+ promise.reject(error.errorId, error.description)
226
+ }
227
+ // endregion
228
+
229
+ // region resume handlers
230
+ fun handleResumeNewClientToken(newClientToken: String) {
231
+ resumeSuccessDecisionHandler?.invoke(newClientToken, null)
232
+ resumeSuccessDecisionHandler = null
233
+ }
234
+
235
+ fun handleResumeSuccess(promise: Promise) {
236
+ val error =
237
+ ErrorTypeRN.NativeBridgeFailed errorTo "PrimerResumeHandler's " +
238
+ "handleSuccess function is not available on HUC."
239
+ promise.reject(error.errorId, error.description)
240
+ }
241
+
242
+ fun handleResumeFailure(errorMessage: String, promise: Promise) {
243
+ val error =
244
+ ErrorTypeRN.NativeBridgeFailed errorTo "PrimerResumeHandler's " +
245
+ "handleFailure function is not available on HUC."
246
+ promise.reject(error.errorId, error.description)
247
+ }
248
+ // endregion
249
+
250
+ // region payment create handlers
251
+ fun handlePaymentCreationContinue() {
252
+ paymentCreationDecisionHandler?.invoke(null)
253
+ paymentCreationDecisionHandler = null
254
+ }
255
+
256
+ fun handlePaymentCreationAbort(errorMessage: String) {
257
+ paymentCreationDecisionHandler?.invoke(errorMessage)
258
+ paymentCreationDecisionHandler = null
259
+ }
260
+ // endregion
261
+
262
+ fun setImplementedCallbacks(
263
+ implementedRNCallbacks:
264
+ PrimerHeadlessUniversalCheckoutImplementedRNCallbacks
265
+ ) {
266
+ this.implementedRNCallbacks = implementedRNCallbacks
267
+ }
268
+
269
+ fun removeCallbacksAndHandlers() {
270
+ paymentCreationDecisionHandler = null
271
+ tokenizeSuccessDecisionHandler = null
272
+ resumeSuccessDecisionHandler = null
273
+ implementedRNCallbacks = null
274
+ }
275
+ }
@@ -12,8 +12,8 @@ class ReactNativePackage : ReactPackage {
12
12
 
13
13
  override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
14
14
  return listOf(
15
- PrimerRN(reactContext),
16
- PrimerHeadlessUniversalCheckout(reactContext, json)
15
+ PrimerRN(reactContext, json),
16
+ PrimerRNHeadlessUniversalCheckout(reactContext, json)
17
17
  )
18
18
  }
19
19
 
@@ -0,0 +1,12 @@
1
+ package com.primerioreactnative.datamodels
2
+
3
+ import kotlinx.serialization.Serializable
4
+
5
+ @Serializable
6
+ data class PrimerCheckoutDataRN(val paymentRN: PrimerPaymentRN)
7
+
8
+ @Serializable
9
+ data class PrimerPaymentRN(
10
+ val id: String,
11
+ val orderId: String,
12
+ )
@@ -0,0 +1,54 @@
1
+ package com.primerioreactnative.datamodels
2
+
3
+ import io.primer.android.data.configuration.models.CountryCode
4
+ import io.primer.android.domain.action.models.*
5
+ import kotlinx.serialization.Serializable
6
+
7
+ @Serializable
8
+ data class PrimerClientSessionRN(
9
+ val customerId: String?,
10
+ val orderId: String?,
11
+ val currencyCode: String?,
12
+ val totalAmount: Int?,
13
+ val lineItems: List<PrimerLineItemRN>?,
14
+ val orderDetails: PrimerOrderRN?,
15
+ val customer: PrimerCustomerRN?,
16
+ )
17
+
18
+ @Serializable
19
+ data class PrimerCustomerRN(
20
+ val emailAddress: String?,
21
+ val mobileNumber: String?,
22
+ val firstName: String?,
23
+ val lastName: String?,
24
+ val billingAddress: PrimerAddressRN?,
25
+ val shippingAddress: PrimerAddressRN?,
26
+ )
27
+
28
+ @Serializable
29
+ data class PrimerOrderRN(
30
+ val countryCode: CountryCode?,
31
+ )
32
+
33
+ @Serializable
34
+ data class PrimerLineItemRN(
35
+ val itemId: String?,
36
+ val itemDescription: String?,
37
+ val amount: Int?,
38
+ val discountAmount: Int?,
39
+ val quantity: Int?,
40
+ val taxCode: String?,
41
+ val taxAmount: Int?
42
+ )
43
+
44
+ @Serializable
45
+ data class PrimerAddressRN(
46
+ val firstName: String? = null,
47
+ val lastName: String? = null,
48
+ val addressLine1: String? = null,
49
+ val addressLine2: String? = null,
50
+ val postalCode: String? = null,
51
+ val city: String? = null,
52
+ val state: String? = null,
53
+ val countryCode: CountryCode? = null,
54
+ )
@@ -2,20 +2,17 @@ package com.primerioreactnative.datamodels
2
2
 
3
3
  import kotlinx.serialization.Serializable
4
4
 
5
-
6
5
  @Serializable
7
6
  data class PrimerErrorRN(
8
7
  val errorId: String? = null,
9
- val errorDescription: String? = null,
8
+ val description: String? = null,
10
9
  val recoverySuggestion: String? = null
11
10
  )
12
11
 
13
12
  @Serializable
14
- enum class ErrorTypeRN {
15
- ParseJsonFailed,
16
- InitFailed,
17
- CheckoutFlowFailed,
18
- TokenizationFailed,
19
- AssetMissing,
20
- AssetMismatch
13
+ enum class ErrorTypeRN(val errorId: String) {
14
+ NativeBridgeFailed("native-bridge"),
15
+ AssetMissing("missing-asset"),
16
+ AssetMismatch("mismatch-asset"),
17
+ InvalidPaymentMethodType("invalid-payment-method-type")
21
18
  }
@@ -0,0 +1,13 @@
1
+ package com.primerioreactnative.datamodels
2
+
3
+ internal enum class PrimerEvents(val eventName: String) {
4
+
5
+ ON_CHECKOUT_COMPLETE("onCheckoutComplete"),
6
+ ON_BEFORE_CLIENT_SESSION_UPDATE("onBeforeClientSessionUpdate"),
7
+ ON_CLIENT_SESSION_UPDATE("onClientSessionUpdate"),
8
+ ON_BEFORE_PAYMENT_CREATE("onBeforePaymentCreate"),
9
+ ON_DISMISS("onDismiss"),
10
+ ON_TOKENIZE_SUCCESS("onTokenizeSuccess"),
11
+ ON_RESUME_SUCCESS("onResumeSuccess"),
12
+ ON_ERROR("onError"),
13
+ }
@@ -1,8 +1,8 @@
1
1
  package com.primerioreactnative.datamodels
2
2
 
3
- import io.primer.android.model.dto.PaymentInstrumentData
4
- import io.primer.android.model.dto.PaymentMethodToken
5
- import io.primer.android.model.dto.TokenType
3
+ import io.primer.android.data.tokenization.models.PaymentInstrumentData
4
+ import io.primer.android.data.tokenization.models.TokenType
5
+ import io.primer.android.domain.tokenization.models.PrimerPaymentMethodTokenData
6
6
  import kotlinx.serialization.Serializable
7
7
 
8
8
  @Serializable
@@ -31,7 +31,7 @@ data class PrimerPaymentInstrumentTokenRN(
31
31
  )
32
32
 
33
33
  companion object {
34
- fun fromPaymentMethodToken(token: PaymentMethodToken): PrimerPaymentInstrumentTokenRN {
34
+ fun fromPaymentMethodToken(token: PrimerPaymentMethodTokenData): PrimerPaymentInstrumentTokenRN {
35
35
  return PrimerPaymentInstrumentTokenRN(
36
36
  token.token,
37
37
  token.analyticsId,
@@ -0,0 +1,8 @@
1
+ package com.primerioreactnative.datamodels
2
+
3
+ import io.primer.android.data.configuration.models.PrimerPaymentMethodType
4
+ import io.primer.android.domain.tokenization.models.PrimerPaymentMethodData
5
+ import kotlinx.serialization.Serializable
6
+
7
+ @Serializable
8
+ data class PrimerPaymentMethodDataRN(val paymentMethodType: PrimerPaymentMethodType)
@@ -1,145 +1,63 @@
1
1
  package com.primerioreactnative.datamodels
2
2
 
3
- import io.primer.android.model.PrimerDebugOptions
4
- import io.primer.android.model.dto.*
3
+ import io.primer.android.data.settings.*
4
+ import io.primer.android.ui.settings.PrimerUIOptions
5
+ import kotlinx.serialization.SerialName
5
6
  import kotlinx.serialization.Serializable
7
+ import java.util.*
6
8
 
7
9
  @Serializable
8
- class PrimerSettingsRN(
9
- val order: OrderRN? = null,
10
- val business: BusinessRN? = null,
11
- private val customer: CustomerRN? = null,
12
- private val options: OptionsRN? = null,
13
- ) {
14
- fun format(): PrimerSettings {
15
- val order = order?.format() ?: Order()
16
- val customer = customer?.format() ?: Customer()
17
- val business = business?.format() ?: Business()
18
- val options = options?.format() ?: Options()
19
- return PrimerSettings(order, customer, business, options)
20
- }
21
- }
10
+ data class PrimerSettingsRN(
11
+ var paymentHandling: PrimerPaymentHandling = PrimerPaymentHandling.AUTO,
12
+ var localeData: LocaleSettingsRN = LocaleSettingsRN(),
13
+ var paymentMethodOptions: PrimerPaymentMethodOptionsRN = PrimerPaymentMethodOptionsRN(),
14
+ var uiOptions: PrimerUIOptions = PrimerUIOptions(),
15
+ var debugOptions: PrimerDebugOptions = PrimerDebugOptions(),
16
+ )
22
17
 
23
18
  @Serializable
24
- data class OrderRN(
25
- val amount: Int? = null,
26
- val currency: String? = null,
27
- val countryCode: String? = null,
28
- val items: List<OrderItemRN>? = null,
29
- val shipping: PrimerAddressRN? = null,
30
- ) {
31
- fun format(): Order {
32
- return Order(
33
- amount = amount,
34
- currency = currency,
35
- countryCode = countryCode?.let { CountryCode.valueOf(it) },
19
+ data class LocaleSettingsRN(
20
+ val languageCode: String? = null,
21
+ val localeCode: String? = null
22
+ )
36
23
 
37
- )
24
+ fun LocaleSettingsRN.toLocale(): Locale {
25
+ return when {
26
+ languageCode == null -> Locale.getDefault()
27
+ localeCode == null -> Locale(languageCode)
28
+ else -> Locale(languageCode, localeCode)
38
29
  }
39
30
  }
40
31
 
41
32
  @Serializable
42
- data class OrderItemRN(
43
- val name: String,
44
- val unitAmount: Int?,
45
- val quantity: Int,
46
- val isPending: Boolean?,
33
+ data class PrimerPaymentMethodOptionsRN(
34
+ @SerialName("android")
35
+ val androidSettingsRN: AndroidSettingsRN = AndroidSettingsRN(),
36
+ var cardPaymentOptions: PrimerCardPaymentOptions = PrimerCardPaymentOptions(),
37
+ var googlePayOptions: PrimerGooglePayOptions = PrimerGooglePayOptions(),
38
+ var klarnaOptions: PrimerKlarnaOptions = PrimerKlarnaOptions(),
39
+ var apayaOptions: PrimerApayaOptions = PrimerApayaOptions(),
40
+ var goCardlessOptions: PrimerGoCardlessOptions = PrimerGoCardlessOptions()
47
41
  )
48
42
 
49
- @Serializable
50
- data class BusinessRN(
51
- val name: String? = null,
52
- val registrationNumber: String? = null,
53
- val email: String? = null,
54
- val phone: String? = null,
55
- val address: PrimerAddressRN? = null,
56
- ) {
57
-
58
- fun format(): Business {
59
- return Business(
60
- name = name,
61
- registrationNumber = registrationNumber,
62
- email = email,
63
- phone = phone,
64
- address = address?.format(),
65
- )
66
- }
67
- }
68
-
69
- @Serializable
70
- data class CustomerRN(
71
- val id: String? = null,
72
- val firstName: String? = null,
73
- val lastName: String? = null,
74
- val email: String? = null,
75
- val phone: String? = null,
76
- val billing: PrimerAddressRN? = null,
77
- ) {
78
- fun format(): Customer {
79
- return Customer(
80
- id = id,
81
- firstName = firstName,
82
- lastName = lastName,
83
- email = email,
84
- homePhone = phone,
85
- billingAddress = billing?.format(),
86
- )
87
- }
88
- }
43
+ fun PrimerPaymentMethodOptionsRN.toPrimerPaymentMethodOptions() = PrimerPaymentMethodOptions(
44
+ androidSettingsRN.redirectScheme,
45
+ cardPaymentOptions,
46
+ googlePayOptions,
47
+ klarnaOptions,
48
+ apayaOptions,
49
+ goCardlessOptions
50
+ )
89
51
 
90
52
  @Serializable
91
- data class OptionsRN(
92
- val isResultScreenEnabled: Boolean? = null,
93
- val isLoadingScreenEnabled: Boolean? = null,
94
- val isFullScreenEnabled: Boolean? = null,
95
- val is3DSOnVaultingEnabled: Boolean? = null,
96
- val locale: String? = null,
97
- val android: AndroidOptionsRN? = null,
98
- val is3DSDevelopmentModeEnabled: Boolean = true
99
- ) {
100
- fun format(): Options {
101
- return Options(
102
- showUI = isLoadingScreenEnabled ?: true,
103
- redirectScheme = android?.redirectScheme,
104
- is3DSOnVaultingEnabled = is3DSOnVaultingEnabled ?: false,
105
- debugOptions = PrimerDebugOptions(
106
- is3DSSanityCheckEnabled = !is3DSDevelopmentModeEnabled, // false on emulator
107
- ),
108
- )
109
- }
110
- }
53
+ data class AndroidSettingsRN(val redirectScheme: String? = null)
111
54
 
112
- @Serializable
113
- data class AndroidOptionsRN(
114
- val redirectScheme: String? = null,
55
+ fun PrimerSettingsRN.toPrimerSettings() = PrimerSettings(
56
+ paymentHandling,
57
+ localeData.toLocale(),
58
+ paymentMethodOptions.toPrimerPaymentMethodOptions(),
59
+ uiOptions,
60
+ debugOptions
115
61
  )
116
62
 
117
- @Serializable
118
- data class PrimerAddressRN(
119
- val line1: String?,
120
- val line2: String? = null,
121
- val postalCode: String?,
122
- val state: String? = null,
123
- val city: String?,
124
- val country: String?,
125
- ) {
126
-
127
- fun format(): Address? {
128
- if (
129
- line1 == null ||
130
- postalCode == null ||
131
- city == null ||
132
- country == null
133
- ) {
134
- return null
135
- }
136
63
 
137
- return Address(
138
- line1 = line1,
139
- line2 = line2,
140
- city = city,
141
- countryCode = CountryCode.valueOf(country),
142
- postalCode = postalCode,
143
- )
144
- }
145
- }
@@ -0,0 +1,6 @@
1
+ package com.primerioreactnative.extensions
2
+
3
+ import com.primerioreactnative.datamodels.PrimerPaymentRN
4
+ import io.primer.android.domain.payments.create.model.Payment
5
+
6
+ internal fun Payment.toPrimerPaymentRN() = PrimerPaymentRN(id, orderId)
@@ -0,0 +1,15 @@
1
+ package com.primerioreactnative.extensions
2
+
3
+ import com.primerioreactnative.datamodels.PrimerAddressRN
4
+ import io.primer.android.domain.action.models.PrimerAddress
5
+
6
+ internal fun PrimerAddress.toPrimerAddressRN() = PrimerAddressRN(
7
+ firstName,
8
+ lastName,
9
+ addressLine1,
10
+ addressLine2,
11
+ postalCode,
12
+ city,
13
+ state,
14
+ countryCode
15
+ )
@@ -0,0 +1,7 @@
1
+ package com.primerioreactnative.extensions
2
+
3
+ import com.primerioreactnative.datamodels.PrimerCheckoutDataRN
4
+ import io.primer.android.domain.PrimerCheckoutData
5
+
6
+ internal fun PrimerCheckoutData.toPrimerCheckoutDataRN() =
7
+ PrimerCheckoutDataRN(payment.toPrimerPaymentRN())
@@ -0,0 +1,15 @@
1
+ package com.primerioreactnative.extensions
2
+
3
+ import com.primerioreactnative.datamodels.PrimerClientSessionRN
4
+ import io.primer.android.domain.action.models.PrimerClientSession
5
+
6
+ internal fun PrimerClientSession.toPrimerClientSessionRN() =
7
+ PrimerClientSessionRN(
8
+ customerId,
9
+ orderId,
10
+ currencyCode,
11
+ totalAmount,
12
+ lineItems?.map { it.toPrimerLineItemRN() },
13
+ orderDetails?.toPrimerOrderRN(),
14
+ customer?.toPrimerCustomerRN()
15
+ )
@@ -0,0 +1,13 @@
1
+ package com.primerioreactnative.extensions
2
+
3
+ import com.primerioreactnative.datamodels.PrimerCustomerRN
4
+ import io.primer.android.domain.action.models.PrimerCustomer
5
+
6
+ internal fun PrimerCustomer.toPrimerCustomerRN() = PrimerCustomerRN(
7
+ emailAddress,
8
+ mobileNumber,
9
+ firstName,
10
+ lastName,
11
+ billingAddress?.toPrimerAddressRN(),
12
+ shippingAddress?.toPrimerAddressRN()
13
+ )