@primer-io/react-native 0.13.0-beta.1 → 0.15.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 (100) hide show
  1. package/android/build.gradle +2 -2
  2. package/android/gradle.properties +1 -1
  3. package/android/src/main/java/com/primerioreactnative/PrimerRN.kt +192 -153
  4. package/android/src/main/java/com/primerioreactnative/PrimerRNEventListener.kt +131 -86
  5. package/android/src/main/java/com/primerioreactnative/ReactNativePackage.kt +3 -14
  6. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerErrorRN.kt +3 -4
  7. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerEventsRN.kt +11 -0
  8. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerSettingsRN.kt +4 -3
  9. package/android/src/main/java/com/primerioreactnative/utils/ErrorHelper.kt +11 -0
  10. package/android/src/main/java/com/primerioreactnative/utils/PrimerImplementedRNCallbacks.kt +14 -0
  11. package/ios/DataModels/PrimerErrorRN.swift +1 -1
  12. package/ios/DataModels/PrimerSettingsRN.swift +6 -0
  13. package/ios/RNTPrimer.m +43 -0
  14. package/ios/RNTPrimer.swift +394 -0
  15. package/ios/ReactNative-Bridging-Header.h +3 -0
  16. package/ios/ReactNative.xcodeproj/project.pbxproj +44 -0
  17. package/lib/commonjs/Primer.js +220 -209
  18. package/lib/commonjs/Primer.js.map +1 -1
  19. package/lib/commonjs/RNPrimer.js +145 -0
  20. package/lib/commonjs/RNPrimer.js.map +1 -0
  21. package/lib/commonjs/index.js +1 -28
  22. package/lib/commonjs/index.js.map +1 -1
  23. package/lib/commonjs/models/primer-intent.js.map +1 -1
  24. package/lib/commonjs/models/utils/redirectScheme.js +4 -0
  25. package/lib/commonjs/models/utils/redirectScheme.js.map +1 -0
  26. package/lib/module/Primer.js +204 -210
  27. package/lib/module/Primer.js.map +1 -1
  28. package/lib/module/RNPrimer.js +136 -0
  29. package/lib/module/RNPrimer.js.map +1 -0
  30. package/lib/module/index.js +3 -4
  31. package/lib/module/index.js.map +1 -1
  32. package/lib/module/models/primer-intent.js.map +1 -1
  33. package/lib/module/models/utils/redirectScheme.js +2 -0
  34. package/lib/module/models/utils/redirectScheme.js.map +1 -0
  35. package/lib/typescript/Primer.d.ts +13 -0
  36. package/lib/typescript/RNPrimer.d.ts +24 -0
  37. package/lib/typescript/index.d.ts +1 -3
  38. package/lib/typescript/models/primer-callbacks.d.ts +7 -9
  39. package/lib/typescript/models/primer-config.d.ts +16 -13
  40. package/lib/typescript/models/primer-intent.d.ts +1 -1
  41. package/lib/typescript/models/primer-request.d.ts +2 -12
  42. package/lib/typescript/models/primer-settings.d.ts +5 -6
  43. package/lib/typescript/models/primer.d.ts +4 -4
  44. package/lib/typescript/models/utils/redirectScheme.d.ts +3 -0
  45. package/package.json +4 -1
  46. package/primer-io-react-native.podspec +2 -3
  47. package/src/Primer.ts +227 -178
  48. package/src/RNPrimer.ts +170 -0
  49. package/src/index.tsx +2 -3
  50. package/src/models/primer-callbacks.ts +9 -27
  51. package/src/models/primer-config.ts +23 -20
  52. package/src/models/primer-intent.ts +1 -1
  53. package/src/models/primer-request.ts +2 -16
  54. package/src/models/primer-settings.ts +5 -6
  55. package/src/models/primer.ts +5 -5
  56. package/src/models/utils/redirectScheme.ts +5 -0
  57. package/android/src/main/java/com/primerioreactnative/PrimerCardNumberEditTextManager.kt +0 -83
  58. package/android/src/main/java/com/primerioreactnative/PrimerHeadlessUniversalCheckout.kt +0 -201
  59. package/android/src/main/java/com/primerioreactnative/huc/assets/AssetsManager.kt +0 -56
  60. package/android/src/main/java/com/primerioreactnative/huc/events/PrimerHeadlessUniversalCheckoutEvent.kt +0 -11
  61. package/android/src/main/java/com/primerioreactnative/huc/extensions/Map.kt +0 -10
  62. package/ios/Core/PrimerRN+PrimerDelegate.swift +0 -148
  63. package/ios/Core/PrimerRN.m +0 -34
  64. package/ios/Core/PrimerRN.swift +0 -168
  65. package/ios/Core/ReactNative-Bridging-Header.h +0 -13
  66. package/ios/Headless Universal Checkout/RNTPrimerCardNumberInputElementManager.m +0 -23
  67. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.m +0 -30
  68. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.swift +0 -241
  69. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.m +0 -14
  70. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.swift +0 -117
  71. package/lib/commonjs/PrimerInput.js +0 -80
  72. package/lib/commonjs/PrimerInput.js.map +0 -1
  73. package/lib/commonjs/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js +0 -14
  74. package/lib/commonjs/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js.map +0 -1
  75. package/lib/commonjs/headless_checkout/NativePrimerHeadlessUniversalCheckout.js +0 -73
  76. package/lib/commonjs/headless_checkout/NativePrimerHeadlessUniversalCheckout.js.map +0 -1
  77. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js +0 -119
  78. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +0 -1
  79. package/lib/commonjs/headless_checkout/types.js +0 -2
  80. package/lib/commonjs/headless_checkout/types.js.map +0 -1
  81. package/lib/module/PrimerInput.js +0 -46
  82. package/lib/module/PrimerInput.js.map +0 -1
  83. package/lib/module/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js +0 -5
  84. package/lib/module/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js.map +0 -1
  85. package/lib/module/headless_checkout/NativePrimerHeadlessUniversalCheckout.js +0 -64
  86. package/lib/module/headless_checkout/NativePrimerHeadlessUniversalCheckout.js.map +0 -1
  87. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js +0 -104
  88. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +0 -1
  89. package/lib/module/headless_checkout/types.js +0 -2
  90. package/lib/module/headless_checkout/types.js.map +0 -1
  91. package/lib/typescript/PrimerInput.d.ts +0 -15
  92. package/lib/typescript/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.d.ts +0 -1
  93. package/lib/typescript/headless_checkout/NativePrimerHeadlessUniversalCheckout.d.ts +0 -10
  94. package/lib/typescript/headless_checkout/PrimerHeadlessUniversalCheckout.d.ts +0 -14
  95. package/lib/typescript/headless_checkout/types.d.ts +0 -16
  96. package/src/PrimerInput.tsx +0 -73
  97. package/src/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.tsx +0 -2
  98. package/src/headless_checkout/NativePrimerHeadlessUniversalCheckout.ts +0 -94
  99. package/src/headless_checkout/PrimerHeadlessUniversalCheckout.ts +0 -136
  100. package/src/headless_checkout/types.ts +0 -18
