@primer-io/react-native 0.15.4 → 2.0.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 (203) hide show
  1. package/README.md +114 -24
  2. package/android/build.gradle +7 -2
  3. package/android/gradle.properties +3 -3
  4. package/android/src/main/java/com/primerioreactnative/PrimerRN.kt +122 -143
  5. package/android/src/main/java/com/primerioreactnative/PrimerRNEventListener.kt +212 -127
  6. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerCheckoutDataRN.kt +12 -0
  7. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerClientSessionRN.kt +54 -0
  8. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerErrorRN.kt +3 -7
  9. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerEvents.kt +13 -0
  10. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerPaymentInstrumentTokenRN.kt +4 -4
  11. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerPaymentMethodDataRN.kt +8 -0
  12. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerSettingsRN.kt +43 -125
  13. package/android/src/main/java/com/primerioreactnative/extensions/Payment.kt +6 -0
  14. package/android/src/main/java/com/primerioreactnative/extensions/PrimerAddress.kt +15 -0
  15. package/android/src/main/java/com/primerioreactnative/extensions/PrimerCheckoutData.kt +7 -0
  16. package/android/src/main/java/com/primerioreactnative/extensions/PrimerClientSession.kt +15 -0
  17. package/android/src/main/java/com/primerioreactnative/extensions/PrimerCustomer.kt +13 -0
  18. package/android/src/main/java/com/primerioreactnative/extensions/PrimerLineItem.kt +8 -0
  19. package/android/src/main/java/com/primerioreactnative/extensions/PrimerOrder.kt +6 -0
  20. package/android/src/main/java/com/primerioreactnative/extensions/PrimerPaymentMethodData.kt +7 -0
  21. package/android/src/main/java/com/primerioreactnative/utils/ErrorHelper.kt +1 -3
  22. package/android/src/main/java/com/primerioreactnative/utils/JsonConverter.kt +45 -0
  23. package/android/src/main/java/com/primerioreactnative/utils/PrimerImplementedRNCallbacks.kt +16 -6
  24. package/ios/DataModels/ImplementedRNCallbacks.swift +31 -0
  25. package/ios/DataModels/PrimerErrorRN.swift +0 -17
  26. package/ios/DataModels/PrimerSettingsRN.swift +69 -150
  27. package/ios/DataModels/PrimerThemeRN.swift +1 -10
  28. package/ios/{Pods/Manifest.lock → Podfile.lock} +1 -1
  29. package/ios/RNTPrimer.m +26 -12
  30. package/ios/RNTPrimer.swift +297 -237
  31. package/ios/ReactNative.xcodeproj/project.pbxproj +14 -14
  32. package/lib/commonjs/Primer.js +187 -176
  33. package/lib/commonjs/Primer.js.map +1 -1
  34. package/lib/commonjs/RNPrimer.js +102 -40
  35. package/lib/commonjs/RNPrimer.js.map +1 -1
  36. package/lib/commonjs/index.js +117 -4
  37. package/lib/commonjs/index.js.map +1 -1
  38. package/lib/commonjs/models/Primer.js +6 -0
  39. package/lib/commonjs/models/{action-request.js.map → Primer.js.map} +0 -0
  40. package/lib/commonjs/models/PrimerCheckoutData.js +9 -0
  41. package/lib/commonjs/models/PrimerCheckoutData.js.map +1 -0
  42. package/lib/commonjs/models/PrimerCheckoutPaymentMethodData.js +2 -0
  43. package/lib/commonjs/models/{client-session-actions-request.js.map → PrimerCheckoutPaymentMethodData.js.map} +0 -0
  44. package/lib/commonjs/models/PrimerClientSession.js +2 -0
  45. package/lib/commonjs/models/{primer-callbacks.js.map → PrimerClientSession.js.map} +0 -0
  46. package/lib/commonjs/models/{utils/countryCode.js → PrimerCountryCode.js} +1 -1
  47. package/lib/commonjs/models/PrimerCountryCode.js.map +1 -0
  48. package/lib/commonjs/models/{utils/currencyCode.js → PrimerCurrencyCode.js} +1 -1
  49. package/lib/commonjs/models/PrimerCurrencyCode.js.map +1 -0
  50. package/lib/commonjs/models/PrimerError.js +28 -0
  51. package/lib/commonjs/models/PrimerError.js.map +1 -0
  52. package/lib/commonjs/models/PrimerPaymentMethodTokenData.js +14 -0
  53. package/lib/commonjs/models/PrimerPaymentMethodTokenData.js.map +1 -0
  54. package/lib/commonjs/models/PrimerSessionIntent.js +14 -0
  55. package/lib/commonjs/models/PrimerSessionIntent.js.map +1 -0
  56. package/lib/commonjs/models/PrimerSettings.js +6 -0
  57. package/lib/commonjs/models/{primer-config.js.map → PrimerSettings.js.map} +0 -0
  58. package/lib/commonjs/models/PrimerTheme.js +2 -0
  59. package/lib/commonjs/models/{primer-request.js.map → PrimerTheme.js.map} +0 -0
  60. package/lib/commonjs/utils/index.js +1 -1
  61. package/lib/commonjs/utils/index.js.map +1 -1
  62. package/lib/module/Primer.js +187 -162
  63. package/lib/module/Primer.js.map +1 -1
  64. package/lib/module/RNPrimer.js +102 -40
  65. package/lib/module/RNPrimer.js.map +1 -1
  66. package/lib/module/index.js +9 -4
  67. package/lib/module/index.js.map +1 -1
  68. package/lib/module/models/Primer.js +2 -0
  69. package/lib/{commonjs/models/primer-settings.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-theme.js.map → module/models/PrimerCheckoutPaymentMethodData.js.map} +0 -0
  74. package/lib/module/models/PrimerClientSession.js +2 -0
  75. package/lib/{commonjs/models/primer.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/module/models/{action-request.js.map → PrimerSettings.js.map} +0 -0
  88. package/lib/module/models/PrimerTheme.js +2 -0
  89. package/lib/module/models/{client-session-actions-request.js.map → 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 -3
  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 +214 -196
  109. package/src/RNPrimer.ts +135 -50
  110. package/src/index.tsx +33 -6
  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/datamodels/PrimerEventsRN.kt +0 -11
  124. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerIntentRN.kt +0 -80
  125. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerOnClientSessionActionsRequestRN.kt +0 -65
  126. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerRequestRN.kt +0 -9
  127. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerThemeRN.kt +0 -51
  128. package/android/src/main/java/com/primerioreactnative/utils/PrimerEventQueueRN.kt +0 -30
  129. package/ios/DataModels/PrimerIntentRN.swift +0 -10
  130. package/ios/DataModels/PrimerRequestRN.swift +0 -14
  131. package/ios/Pods/Pods.xcodeproj/project.pbxproj +0 -344
  132. package/ios/Pods/Pods.xcodeproj/xcuserdata/aladintaleb.xcuserdatad/xcschemes/Pods-ReactNative.xcscheme +0 -60
  133. package/ios/Pods/Pods.xcodeproj/xcuserdata/aladintaleb.xcuserdatad/xcschemes/xcschememanagement.plist +0 -16
  134. package/ios/Pods/Target Support Files/Pods-ReactNative/Pods-ReactNative-acknowledgements.markdown +0 -3
  135. package/ios/Pods/Target Support Files/Pods-ReactNative/Pods-ReactNative-acknowledgements.plist +0 -29
  136. package/ios/Pods/Target Support Files/Pods-ReactNative/Pods-ReactNative-dummy.m +0 -5
  137. package/ios/Pods/Target Support Files/Pods-ReactNative/Pods-ReactNative.debug.xcconfig +0 -8
  138. package/ios/Pods/Target Support Files/Pods-ReactNative/Pods-ReactNative.release.xcconfig +0 -8
  139. package/ios/ReactNative.xcworkspace/xcuserdata/aladintaleb.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  140. package/lib/commonjs/models/action-request.js +0 -2
  141. package/lib/commonjs/models/client-session-actions-request.js +0 -2
  142. package/lib/commonjs/models/payment-instrument-token.js +0 -30
  143. package/lib/commonjs/models/payment-instrument-token.js.map +0 -1
  144. package/lib/commonjs/models/primer-callbacks.js +0 -2
  145. package/lib/commonjs/models/primer-config.js +0 -2
  146. package/lib/commonjs/models/primer-error.js +0 -4
  147. package/lib/commonjs/models/primer-error.js.map +0 -1
  148. package/lib/commonjs/models/primer-intent.js +0 -4
  149. package/lib/commonjs/models/primer-intent.js.map +0 -1
  150. package/lib/commonjs/models/primer-request.js +0 -2
  151. package/lib/commonjs/models/primer-settings.js +0 -2
  152. package/lib/commonjs/models/primer-theme.js +0 -2
  153. package/lib/commonjs/models/primer.js +0 -2
  154. package/lib/commonjs/models/utils/countryCode.js.map +0 -1
  155. package/lib/commonjs/models/utils/currencyCode.js.map +0 -1
  156. package/lib/commonjs/models/utils/redirectScheme.js +0 -4
  157. package/lib/commonjs/models/utils/redirectScheme.js.map +0 -1
  158. package/lib/module/models/action-request.js +0 -2
  159. package/lib/module/models/client-session-actions-request.js +0 -2
  160. package/lib/module/models/payment-instrument-token.js +0 -28
  161. package/lib/module/models/payment-instrument-token.js.map +0 -1
  162. package/lib/module/models/primer-callbacks.js +0 -2
  163. package/lib/module/models/primer-callbacks.js.map +0 -1
  164. package/lib/module/models/primer-config.js +0 -2
  165. package/lib/module/models/primer-config.js.map +0 -1
  166. package/lib/module/models/primer-error.js +0 -2
  167. package/lib/module/models/primer-error.js.map +0 -1
  168. package/lib/module/models/primer-intent.js +0 -2
  169. package/lib/module/models/primer-intent.js.map +0 -1
  170. package/lib/module/models/primer-request.js +0 -2
  171. package/lib/module/models/primer-request.js.map +0 -1
  172. package/lib/module/models/primer-settings.js +0 -2
  173. package/lib/module/models/primer-settings.js.map +0 -1
  174. package/lib/module/models/primer-theme.js +0 -2
  175. package/lib/module/models/primer-theme.js.map +0 -1
  176. package/lib/module/models/primer.js +0 -2
  177. package/lib/module/models/primer.js.map +0 -1
  178. package/lib/module/models/utils/countryCode.js.map +0 -1
  179. package/lib/module/models/utils/currencyCode.js.map +0 -1
  180. package/lib/module/models/utils/redirectScheme.js +0 -2
  181. package/lib/module/models/utils/redirectScheme.js.map +0 -1
  182. package/lib/typescript/models/action-request.d.ts +0 -10
  183. package/lib/typescript/models/client-session-actions-request.d.ts +0 -15
  184. package/lib/typescript/models/payment-instrument-token.d.ts +0 -76
  185. package/lib/typescript/models/primer-callbacks.d.ts +0 -10
  186. package/lib/typescript/models/primer-config.d.ts +0 -40
  187. package/lib/typescript/models/primer-error.d.ts +0 -8
  188. package/lib/typescript/models/primer-intent.d.ts +0 -13
  189. package/lib/typescript/models/primer-request.d.ts +0 -7
  190. package/lib/typescript/models/primer-settings.d.ts +0 -63
  191. package/lib/typescript/models/primer.d.ts +0 -33
  192. package/lib/typescript/models/utils/redirectScheme.d.ts +0 -3
  193. package/src/models/action-request.ts +0 -12
  194. package/src/models/client-session-actions-request.ts +0 -21
  195. package/src/models/payment-instrument-token.ts +0 -109
  196. package/src/models/primer-callbacks.ts +0 -14
  197. package/src/models/primer-config.ts +0 -50
  198. package/src/models/primer-error.ts +0 -19
  199. package/src/models/primer-intent.ts +0 -49
  200. package/src/models/primer-request.ts +0 -7
  201. package/src/models/primer-settings.ts +0 -70
  202. package/src/models/primer.ts +0 -41
  203. package/src/models/utils/redirectScheme.ts +0 -5
@@ -1,169 +1,254 @@
1
1
  package com.primerioreactnative
2
2
 
3
- import android.util.Log
4
3
  import com.primerioreactnative.datamodels.*
4
+ import com.primerioreactnative.extensions.toPrimerCheckoutDataRN
5
+ import com.primerioreactnative.extensions.toPrimerClientSessionRN
6
+ import com.primerioreactnative.extensions.toPrimerPaymentMethodDataRN
5
7
  import com.primerioreactnative.utils.PrimerImplementedRNCallbacks
6
- import com.primerioreactnative.utils.asError
7
8
  import com.primerioreactnative.utils.errorTo
8
- import io.primer.android.CheckoutEventListener
9
- import io.primer.android.completion.ResumeHandler
10
- 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
11
18
  import kotlinx.serialization.encodeToString
12
19
  import kotlinx.serialization.json.Json
13
20
  import org.json.JSONObject
14
21
 
15
- class PrimerRNEventListener : CheckoutEventListener {
22
+ class PrimerRNEventListener : PrimerCheckoutListener {
16
23
 
17
- private var clientTokenCallback: ((String?, PrimerErrorRN?) -> Unit)? = null
18
- private var onClientSessionActions: ((String?, PrimerErrorRN?) -> Unit)? = null
19
- private var onTokenizeSuccess: ((String?, PrimerErrorRN?) -> Unit)? = null
20
- 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
21
30
  private var implementedRNCallbacks: PrimerImplementedRNCallbacks? = null
22
31
 
23
- private var resumeHandler: ResumeHandler? = null
24
-
25
32
  var sendEvent: ((eventName: String, paramsJson: JSONObject?) -> Unit)? = null
26
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
+ }
27
50
 
28
- override fun onClientSessionActions(event: CheckoutEvent.OnClientSessionActions) {
29
- val token = PrimerOnClientSessionActionsRequestRN.build(event.data)
30
- val request = JSONObject(Json.encodeToString(token))
31
-
32
- onClientSessionActions = { newClientToken, err ->
33
- when {
34
- err != null -> resumeHandler?.handleError(err.asError())
35
- newClientToken != null -> resumeHandler?.handleNewClientToken(newClientToken)
36
- 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
+ }
37
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)
38
68
  }
69
+ }
39
70
 
40
- event.resumeHandler.handleClientToken(null)
41
- sendEvent?.invoke(PrimerEventsRN.OnClientSessionActions.string, request)
42
- }
43
-
44
- override fun onCheckoutEvent(e: CheckoutEvent) {
45
- when (e) {
46
- is CheckoutEvent.TokenizationSuccess -> {
47
- val token = PrimerPaymentInstrumentTokenRN.fromPaymentMethodToken(e.data)
48
- val request = JSONObject(Json.encodeToString(token))
49
- onTokenizeSuccess = { newClientToken, err ->
50
- when {
51
- err != null -> resumeHandler?.handleError(err.asError())
52
- newClientToken != null -> resumeHandler?.handleNewClientToken(newClientToken)
53
- else -> resumeHandler?.handleSuccess()
54
- }
55
- }
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
+ }
56
81
 
57
- resumeHandler = e.resumeHandler
58
- sendEvent?.invoke(PrimerEventsRN.OnTokenizeSuccessCallback.string, request)
59
- }
60
- is CheckoutEvent.ResumeSuccess -> {
61
- val token = e.resumeToken
62
- if (implementedRNCallbacks?.isOnResumeSuccessImplemented == true) {
63
- onResumeSuccess = { newClientToken, err ->
64
- when {
65
- err != null -> resumeHandler?.handleError(err.asError())
66
- newClientToken != null -> resumeHandler?.handleNewClientToken(newClientToken)
67
- else -> resumeHandler?.handleSuccess()
68
- }
69
- }
70
-
71
- resumeHandler = e.resumeHandler
72
- val resumeToken = mapOf(Keys.RESUME_TOKEN to token)
73
- sendEvent?.invoke(
74
- PrimerEventsRN.OnResumeSuccess.string,
75
- JSONObject(Json.encodeToString(resumeToken))
76
- )
77
- } else {
78
- sendError?.invoke(ErrorTypeRN.InitFailed
79
- errorTo "Callback [onResumeSuccess] should had been implemented.")
80
- }
81
- }
82
- is CheckoutEvent.ApiError -> {
83
- Log.e("PrimerRN", "ApiError: ${e.data}")
84
- val exception = ErrorTypeRN.CheckoutFlowFailed errorTo e.data.description
85
- sendError?.invoke(exception)
86
- }
87
- is CheckoutEvent.TokenAddedToVault -> {
88
- val token = PrimerPaymentInstrumentTokenRN.fromPaymentMethodToken(e.data)
89
- val request = JSONObject(Json.encodeToString(token))
90
- sendEvent?.invoke(
91
- PrimerEventsRN.OnVaultSuccess.string,
92
- request
93
- )
94
- }
95
- is CheckoutEvent.TokenSelected -> {
96
- val token = PrimerPaymentInstrumentTokenRN.fromPaymentMethodToken(e.data)
97
- val request = JSONObject(Json.encodeToString(token))
98
- onTokenizeSuccess = { newClientToken, err ->
99
- when {
100
- err != null -> resumeHandler?.handleError(err.asError())
101
- newClientToken != null -> resumeHandler?.handleNewClientToken(newClientToken)
102
- else -> resumeHandler?.handleSuccess()
103
- }
104
- }
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
+ }
105
92
 
106
- resumeHandler = e.resumeHandler
107
- sendEvent?.invoke(PrimerEventsRN.OnTokenizeSuccessCallback.string, request)
108
- }
109
- is CheckoutEvent.Exit -> {
110
- removeCallbacksAndHandlers()
111
- if (implementedRNCallbacks?.isOnCheckoutDismissedImplemented == true) {
112
- sendEvent?.invoke(
113
- PrimerEventsRN.OnCheckoutDismissed.string,
114
- null
115
- )
116
- } else {
117
- sendError?.invoke(ErrorTypeRN.InitFailed
118
- errorTo "Callback [onCheckoutDismissed] should had been implemented.")
119
- }
120
- }
121
- is CheckoutEvent.TokenizationError -> {
122
- if (implementedRNCallbacks?.isCheckoutFailedImplemented == true) {
123
- Log.e("PrimerRN", "TokenizationError: ${e.data}")
124
- val exception = ErrorTypeRN.TokenizationFailed errorTo e.data.description
125
- sendError?.invoke(exception)
126
- } else {
127
- sendError?.invoke(ErrorTypeRN.InitFailed
128
- errorTo "Callback [onResumeError] 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()
129
105
  }
130
106
  }
131
- 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
+ )
132
113
  }
