@primer-io/react-native 0.16.0 → 2.0.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 (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/ReactNativePackage.kt +3 -14
  7. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerCheckoutDataRN.kt +12 -0
  8. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerClientSessionRN.kt +54 -0
  9. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerErrorRN.kt +3 -9
  10. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerEvents.kt +13 -0
  11. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerPaymentInstrumentTokenRN.kt +4 -4
  12. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerPaymentMethodDataRN.kt +8 -0
  13. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerSettingsRN.kt +43 -125
  14. package/android/src/main/java/com/primerioreactnative/extensions/Payment.kt +6 -0
  15. package/android/src/main/java/com/primerioreactnative/extensions/PrimerAddress.kt +15 -0
  16. package/android/src/main/java/com/primerioreactnative/extensions/PrimerCheckoutData.kt +7 -0
  17. package/android/src/main/java/com/primerioreactnative/extensions/PrimerClientSession.kt +15 -0
  18. package/android/src/main/java/com/primerioreactnative/extensions/PrimerCustomer.kt +13 -0
  19. package/android/src/main/java/com/primerioreactnative/extensions/PrimerLineItem.kt +8 -0
  20. package/android/src/main/java/com/primerioreactnative/extensions/PrimerOrder.kt +6 -0
  21. package/android/src/main/java/com/primerioreactnative/extensions/PrimerPaymentMethodData.kt +7 -0
  22. package/android/src/main/java/com/primerioreactnative/utils/ErrorHelper.kt +1 -3
  23. package/android/src/main/java/com/primerioreactnative/utils/JsonConverter.kt +45 -0
  24. package/android/src/main/java/com/primerioreactnative/utils/PrimerImplementedRNCallbacks.kt +16 -6
  25. package/ios/DataModels/ImplementedRNCallbacks.swift +31 -0
  26. package/ios/DataModels/PrimerErrorRN.swift +0 -17
  27. package/ios/DataModels/PrimerSettingsRN.swift +70 -147
  28. package/ios/DataModels/PrimerThemeRN.swift +1 -10
  29. package/ios/RNTPrimer.m +26 -12
  30. package/ios/RNTPrimer.swift +295 -249
  31. package/ios/{Core/ReactNative-Bridging-Header.h → ReactNative-Bridging-Header.h} +0 -1
  32. package/ios/ReactNative.xcodeproj/project.pbxproj +14 -14
  33. package/lib/commonjs/Primer.js +201 -150
  34. package/lib/commonjs/Primer.js.map +1 -1
  35. package/lib/commonjs/RNPrimer.js +102 -41
  36. package/lib/commonjs/RNPrimer.js.map +1 -1
  37. package/lib/commonjs/index.js +110 -24
  38. package/lib/commonjs/index.js.map +1 -1
  39. package/lib/commonjs/models/{primer.js → Primer.js} +1 -1
  40. package/lib/commonjs/{headless_checkout/types.js.map → models/Primer.js.map} +0 -0
  41. package/lib/commonjs/models/PrimerCheckoutData.js +9 -0
  42. package/lib/commonjs/models/PrimerCheckoutData.js.map +1 -0
  43. package/lib/commonjs/models/PrimerCheckoutPaymentMethodData.js +2 -0
  44. package/lib/commonjs/models/{action-request.js.map → PrimerCheckoutPaymentMethodData.js.map} +0 -0
  45. package/lib/commonjs/models/PrimerClientSession.js +2 -0
  46. package/lib/commonjs/models/{client-session-actions-request.js.map → PrimerClientSession.js.map} +0 -0
  47. package/lib/commonjs/models/{utils/countryCode.js → PrimerCountryCode.js} +1 -1
  48. package/lib/commonjs/models/PrimerCountryCode.js.map +1 -0
  49. package/lib/commonjs/models/{utils/currencyCode.js → PrimerCurrencyCode.js} +1 -1
  50. package/lib/commonjs/models/PrimerCurrencyCode.js.map +1 -0
  51. package/lib/commonjs/models/PrimerError.js +28 -0
  52. package/lib/commonjs/models/PrimerError.js.map +1 -0
  53. package/lib/commonjs/models/PrimerPaymentMethodTokenData.js +14 -0
  54. package/lib/commonjs/models/PrimerPaymentMethodTokenData.js.map +1 -0
  55. package/lib/commonjs/models/PrimerSessionIntent.js +14 -0
  56. package/lib/commonjs/models/PrimerSessionIntent.js.map +1 -0
  57. package/lib/commonjs/models/{primer-config.js → PrimerSettings.js} +1 -1
  58. package/lib/commonjs/models/{primer-callbacks.js.map → PrimerSettings.js.map} +0 -0
  59. package/lib/commonjs/models/PrimerTheme.js +2 -0
  60. package/lib/commonjs/models/{primer-config.js.map → PrimerTheme.js.map} +0 -0
  61. package/lib/commonjs/utils/index.js.map +1 -1
  62. package/lib/module/Primer.js +201 -137
  63. package/lib/module/Primer.js.map +1 -1
  64. package/lib/module/RNPrimer.js +102 -41
  65. package/lib/module/RNPrimer.js.map +1 -1
  66. package/lib/module/index.js +9 -5
  67. package/lib/module/index.js.map +1 -1
  68. package/lib/module/models/Primer.js +2 -0
  69. package/lib/{commonjs/models/primer-request.js.map → module/models/Primer.js.map} +0 -0
  70. package/lib/module/models/PrimerCheckoutData.js +7 -0
  71. package/lib/module/models/PrimerCheckoutData.js.map +1 -0
  72. package/lib/module/models/PrimerCheckoutPaymentMethodData.js +2 -0
  73. package/lib/{commonjs/models/primer-settings.js.map → module/models/PrimerCheckoutPaymentMethodData.js.map} +0 -0
  74. package/lib/module/models/PrimerClientSession.js +2 -0
  75. package/lib/{commonjs/models/primer-theme.js.map → module/models/PrimerClientSession.js.map} +0 -0
  76. package/lib/module/models/{utils/countryCode.js → PrimerCountryCode.js} +1 -1
  77. package/lib/module/models/PrimerCountryCode.js.map +1 -0
  78. package/lib/module/models/{utils/currencyCode.js → PrimerCurrencyCode.js} +1 -1
  79. package/lib/module/models/PrimerCurrencyCode.js.map +1 -0
  80. package/lib/module/models/PrimerError.js +19 -0
  81. package/lib/module/models/PrimerError.js.map +1 -0
  82. package/lib/module/models/PrimerPaymentMethodTokenData.js +7 -0
  83. package/lib/module/models/PrimerPaymentMethodTokenData.js.map +1 -0
  84. package/lib/module/models/PrimerSessionIntent.js +7 -0
  85. package/lib/module/models/PrimerSessionIntent.js.map +1 -0
  86. package/lib/module/models/PrimerSettings.js +2 -0
  87. package/lib/{commonjs/models/primer.js.map → module/models/PrimerSettings.js.map} +0 -0
  88. package/lib/module/models/PrimerTheme.js +2 -0
  89. package/lib/module/{headless_checkout/types.js.map → models/PrimerTheme.js.map} +0 -0
  90. package/lib/module/utils/index.js.map +1 -1
  91. package/lib/typescript/Primer.d.ts +2 -15
  92. package/lib/typescript/RNPrimer.d.ts +16 -9
  93. package/lib/typescript/index.d.ts +9 -5
  94. package/lib/typescript/models/Primer.d.ts +26 -0
  95. package/lib/typescript/models/PrimerCheckoutData.d.ts +15 -0
  96. package/lib/typescript/models/PrimerCheckoutPaymentMethodData.d.ts +5 -0
  97. package/lib/typescript/models/PrimerClientSession.d.ts +45 -0
  98. package/lib/typescript/models/{utils/countryCode.d.ts → PrimerCountryCode.d.ts} +1 -1
  99. package/lib/typescript/models/{utils/currencyCode.d.ts → PrimerCurrencyCode.d.ts} +1 -1
  100. package/lib/typescript/models/PrimerError.d.ts +11 -0
  101. package/lib/typescript/models/PrimerPaymentMethodTokenData.d.ts +116 -0
  102. package/lib/typescript/models/PrimerSessionIntent.d.ts +4 -0
  103. package/lib/typescript/models/PrimerSettings.d.ts +73 -0
  104. package/lib/typescript/models/{primer-theme.d.ts → PrimerTheme.d.ts} +1 -1
  105. package/lib/typescript/utils/index.d.ts +1 -1
  106. package/package.json +1 -1
  107. package/primer-io-react-native.podspec +1 -1
  108. package/src/Primer.ts +228 -172
  109. package/src/RNPrimer.ts +135 -51
  110. package/src/index.tsx +33 -7
  111. package/src/models/Primer.ts +35 -0
  112. package/src/models/PrimerCheckoutData.ts +18 -0
  113. package/src/models/PrimerCheckoutPaymentMethodData.ts +5 -0
  114. package/src/models/PrimerClientSession.ts +53 -0
  115. package/src/models/{utils/countryCode.ts → PrimerCountryCode.ts} +1 -1
  116. package/src/models/{utils/currencyCode.ts → PrimerCurrencyCode.ts} +1 -1
  117. package/src/models/PrimerError.ts +20 -0
  118. package/src/models/PrimerPaymentMethodTokenData.ts +130 -0
  119. package/src/models/PrimerSessionIntent.ts +4 -0
  120. package/src/models/PrimerSettings.ts +93 -0
  121. package/src/models/{primer-theme.ts → PrimerTheme.ts} +1 -1
  122. package/src/utils/index.ts +1 -1
  123. package/android/src/main/java/com/primerioreactnative/PrimerCardNumberEditTextManager.kt +0 -83
  124. package/android/src/main/java/com/primerioreactnative/PrimerHeadlessUniversalCheckout.kt +0 -198
  125. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerEventsRN.kt +0 -11
  126. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerIntentRN.kt +0 -80
  127. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerOnClientSessionActionsRequestRN.kt +0 -65
  128. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerRequestRN.kt +0 -9
  129. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerThemeRN.kt +0 -51
  130. package/android/src/main/java/com/primerioreactnative/huc/assets/AssetsManager.kt +0 -56
  131. package/android/src/main/java/com/primerioreactnative/huc/events/PrimerHeadlessUniversalCheckoutEvent.kt +0 -11
  132. package/android/src/main/java/com/primerioreactnative/huc/extensions/Map.kt +0 -10
  133. package/android/src/main/java/com/primerioreactnative/utils/Keys.kt +0 -7
  134. package/android/src/main/java/com/primerioreactnative/utils/PrimerEventQueueRN.kt +0 -30
  135. package/ios/DataModels/PrimerIntentRN.swift +0 -10
  136. package/ios/DataModels/PrimerRequestRN.swift +0 -14
  137. package/ios/Headless Universal Checkout/RNTPrimerCardNumberInputElementManager.m +0 -23
  138. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.m +0 -30
  139. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.swift +0 -241
  140. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.m +0 -14
  141. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.swift +0 -113
  142. package/lib/commonjs/PrimerInput.js +0 -80
  143. package/lib/commonjs/PrimerInput.js.map +0 -1
  144. package/lib/commonjs/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js +0 -14
  145. package/lib/commonjs/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js.map +0 -1
  146. package/lib/commonjs/headless_checkout/NativePrimerHeadlessUniversalCheckout.js +0 -110
  147. package/lib/commonjs/headless_checkout/NativePrimerHeadlessUniversalCheckout.js.map +0 -1
  148. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js +0 -117
  149. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +0 -1
  150. package/lib/commonjs/headless_checkout/types.js +0 -2
  151. package/lib/commonjs/models/action-request.js +0 -2
  152. package/lib/commonjs/models/client-session-actions-request.js +0 -2
  153. package/lib/commonjs/models/payment-instrument-token.js +0 -30
  154. package/lib/commonjs/models/payment-instrument-token.js.map +0 -1
  155. package/lib/commonjs/models/primer-callbacks.js +0 -6
  156. package/lib/commonjs/models/primer-error.js +0 -4
  157. package/lib/commonjs/models/primer-error.js.map +0 -1
  158. package/lib/commonjs/models/primer-intent.js +0 -4
  159. package/lib/commonjs/models/primer-intent.js.map +0 -1
  160. package/lib/commonjs/models/primer-request.js +0 -2
  161. package/lib/commonjs/models/primer-settings.js +0 -6
  162. package/lib/commonjs/models/primer-theme.js +0 -2
  163. package/lib/commonjs/models/utils/countryCode.js.map +0 -1
  164. package/lib/commonjs/models/utils/currencyCode.js.map +0 -1
  165. package/lib/commonjs/models/utils/redirectScheme.js +0 -4
  166. package/lib/commonjs/models/utils/redirectScheme.js.map +0 -1
  167. package/lib/module/PrimerInput.js +0 -46
  168. package/lib/module/PrimerInput.js.map +0 -1
  169. package/lib/module/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js +0 -5
  170. package/lib/module/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js.map +0 -1
  171. package/lib/module/headless_checkout/NativePrimerHeadlessUniversalCheckout.js +0 -98
  172. package/lib/module/headless_checkout/NativePrimerHeadlessUniversalCheckout.js.map +0 -1
  173. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js +0 -100
  174. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +0 -1
  175. package/lib/module/headless_checkout/types.js +0 -2
  176. package/lib/module/models/action-request.js +0 -2
  177. package/lib/module/models/action-request.js.map +0 -1
  178. package/lib/module/models/client-session-actions-request.js +0 -2
  179. package/lib/module/models/client-session-actions-request.js.map +0 -1
  180. package/lib/module/models/payment-instrument-token.js +0 -28
  181. package/lib/module/models/payment-instrument-token.js.map +0 -1
  182. package/lib/module/models/primer-callbacks.js +0 -2
  183. package/lib/module/models/primer-callbacks.js.map +0 -1
  184. package/lib/module/models/primer-config.js +0 -2
  185. package/lib/module/models/primer-config.js.map +0 -1
  186. package/lib/module/models/primer-error.js +0 -2
  187. package/lib/module/models/primer-error.js.map +0 -1
  188. package/lib/module/models/primer-intent.js +0 -2
  189. package/lib/module/models/primer-intent.js.map +0 -1
  190. package/lib/module/models/primer-request.js +0 -2
  191. package/lib/module/models/primer-request.js.map +0 -1
  192. package/lib/module/models/primer-settings.js +0 -2
  193. package/lib/module/models/primer-settings.js.map +0 -1
  194. package/lib/module/models/primer-theme.js +0 -2
  195. package/lib/module/models/primer-theme.js.map +0 -1
  196. package/lib/module/models/primer.js +0 -2
  197. package/lib/module/models/primer.js.map +0 -1
  198. package/lib/module/models/utils/countryCode.js.map +0 -1
  199. package/lib/module/models/utils/currencyCode.js.map +0 -1
  200. package/lib/module/models/utils/redirectScheme.js +0 -2
  201. package/lib/module/models/utils/redirectScheme.js.map +0 -1
  202. package/lib/typescript/PrimerInput.d.ts +0 -15
  203. package/lib/typescript/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.d.ts +0 -1
  204. package/lib/typescript/headless_checkout/NativePrimerHeadlessUniversalCheckout.d.ts +0 -13
  205. package/lib/typescript/headless_checkout/PrimerHeadlessUniversalCheckout.d.ts +0 -13
  206. package/lib/typescript/headless_checkout/types.d.ts +0 -16
  207. package/lib/typescript/models/action-request.d.ts +0 -10
  208. package/lib/typescript/models/client-session-actions-request.d.ts +0 -15
  209. package/lib/typescript/models/payment-instrument-token.d.ts +0 -76
  210. package/lib/typescript/models/primer-callbacks.d.ts +0 -10
  211. package/lib/typescript/models/primer-config.d.ts +0 -44
  212. package/lib/typescript/models/primer-error.d.ts +0 -8
  213. package/lib/typescript/models/primer-intent.d.ts +0 -13
  214. package/lib/typescript/models/primer-request.d.ts +0 -7
  215. package/lib/typescript/models/primer-settings.d.ts +0 -65
  216. package/lib/typescript/models/primer.d.ts +0 -33
  217. package/lib/typescript/models/utils/redirectScheme.d.ts +0 -3
  218. package/src/PrimerInput.tsx +0 -73
  219. package/src/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.tsx +0 -2
  220. package/src/headless_checkout/NativePrimerHeadlessUniversalCheckout.ts +0 -132
  221. package/src/headless_checkout/PrimerHeadlessUniversalCheckout.ts +0 -140
  222. package/src/headless_checkout/types.ts +0 -18
  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,170 +1,254 @@
1
1
  package com.primerioreactnative
2
2
 
3
- import android.util.Log
4
3
  import com.primerioreactnative.datamodels.*
5
- import com.primerioreactnative.utils.Keys
4
+ import com.primerioreactnative.extensions.toPrimerCheckoutDataRN
5
+ import com.primerioreactnative.extensions.toPrimerClientSessionRN
6
+ import com.primerioreactnative.extensions.toPrimerPaymentMethodDataRN
6
7
  import com.primerioreactnative.utils.PrimerImplementedRNCallbacks
7
- import com.primerioreactnative.utils.asError
8
8
  import com.primerioreactnative.utils.errorTo
9
- import io.primer.android.CheckoutEventListener
10
- import io.primer.android.completion.ResumeHandler
11
- import io.primer.android.events.CheckoutEvent
9
+ import io.primer.android.PrimerCheckoutListener
10
+ import io.primer.android.completion.PrimerErrorDecisionHandler
11
+ import io.primer.android.completion.PrimerPaymentCreationDecisionHandler
12
+ import io.primer.android.completion.PrimerResumeDecisionHandler
13
+ import io.primer.android.domain.PrimerCheckoutData
14
+ import io.primer.android.domain.action.models.PrimerClientSession
15
+ import io.primer.android.domain.error.models.PrimerError
16
+ import io.primer.android.domain.tokenization.models.PrimerPaymentMethodData
17
+ import io.primer.android.domain.tokenization.models.PrimerPaymentMethodTokenData
12
18
  import kotlinx.serialization.encodeToString
13
19
  import kotlinx.serialization.json.Json
14
20
  import org.json.JSONObject
15
21
 
16
- class PrimerRNEventListener : CheckoutEventListener {
22
+ class PrimerRNEventListener : PrimerCheckoutListener {
17
23
 
18
- private var clientTokenCallback: ((String?, PrimerErrorRN?) -> Unit)? = null
19
- private var onClientSessionActions: ((String?, PrimerErrorRN?) -> Unit)? = null
20
- private var onTokenizeSuccess: ((String?, PrimerErrorRN?) -> Unit)? = null
21
- private var onResumeSuccess: ((String?, PrimerErrorRN?) -> Unit)? = null
24
+ private var paymentCreationDecisionHandler: ((errorMessage: String?) -> Unit)? = null
25
+ private var primerErrorDecisionHandler: ((errorMessage: String?) -> Unit)? = null
26
+ private var tokenizeSuccessDecisionHandler: ((resumeToken: String?, errorMessage: String?) -> Unit)? =
27
+ null
28
+ private var resumeSuccessDecisionHandler: ((resumeToken: String?, errorMessage: String?) -> Unit)? =
29
+ null
22
30
  private var implementedRNCallbacks: PrimerImplementedRNCallbacks? = null
23
31
 
24
- private var resumeHandler: ResumeHandler? = null
25
-
26
32
  var sendEvent: ((eventName: String, paramsJson: JSONObject?) -> Unit)? = null
27
33
  var sendError: ((error: PrimerErrorRN) -> Unit)? = null
34
+ var sendErrorWithCheckoutData: ((error: PrimerErrorRN, checkoutData: PrimerCheckoutDataRN?) -> Unit)? =
35
+ null
36
+
37
+ override fun onCheckoutCompleted(checkoutData: PrimerCheckoutData) {
38
+ if (implementedRNCallbacks?.isOnCheckoutCompleteImplemented == true) {
39
+ sendEvent?.invoke(
40
+ PrimerEvents.ON_CHECKOUT_COMPLETE.eventName,
41
+ JSONObject(Json.encodeToString(checkoutData.toPrimerCheckoutDataRN()))
42
+ )
43
+ } else {
44
+ sendError?.invoke(
45
+ ErrorTypeRN.NativeBridgeFailed
46
+ errorTo "Callback [onCheckoutComplete] should be implemented."
47
+ )
48
+ }
49
+ }
28
50
 
29
- override fun onClientSessionActions(event: CheckoutEvent.OnClientSessionActions) {
30
- val token = PrimerOnClientSessionActionsRequestRN.build(event.data)
31
- val request = JSONObject(Json.encodeToString(token))
32
-
33
- onClientSessionActions = { newClientToken, err ->
34
- when {
35
- err != null -> resumeHandler?.handleError(err.asError())
36
- newClientToken != null -> resumeHandler?.handleNewClientToken(newClientToken)
37
- else -> resumeHandler?.handleSuccess()
51
+ override fun onBeforePaymentCreated(
52
+ paymentMethodData: PrimerPaymentMethodData,
53
+ decisionHandler: PrimerPaymentCreationDecisionHandler
54
+ ) {
55
+ if (implementedRNCallbacks?.isOnBeforePaymentCreateImplemented == true) {
56
+ paymentCreationDecisionHandler = { errorMessage ->
57
+ when {
58
+ errorMessage != null -> decisionHandler.abortPaymentCreation(errorMessage.ifBlank { null })
59
+ else -> decisionHandler.continuePaymentCreation()
60
+ }
38
61
  }
62
+ sendEvent?.invoke(
63
+ PrimerEvents.ON_BEFORE_PAYMENT_CREATE.eventName,
64
+ JSONObject(Json.encodeToString(paymentMethodData.toPrimerPaymentMethodDataRN()))
65
+ )
66
+ } else {
67
+ super.onBeforePaymentCreated(paymentMethodData, decisionHandler)
39
68
  }
69
+ }
40
70
 
41
- event.resumeHandler.handleClientToken(null)
42
- sendEvent?.invoke(PrimerEventsRN.OnClientSessionActions.string, request)
43
- }
44
-
45
- override fun onCheckoutEvent(e: CheckoutEvent) {
46
- when (e) {
47
- is CheckoutEvent.TokenizationSuccess -> {
48
- val token = PrimerPaymentInstrumentTokenRN.fromPaymentMethodToken(e.data)
49
- val request = JSONObject(Json.encodeToString(token))
50
- onTokenizeSuccess = { newClientToken, err ->
51
- when {
52
- err != null -> resumeHandler?.handleError(err.asError())
53
- newClientToken != null -> resumeHandler?.handleNewClientToken(newClientToken)
54
- else -> resumeHandler?.handleSuccess()
55
- }
56
- }
71
+ override fun onBeforeClientSessionUpdated() {
72
+ if (implementedRNCallbacks?.isOnBeforeClientSessionUpdateImplemented == true) {
73
+ sendEvent?.invoke(
74
+ PrimerEvents.ON_BEFORE_CLIENT_SESSION_UPDATE.eventName,
75
+ null
76
+ )
77
+ } else {
78
+ super.onBeforeClientSessionUpdated()
79
+ }
80
+ }
57
81
 
58
- resumeHandler = e.resumeHandler
59
- sendEvent?.invoke(PrimerEventsRN.OnTokenizeSuccessCallback.string, request)
60
- }
61
- is CheckoutEvent.ResumeSuccess -> {
62
- val token = e.resumeToken
63
- if (implementedRNCallbacks?.isOnResumeSuccessImplemented == true) {
64
- onResumeSuccess = { newClientToken, err ->
65
- when {
66
- err != null -> resumeHandler?.handleError(err.asError())
67
- newClientToken != null -> resumeHandler?.handleNewClientToken(newClientToken)
68
- else -> resumeHandler?.handleSuccess()
69
- }
70
- }
71
-
72
- resumeHandler = e.resumeHandler
73
- val resumeToken = mapOf(Keys.RESUME_TOKEN to token)
74
- sendEvent?.invoke(
75
- PrimerEventsRN.OnResumeSuccess.string,
76
- JSONObject(Json.encodeToString(resumeToken))
77
- )
78
- } else {
79
- sendError?.invoke(ErrorTypeRN.InitFailed
80
- errorTo "Callback [onResumeSuccess] should had been implemented.")
81
- }
82
- }
83
- is CheckoutEvent.ApiError -> {
84
- Log.e("PrimerRN", "ApiError: ${e.data}")
85
- val exception = ErrorTypeRN.CheckoutFlowFailed errorTo e.data.description
86
- sendError?.invoke(exception)
87
- }
88
- is CheckoutEvent.TokenAddedToVault -> {
89
- val token = PrimerPaymentInstrumentTokenRN.fromPaymentMethodToken(e.data)
90
- val request = JSONObject(Json.encodeToString(token))
91
- sendEvent?.invoke(
92
- PrimerEventsRN.OnVaultSuccess.string,
93
- request
94
- )
95
- }
96
- is CheckoutEvent.TokenSelected -> {
97
- val token = PrimerPaymentInstrumentTokenRN.fromPaymentMethodToken(e.data)
98
- val request = JSONObject(Json.encodeToString(token))
99
- onTokenizeSuccess = { newClientToken, err ->
100
- when {
101
- err != null -> resumeHandler?.handleError(err.asError())
102
- newClientToken != null -> resumeHandler?.handleNewClientToken(newClientToken)
103
- else -> resumeHandler?.handleSuccess()
104
- }
105
- }
82
+ override fun onClientSessionUpdated(clientSession: PrimerClientSession) {
83
+ if (implementedRNCallbacks?.isOnClientSessionUpdateImplemented == true) {
84
+ sendEvent?.invoke(
85
+ PrimerEvents.ON_CLIENT_SESSION_UPDATE.eventName,
86
+ JSONObject(Json.encodeToString(clientSession.toPrimerClientSessionRN()))
87
+ )
88
+ } else {
89
+ super.onClientSessionUpdated(clientSession)
90
+ }
91
+ }
106
92
 
107
- resumeHandler = e.resumeHandler
108
- sendEvent?.invoke(PrimerEventsRN.OnTokenizeSuccessCallback.string, request)
109
- }
110
- is CheckoutEvent.Exit -> {
111
- removeCallbacksAndHandlers()
112
- if (implementedRNCallbacks?.isOnCheckoutDismissedImplemented == true) {
113
- sendEvent?.invoke(
114
- PrimerEventsRN.OnCheckoutDismissed.string,
115
- null
116
- )
117
- } else {
118
- sendError?.invoke(ErrorTypeRN.InitFailed
119
- errorTo "Callback [onCheckoutDismissed] should had been implemented.")
120
- }
121
- }
122
- is CheckoutEvent.TokenizationError -> {
123
- if (implementedRNCallbacks?.isCheckoutFailedImplemented == true) {
124
- Log.e("PrimerRN", "TokenizationError: ${e.data}")
125
- val exception = ErrorTypeRN.TokenizationFailed errorTo e.data.description
126
- sendError?.invoke(exception)
127
- } else {
128
- sendError?.invoke(ErrorTypeRN.InitFailed
129
- errorTo "Callback [onError] should had been implemented.")
93
+ override fun onTokenizeSuccess(
94
+ paymentMethodTokenData: PrimerPaymentMethodTokenData,
95
+ decisionHandler: PrimerResumeDecisionHandler
96
+ ) {
97
+ if (implementedRNCallbacks?.isOnTokenizeSuccessImplemented == true) {
98
+ val token = PrimerPaymentInstrumentTokenRN.fromPaymentMethodToken(paymentMethodTokenData)
99
+ val request = JSONObject(Json.encodeToString(token))
100
+ tokenizeSuccessDecisionHandler = { newClientToken, err ->
101
+ when {
102
+ err != null -> decisionHandler.handleFailure(err.ifBlank { null })
103
+ newClientToken != null -> decisionHandler.continueWithNewClientToken(newClientToken)
104
+ else -> decisionHandler.handleSuccess()
130
105
  }
131
106
  }
132
- else -> Unit
107
+ sendEvent?.invoke(PrimerEvents.ON_TOKENIZE_SUCCESS.eventName, request)
108
+ } else {
109
+ sendError?.invoke(
110
+ ErrorTypeRN.NativeBridgeFailed
111
+ errorTo "Callback [onTokenizeSuccess] should be implemented."
112
+ )
133
113
  }
134
114
  }
135
115
 
136
- fun onClientTokenCallback(clientToken: String?, error: PrimerErrorRN?) {
137
- this.clientTokenCallback?.invoke(clientToken, error)
138
- sendEvent?.invoke(PrimerEventsRN.OnClientTokenCallback.string, null)
116
+ override fun onResumeSuccess(
117
+ resumeToken: String,
118
+ decisionHandler: PrimerResumeDecisionHandler
119
+ ) {
120
+ if (implementedRNCallbacks?.isOnResumeSuccessImplemented == true) {
121
+ resumeSuccessDecisionHandler = { newClientToken, err ->
122
+ when {
123
+ err != null -> decisionHandler.handleFailure(err.ifBlank { null })
124
+ newClientToken != null -> decisionHandler.continueWithNewClientToken(newClientToken)
125
+ else -> decisionHandler.handleSuccess()
126
+ }
127
+ }
128
+
129
+ val resumeToken = mapOf(Keys.RESUME_TOKEN to resumeToken)
130
+ sendEvent?.invoke(
131
+ PrimerEvents.ON_RESUME_SUCCESS.eventName,
132
+ JSONObject(Json.encodeToString(resumeToken))
133
+ )
134
+ } else {
135
+ sendError?.invoke(
136
+ ErrorTypeRN.NativeBridgeFailed
137
+ errorTo "Callback [onResumeSuccess] should be implemented."
138
+ )
139
+ }
139
140
  }
140
141
 
141
- fun onClientSessionActions(clientToken: String?, error: PrimerErrorRN?) {
142
- if (implementedRNCallbacks?.isClientSessionActionsImplemented == true) {
143
- this.onClientSessionActions?.invoke(clientToken, error)
142
+ override fun onDismissed() {
143
+ if (implementedRNCallbacks?.isOnDismissImplemented == true) {
144
+ sendEvent?.invoke(
145
+ PrimerEvents.ON_DISMISS.eventName,
146
+ null
147
+ )
144
148
  }
149
+ removeCallbacksAndHandlers()
145
150
  }
146
151
 
147
- fun onTokenizeSuccess(clientToken: String?, error: PrimerErrorRN?) {
148
- this.onTokenizeSuccess?.invoke(clientToken, error)
152
+ override fun onFailed(
153
+ error: PrimerError,
154
+ checkoutData: PrimerCheckoutData?,
155
+ errorHandler: PrimerErrorDecisionHandler?
156
+ ) {
157
+ if (implementedRNCallbacks?.isOnErrorImplemented == true) {
158
+ primerErrorDecisionHandler = { errorMessage: String? ->
159
+ errorHandler?.showErrorMessage(errorMessage?.ifBlank { null })
160
+ }
161
+ sendErrorWithCheckoutData?.invoke(
162
+ PrimerErrorRN(
163
+ error.errorId,
164
+ error.description,
165
+ error.recoverySuggestion
166
+ ), checkoutData?.toPrimerCheckoutDataRN()
167
+ )
168
+ } else {
169
+ super.onFailed(error, checkoutData, errorHandler)
170
+ }
149
171
  }
150
172
 
151
- fun onResumeSuccess(clientToken: String?, error: PrimerErrorRN?) {
152
- if (implementedRNCallbacks?.isOnResumeSuccessImplemented == true) {
153
- this.onResumeSuccess?.invoke(clientToken, error)
173
+ override fun onFailed(error: PrimerError, errorHandler: PrimerErrorDecisionHandler?) {
174
+ if (implementedRNCallbacks?.isOnErrorImplemented == true) {
175
+ primerErrorDecisionHandler = { errorMessage: String? ->
176
+ errorHandler?.showErrorMessage(errorMessage)
177
+ }
178
+ sendError?.invoke(PrimerErrorRN(error.errorId, error.description, error.recoverySuggestion))
154
179
  } else {
155
- sendError?.invoke(ErrorTypeRN.CheckoutFlowFailed
156
- errorTo "Callback [onResumeSuccess] should had been implemented.")
180
+ super.onFailed(error, errorHandler)
157
181
  }
158
182
  }
159
183
 
160
- fun removeCallbacksAndHandlers() {
161
- clientTokenCallback = null
162
- onClientSessionActions = null
163
- onTokenizeSuccess = null
164
- onResumeSuccess = null
184
+ // region tokenization handlers
185
+ fun handleTokenizationNewClientToken(newClientToken: String) {
186
+ tokenizeSuccessDecisionHandler?.invoke(newClientToken, null)
187
+ tokenizeSuccessDecisionHandler = null
188
+ }
189
+
190
+ fun handleTokenizationSuccess() {
191
+ tokenizeSuccessDecisionHandler?.invoke(null, null)
192
+ tokenizeSuccessDecisionHandler = null
165
193
  }
166
194
 
195
+ fun handleTokenizationFailure(errorMessage: String) {
196
+ tokenizeSuccessDecisionHandler?.invoke(
197
+ null,
198
+ errorMessage.ifBlank { null }
199
+ )
200
+ tokenizeSuccessDecisionHandler = null
201
+ }
202
+ // endregion
203
+
204
+ // region resume handlers
205
+ fun handleResumeNewClientToken(newClientToken: String) {
206
+ resumeSuccessDecisionHandler?.invoke(newClientToken, null)
207
+ resumeSuccessDecisionHandler = null
208
+ }
209
+
210
+ fun handleResumeSuccess() {
211
+ resumeSuccessDecisionHandler?.invoke(null, null)
212
+ resumeSuccessDecisionHandler = null
213
+ }
214
+
215
+ fun handleResumeFailure(errorMessage: String) {
216
+ resumeSuccessDecisionHandler?.invoke(
217
+ null,
218
+ errorMessage.ifBlank { null }
219
+ )
220
+ resumeSuccessDecisionHandler = null
221
+ }
222
+ // endregion
223
+
224
+ // region payment create handlers
225
+ fun handlePaymentCreationContinue() {
226
+ paymentCreationDecisionHandler?.invoke(null)
227
+ paymentCreationDecisionHandler = null
228
+ }
229
+
230
+ fun handlePaymentCreationAbort(errorMessage: String) {
231
+ paymentCreationDecisionHandler?.invoke(errorMessage)
232
+ paymentCreationDecisionHandler = null
233
+ }
234
+ // endregion
235
+
236
+ // region error handlers
237
+ fun handleErrorMessage(errorMessage: String) {
238
+ primerErrorDecisionHandler?.invoke(errorMessage)
239
+ primerErrorDecisionHandler = null
240
+ }
241
+ // endregion
242
+
167
243
  fun setImplementedCallbacks(implementedRNCallbacks: PrimerImplementedRNCallbacks) {
168
244
  this.implementedRNCallbacks = implementedRNCallbacks
169
245
  }
246
+
247
+ private fun removeCallbacksAndHandlers() {
248
+ paymentCreationDecisionHandler = null
249
+ primerErrorDecisionHandler = null
250
+ tokenizeSuccessDecisionHandler = null
251
+ resumeSuccessDecisionHandler = null
252
+ implementedRNCallbacks = null
253
+ }
170
254
  }
@@ -4,26 +4,15 @@ import com.facebook.react.ReactPackage
4
4
  import com.facebook.react.bridge.NativeModule
5
5
  import com.facebook.react.bridge.ReactApplicationContext
6
6
  import com.facebook.react.uimanager.ViewManager
7
- import kotlinx.serialization.json.Json
8
7
 
9
- class ReactNativePackage : ReactPackage {
10
-
11
- private val json = Json { ignoreUnknownKeys = true }
12
8
 
9
+ class ReactNativePackage : ReactPackage {
13
10
  override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
14
- return listOf(
15
- PrimerRN(reactContext),
16
- PrimerHeadlessUniversalCheckout(reactContext, json)
17
- )
11
+ return listOf(PrimerRN(reactContext))
18
12
  }
19
13
 
20
14
  override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
21
- return mutableListOf(
22
- PrimerCardNumberEditTextManager(),
23
- PrimerCardholderNameEditTextManager(),
24
- PrimerExpiryEditTextManager(),
25
- PrimerCvvEditTextManager(),
26
- )
15
+ return emptyList()
27
16
  }
28
17
  }
29
18
 
@@ -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,14 @@ 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"),
21
15
  }
@@ -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)