@@ -1,124 +1,169 @@
1
1
  package com.primerioreactnative
2
2
 
3
3
  import android.util.Log
4
- import com.facebook.react.bridge.Callback
5
- import com.primerioreactnative.datamodels.ErrorTypeRN
6
- import com.primerioreactnative.datamodels.PrimerErrorRN
7
- import com.primerioreactnative.datamodels.PrimerOnClientSessionActionsRequestRN
8
- import com.primerioreactnative.datamodels.PrimerPaymentInstrumentTokenRN
9
- import com.primerioreactnative.utils.PrimerEventQueueRN
4
+ import com.primerioreactnative.datamodels.*
5
+ import com.primerioreactnative.utils.PrimerImplementedRNCallbacks
6
+ import com.primerioreactnative.utils.asError
7
+ import com.primerioreactnative.utils.errorTo
10
8
  import io.primer.android.CheckoutEventListener
11
- import io.primer.android.completion.ActionResumeHandler
12
9
  import io.primer.android.completion.ResumeHandler
13
10
  import io.primer.android.events.CheckoutEvent
14
11
  import kotlinx.serialization.encodeToString
15
12
  import kotlinx.serialization.json.Json
13
+ import org.json.JSONObject
16
14
 
17
15
  class PrimerRNEventListener : CheckoutEventListener {
18
16
 
19
- private var onTokenizeSuccessQueue: PrimerEventQueueRN? = null
20
- private var onClientSessionActionsQueue: PrimerEventQueueRN? = null
21
- private var onResumeSuccessQueue: PrimerEventQueueRN? = null
22
- private var onVaultSuccessQueue: PrimerEventQueueRN? = null
23
- private var onDismissQueue: PrimerEventQueueRN? = null
24
- var onPrimerErrorQueue: PrimerEventQueueRN? = null
25
- var onSavedPaymentInstrumentsFetchedQueue: PrimerEventQueueRN? = null
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
21
+ private var implementedRNCallbacks: PrimerImplementedRNCallbacks? = null
26
22
 
27
- var completion: ((error: String?, token: String?) -> Unit)? = null
28
- var actionCompletion: ((error: String?, token: String?) -> Unit)? = null
23
+ private var resumeHandler: ResumeHandler? = null
29
24
 
30
- var resumeHandler: ResumeHandler? = null
31
- var actionResumeHandler: ActionResumeHandler? = null
32
-
33
- fun configureOnTokenizeSuccess(callback: Callback) {
34
- onTokenizeSuccessQueue = PrimerEventQueueRN()
35
- onTokenizeSuccessQueue?.poll(callback)
36
- }
37
-
38
- fun configureOnClientSessionActions(callback: Callback) {
39
- onClientSessionActionsQueue = PrimerEventQueueRN()
40
- onClientSessionActionsQueue?.poll(callback)
41
- }
42
-
43
- fun configureOnResumeSuccess(callback: Callback) {
44
- onResumeSuccessQueue = PrimerEventQueueRN()
45
- onResumeSuccessQueue?.poll(callback)
46
- }
47
-
48
- fun configureOnVaultSuccess(callback: Callback) {
49
- onVaultSuccessQueue = PrimerEventQueueRN()
50
- onVaultSuccessQueue?.poll(callback)
51
- }
52
-
53
- fun configureOnDismiss(callback: Callback) {
54
- onDismissQueue = PrimerEventQueueRN()
55
- onDismissQueue?.poll(callback)
56
- }
57
-
58
- fun configureOnPrimerError(callback: Callback) {
59
- onPrimerErrorQueue = PrimerEventQueueRN()
60
- onPrimerErrorQueue?.poll(callback)
61
- }
62
-
63
- fun configureOnSavedPaymentInstrumentsFetched(callback: Callback) {
64
- onSavedPaymentInstrumentsFetchedQueue = PrimerEventQueueRN()
65
- onSavedPaymentInstrumentsFetchedQueue?.poll(callback)
66
- }
25
+ var sendEvent: ((eventName: String, paramsJson: JSONObject?) -> Unit)? = null
26
+ var sendError: ((error: PrimerErrorRN) -> Unit)? = null
67
27
 
68
28
  override fun onClientSessionActions(event: CheckoutEvent.OnClientSessionActions) {
69
29
  val token = PrimerOnClientSessionActionsRequestRN.build(event.data)
70
- val request = Json.encodeToString(token)
30
+ val request = JSONObject(Json.encodeToString(token))
71
31
 
72
- onClientSessionActionsQueue?.addRequestAndPoll(request)
73
- actionResumeHandler = event.resumeHandler
32
+ onClientSessionActions = { newClientToken, err ->
33
+ when {
34
+ err != null -> resumeHandler?.handleError(err.asError())
35
+ newClientToken != null -> resumeHandler?.handleNewClientToken(newClientToken)
36
+ else -> resumeHandler?.handleSuccess()
37
+ }
38
+ }
39
+
40
+ event.resumeHandler.handleClientToken(null)
41
+ sendEvent?.invoke(PrimerEventsRN.OnClientSessionActions.string, request)
74
42
  }
75
43
 
76
44
  override fun onCheckoutEvent(e: CheckoutEvent) {
77
45
  when (e) {
78
- is CheckoutEvent.TokenAddedToVault -> {
79
- val token = PrimerPaymentInstrumentTokenRN.fromPaymentMethodToken(e.data)
80
- val request = Json.encodeToString(token)
81
- onVaultSuccessQueue?.addRequestAndPoll(request)
82
- }
83
46
  is CheckoutEvent.TokenizationSuccess -> {
84
47
  val token = PrimerPaymentInstrumentTokenRN.fromPaymentMethodToken(e.data)
85
- val request = Json.encodeToString(token)
86
- onTokenizeSuccessQueue?.addRequestAndPoll(request)
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
+ }
56
+
87
57
  resumeHandler = e.resumeHandler
88
- }
89
- is CheckoutEvent.TokenSelected -> {
90
- val token = PrimerPaymentInstrumentTokenRN.fromPaymentMethodToken(e.data)
91
- val request = Json.encodeToString(token)
92
- onTokenizeSuccessQueue?.addRequestAndPoll(request)
58
+ sendEvent?.invoke(PrimerEventsRN.OnTokenizeSuccessCallback.string, request)
93
59
  }
94
60
  is CheckoutEvent.ResumeSuccess -> {
95
61
  val token = e.resumeToken
96
- onResumeSuccessQueue?.addRequestAndPoll(token)
97
- resumeHandler = e.resumeHandler
98
- }
99
- is CheckoutEvent.Exit -> {
100
- onDismissQueue?.addRequestAndPoll("dismiss")
101
- onDismissQueue = null
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
+ }
102
81
  }
103
82
  is CheckoutEvent.ApiError -> {
104
83
  Log.e("PrimerRN", "ApiError: ${e.data}")
105
- val exception = PrimerErrorRN(
106
- ErrorTypeRN.CheckoutFlowFailed,
107
- e.data.description,
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
108
93
  )
109
- val data = Json.encodeToString(exception)
110
- onPrimerErrorQueue?.addRequestAndPoll(data)
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
+ }
105
+
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
+ }
111
120
  }