133
114
  }
134
115
 
135
- fun onClientTokenCallback(clientToken: String?, error: PrimerErrorRN?) {
136
- this.clientTokenCallback?.invoke(clientToken, error)
137
- 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
+ }
138
140
  }
139
141
 
140
- fun onClientSessionActions(clientToken: String?, error: PrimerErrorRN?) {
141
- if (implementedRNCallbacks?.isClientSessionActionsImplemented == true) {
142
- 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
+ )
143
148
  }
149
+ removeCallbacksAndHandlers()
144
150
  }
145
151
 
146
- fun onTokenizeSuccess(clientToken: String?, error: PrimerErrorRN?) {
147
- 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
+ }
148
171
  }
149
172
 
150
- fun onResumeSuccess(clientToken: String?, error: PrimerErrorRN?) {
151
- if (implementedRNCallbacks?.isOnResumeSuccessImplemented == true) {
152
- 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))
153
179
  } else {
154
- sendError?.invoke(ErrorTypeRN.CheckoutFlowFailed
155
- errorTo "Callback [onResumeSuccess] should had been implemented.")
180
+ super.onFailed(error, errorHandler)
156
181
  }
157
182
  }
158
183
 
159
- fun removeCallbacksAndHandlers() {
160
- clientTokenCallback = null
161
- onClientSessionActions = null
162
- onTokenizeSuccess = null
163
- 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
164
193
  }
165
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
+
166
243
  fun setImplementedCallbacks(implementedRNCallbacks: PrimerImplementedRNCallbacks) {
167
244
  this.implementedRNCallbacks = implementedRNCallbacks
168
245
  }
246
+
247
+ private fun removeCallbacksAndHandlers() {
248
+ paymentCreationDecisionHandler = null
249
+ primerErrorDecisionHandler = null
250
+ tokenizeSuccessDecisionHandler = null
251
+ resumeSuccessDecisionHandler = null
252
+ implementedRNCallbacks = null
253
+ }
169
254
  }
@@ -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,18 +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,
13
+ enum class ErrorTypeRN(val errorId: String) {
14
+ NativeBridgeFailed("native-bridge"),
19
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)