112
121
  is CheckoutEvent.TokenizationError -> {
113
- Log.e("PrimerRN", "TokenizationError: ${e.data}")
114
- val exception = PrimerErrorRN(
115
- ErrorTypeRN.TokenizationFailed,
116
- e.data.description,
117
- )
118
- val data = Json.encodeToString(exception)
119
- onPrimerErrorQueue?.addRequestAndPoll(data)
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.")
129
+ }
120
130
  }
121
131
  else -> Unit
122
132
  }
123
133
  }
134
+
135
+ fun onClientTokenCallback(clientToken: String?, error: PrimerErrorRN?) {
136
+ this.clientTokenCallback?.invoke(clientToken, error)
137
+ sendEvent?.invoke(PrimerEventsRN.OnClientTokenCallback.string, null)
138
+ }
139
+
140
+ fun onClientSessionActions(clientToken: String?, error: PrimerErrorRN?) {
141
+ if (implementedRNCallbacks?.isClientSessionActionsImplemented == true) {
142
+ this.onClientSessionActions?.invoke(clientToken, error)
143
+ }
144
+ }
145
+
146
+ fun onTokenizeSuccess(clientToken: String?, error: PrimerErrorRN?) {
147
+ this.onTokenizeSuccess?.invoke(clientToken, error)
148
+ }
149
+
150
+ fun onResumeSuccess(clientToken: String?, error: PrimerErrorRN?) {
151
+ if (implementedRNCallbacks?.isOnResumeSuccessImplemented == true) {
152
+ this.onResumeSuccess?.invoke(clientToken, error)
153
+ } else {
154
+ sendError?.invoke(ErrorTypeRN.CheckoutFlowFailed
155
+ errorTo "Callback [onResumeSuccess] should had been implemented.")
156
+ }
157
+ }
158
+
159
+ fun removeCallbacksAndHandlers() {
160
+ clientTokenCallback = null
161
+ onClientSessionActions = null
162
+ onTokenizeSuccess = null
163
+ onResumeSuccess = null
164
+ }
165
+
166
+ fun setImplementedCallbacks(implementedRNCallbacks: PrimerImplementedRNCallbacks) {
167
+ this.implementedRNCallbacks = implementedRNCallbacks
168
+ }
124
169
  }
@@ -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
 
@@ -5,8 +5,9 @@ import kotlinx.serialization.Serializable
5
5
 
6
6
  @Serializable
7
7
  data class PrimerErrorRN(
8
- val errorType: ErrorTypeRN,
9
- val description: String? = null,
8
+ val errorId: String? = null,
9
+ val errorDescription: String? = null,
10
+ val recoverySuggestion: String? = null
10
11
  )
11
12
 
12
13
  @Serializable
@@ -15,6 +16,4 @@ enum class ErrorTypeRN {
15
16
  InitFailed,
16
17
  CheckoutFlowFailed,
17
18
  TokenizationFailed,
18
- AssetMissing,
19
- AssetMismatch
20
19
  }
@@ -0,0 +1,11 @@
1
+ package com.primerioreactnative.datamodels
2
+
3
+ sealed class PrimerEventsRN(val string: String) {
4
+ object OnClientTokenCallback: PrimerEventsRN("onClientTokenCallback")
5
+ object OnClientSessionActions: PrimerEventsRN("onClientSessionActions")
6
+ object OnTokenizeSuccessCallback: PrimerEventsRN("onTokenizeSuccessCallback")
7
+ object OnResumeSuccess: PrimerEventsRN("onResumeSuccess")
8
+ object OnCheckoutDismissed: PrimerEventsRN("onCheckoutDismissed")
9
+ object OnError: PrimerEventsRN("onError")
10
+ object OnVaultSuccess: PrimerEventsRN("onVaultSuccess")
11
+ }
@@ -92,17 +92,18 @@ data class OptionsRN(
92
92
  val isResultScreenEnabled: Boolean? = null,
93
93
  val isLoadingScreenEnabled: Boolean? = null,
94
94
  val isFullScreenEnabled: Boolean? = null,
95
- val isThreeDsEnabled: Boolean? = null,
95
+ val is3DSOnVaultingEnabled: Boolean? = null,
96
96
  val locale: String? = null,
97
97
  val android: AndroidOptionsRN? = null,
98
+ val is3DSDevelopmentModeEnabled: Boolean = true
98
99
  ) {
99
100
  fun format(): Options {
100
101
  return Options(
101
102
  showUI = isLoadingScreenEnabled ?: true,
102
103
  redirectScheme = android?.redirectScheme,
103
- is3DSOnVaultingEnabled = isThreeDsEnabled ?: false,
104
+ is3DSOnVaultingEnabled = is3DSOnVaultingEnabled ?: false,
104
105
  debugOptions = PrimerDebugOptions(
105
- is3DSSanityCheckEnabled = true, // false on emulator
106
+ is3DSSanityCheckEnabled = !is3DSDevelopmentModeEnabled, // false on emulator
106
107
  ),
107
108
  )
108
109
  }
@@ -0,0 +1,11 @@
1
+ package com.primerioreactnative.utils
2
+
3
+ import com.primerioreactnative.datamodels.ErrorTypeRN
4
+ import com.primerioreactnative.datamodels.PrimerErrorRN
5
+
6
+ infix fun ErrorTypeRN.errorTo(message: String) = PrimerErrorRN(
7
+ ErrorTypeRN.CheckoutFlowFailed.name,
8
+ message
9
+ )
10
+
11
+ fun PrimerErrorRN.asError() = Error("${this.errorId}: ${this.errorDescription}")
@@ -0,0 +1,14 @@
1
+ package com.primerioreactnative.utils
2
+
3
+ import kotlinx.serialization.Serializable
4
+
5
+ @Serializable
6
+ data class PrimerImplementedRNCallbacks(
7
+ val isClientTokenCallbackImplemented: Boolean? = null,
8
+ val isTokenAddedToVaultImplemented: Boolean? = null,
9
+ val isOnResumeSuccessImplemented: Boolean? = null,
10
+ val isOnResumeErrorImplemented: Boolean? = null,
11
+ val isOnCheckoutDismissedImplemented: Boolean? = null,
12
+ val isCheckoutFailedImplemented: Boolean? = null,
13
+ val isClientSessionActionsImplemented: Boolean? = null
14
+ )
@@ -15,7 +15,7 @@ enum ErrorTypeRN: String, Error, Encodable {
15
15
  case generic
16
16
  }
17
17
 
18
- struct NativeError: CustomNSError, LocalizedError {
18
+ struct NativeError: CustomNSError, LocalizedError, Codable {
19
19
  let errorId: String
20
20
  let errorDescription: String?
21
21
  let recoverySuggestion: String?
@@ -20,6 +20,8 @@ extension PrimerSettingsRN {
20
20
  postalCode: billingAddress.postalCode
21
21
  )
22
22
  }
23
+
24
+ let debugOptions = PrimerDebugOptions(is3DSSanityCheckEnabled: !(options?.is3DSDevelopmentModeEnabled ?? false))
23
25
 
24
26
  return PrimerSettings(
25
27
  merchantIdentifier: options?.ios?.merchantIdentifier,
@@ -35,7 +37,9 @@ extension PrimerSettingsRN {
35
37
  businessDetails: business?.primerFormat,
36
38
  orderItems: order?.itemsFormatted ?? [],
37
39
  isInitialLoadingHidden: !(options?.isLoadingScreenEnabled ?? true),
40
+ is3DSOnVaultingEnabled: options?.is3DSOnVaultingEnabled ?? false,
38
41
  orderId: order?.id,
42
+ debugOptions: debugOptions,
39
43
  customer: Customer(
40
44
  firstName: customer?.firstName,
41
45
  lastName: customer?.lastName,
@@ -145,6 +149,8 @@ fileprivate struct OptionsRN: Decodable {
145
149
  let isResultScreenEnabled: Bool?
146
150
  let isLoadingScreenEnabled: Bool?
147
151
  let isFullScreenEnabled: Bool?
152
+ let is3DSOnVaultingEnabled: Bool?
153
+ let is3DSDevelopmentModeEnabled: Bool?
148
154
  let locale: String?
149
155
  let ios: IosOptionsRN?
150
156
  }
@@ -0,0 +1,43 @@
1
+ //
2
+ // RNTPrimer.m
3
+ // primer-io-react-native
4
+ //
5
+ // Created by Evangelos on 15/3/22.
6
+ //
7
+
8
+ #import <React/RCTBridgeModule.h>
9
+ #import <React/RCTEventEmitter.h>
10
+
11
+ @interface RCT_EXTERN_MODULE(NativePrimer, RCTEventEmitter)
12
+
13
+ RCT_EXTERN_METHOD(configureWithSettings:(NSString *)settingsStr resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
14
+
15
+ RCT_EXTERN_METHOD(configureWithTheme:(NSString *)themeStr resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
16
+
17
+ RCT_EXTERN_METHOD(showUniversalCheckout:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
18
+
19
+ RCT_EXTERN_METHOD(showUniversalCheckoutWithClientToken:(NSString *)clientToken resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
20
+
21
+ RCT_EXTERN_METHOD(showVaultManager:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
22
+
23
+ RCT_EXTERN_METHOD(showVaultManager:(NSString *)clientToken resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
24
+
25
+
26
+
27
+ RCT_EXTERN_METHOD(handleNewClientToken:(NSString *)clientToken resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
28
+
29
+ RCT_EXTERN_METHOD(handleError:(NSString *)errorStr resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
30
+
31
+ RCT_EXTERN_METHOD(handleSuccess:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
32
+
33
+ RCT_EXTERN_METHOD(setImplementedRNCallbacks:(NSString *)implementedRNCallbacksStr resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
34
+
35
+
36
+
37
+
38
+
39
+
40
+ RCT_EXTERN_METHOD(showPaymentMethod:(NSString *)clientToken paymentMethodStr:(NSString *)paymentMethodStr intentStr:(NSString *)intentStr resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
41
+
42
+ @end
43
+