@primer-io/react-native 2.2.1 → 2.5.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 (51) hide show
  1. package/android/.project +11 -0
  2. package/android/.settings/org.eclipse.buildship.core.prefs +2 -2
  3. package/android/build.gradle +1 -1
  4. package/android/src/main/java/com/primerioreactnative/PrimerRN.kt +1 -20
  5. package/android/src/main/java/com/primerioreactnative/PrimerRNHeadlessUniversalCheckout.kt +2 -21
  6. package/android/src/main/java/com/primerioreactnative/PrimerRNHeadlessUniversalCheckoutListener.kt +5 -6
  7. package/android/src/main/java/com/primerioreactnative/ReactNativePackage.kt +3 -1
  8. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerPaymentMethodDataRN.kt +1 -3
  9. package/android/src/main/java/com/primerioreactnative/huc/datamodels/manager/raw/PrimerRNHeadlessCheckoutInputData.kt +22 -0
  10. package/android/src/main/java/com/primerioreactnative/huc/events/PrimerHeadlessUniversalCheckoutRawDataManagerEvent.kt +7 -0
  11. package/android/src/main/java/com/primerioreactnative/huc/manager/raw/PrimerRNHeadlessUniversalCheckoutRawManager.kt +140 -0
  12. package/android/src/main/java/com/primerioreactnative/huc/manager/raw/PrimerRNHeadlessUniversalCheckoutRawManagerListener.kt +49 -0
  13. package/ios/DataModels/PrimerErrorRN.swift +2 -0
  14. package/ios/DataModels/RNTPrimerCardData.swift +46 -0
  15. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.swift +70 -107
  16. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutRawDataManager.m +21 -0
  17. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutRawDataManager.swift +152 -0
  18. package/ios/RNTPrimer.m +1 -1
  19. package/ios/RNTPrimer.swift +2 -9
  20. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js +5 -4
  21. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +1 -1
  22. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js +106 -0
  23. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -0
  24. package/lib/commonjs/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js +85 -0
  25. package/lib/commonjs/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -0
  26. package/lib/commonjs/index.js +28 -6
  27. package/lib/commonjs/index.js.map +1 -1
  28. package/lib/commonjs/models/PrimerRawData.js +2 -0
  29. package/lib/commonjs/models/PrimerRawData.js.map +1 -0
  30. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js +3 -3
  31. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +1 -1
  32. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js +88 -0
  33. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -0
  34. package/lib/module/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js +76 -0
  35. package/lib/module/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -0
  36. package/lib/module/index.js +3 -1
  37. package/lib/module/index.js.map +1 -1
  38. package/lib/module/models/PrimerRawData.js +2 -0
  39. package/lib/module/models/PrimerRawData.js.map +1 -0
  40. package/lib/typescript/src/headless_checkout/PrimerHeadlessUniversalCheckout.d.ts +1 -0
  41. package/lib/typescript/src/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.d.ts +16 -0
  42. package/lib/typescript/src/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.d.ts +12 -0
  43. package/lib/typescript/src/index.d.ts +3 -1
  44. package/lib/typescript/src/models/PrimerRawData.d.ts +9 -0
  45. package/package.json +1 -1
  46. package/primer-io-react-native.podspec +1 -1
  47. package/src/headless_checkout/PrimerHeadlessUniversalCheckout.ts +3 -3
  48. package/src/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.ts +104 -0
  49. package/src/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.ts +91 -0
  50. package/src/index.tsx +8 -1
  51. package/src/models/PrimerRawData.ts +9 -0
package/android/.project CHANGED
@@ -14,4 +14,15 @@
14
14
  <natures>
15
15
  <nature>org.eclipse.buildship.core.gradleprojectnature</nature>
16
16
  </natures>
17
+ <filteredResources>
18
+ <filter>
19
+ <id>1659508366811</id>
20
+ <name></name>
21
+ <type>30</type>
22
+ <matcher>
23
+ <id>org.eclipse.core.resources.regexFilterMatcher</id>
24
+ <arguments>node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
25
+ </matcher>
26
+ </filter>
27
+ </filteredResources>
17
28
  </projectDescription>
@@ -1,11 +1,11 @@
1
1
  arguments=
2
2
  auto.sync=false
3
3
  build.scans.enabled=false
4
- connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(6.0))
4
+ connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(7.4.2))
5
5
  connection.project.dir=
6
6
  eclipse.preferences.version=1
7
7
  gradle.user.home=
8
- java.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home
8
+ java.home=/Library/Java/JavaVirtualMachines/jdk-11.0.14.jdk/Contents/Home
9
9
  jvm.arguments=
10
10
  offline.mode=false
11
11
  override.workspace.settings=true
@@ -137,5 +137,5 @@ dependencies {
137
137
  api 'com.facebook.react:react-native:+'
138
138
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
139
139
  implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.3"
140
- implementation 'io.primer:android:2.2.1'
140
+ implementation 'io.primer:android:2.5.0'
141
141
  }
@@ -9,7 +9,6 @@ import com.primerioreactnative.utils.convertJsonToMap
9
9
  import com.primerioreactnative.utils.errorTo
10
10
  import io.primer.android.Primer
11
11
  import io.primer.android.PrimerSessionIntent
12
- import io.primer.android.data.configuration.models.PrimerPaymentMethodType
13
12
  import io.primer.android.data.settings.PrimerSettings
14
13
  import kotlinx.serialization.decodeFromString
15
14
  import kotlinx.serialization.encodeToString
@@ -92,22 +91,12 @@ class PrimerRN(private val reactContext: ReactApplicationContext, private val js
92
91
  promise.reject(exception.errorId, exception.description, e)
93
92
  return
94
93
  }
95
- val paymentMethod: PrimerPaymentMethodType
96
- try {
97
- paymentMethod = getPrimerPaymentMethod(paymentMethodTypeStr)
98
- } catch (e: Exception) {
99
- val exception =
100
- ErrorTypeRN.NativeBridgeFailed errorTo "Payment method type $paymentMethodTypeStr is not valid."
101
- onError(exception)
102
- promise.reject(exception.errorId, exception.description, e)
103
- return
104
- }
105
94
 
106
95
  try {
107
96
  Primer.instance.showPaymentMethod(
108
97
  reactApplicationContext.applicationContext,
109
98
  clientToken,
110
- paymentMethod,
99
+ paymentMethodTypeStr,
111
100
  intent
112
101
  )
113
102
  promise.resolve(null)
@@ -236,14 +225,6 @@ class PrimerRN(private val reactContext: ReactApplicationContext, private val js
236
225
  private fun prepareData(data: JSONObject?): WritableMap {
237
226
  return data?.let { convertJsonToMap(data) } ?: Arguments.createMap()
238
227
  }
239
-
240
- private fun getPrimerPaymentMethod(paymentMethodTypeStr: String): PrimerPaymentMethodType {
241
- if (PrimerPaymentMethodType.PAYMENT_CARD.name == paymentMethodTypeStr) {
242
- return PrimerPaymentMethodType.PAYMENT_CARD
243
- }
244
-
245
- return PrimerPaymentMethodType.valueOf(paymentMethodTypeStr)
246
- }
247
228
  }
248
229
 
249
230
  internal object Keys {
@@ -15,8 +15,6 @@ import com.primerioreactnative.utils.errorTo
15
15
  import io.primer.android.ExperimentalPrimerApi
16
16
  import io.primer.android.components.PrimerHeadlessUniversalCheckout
17
17
  import io.primer.android.components.ui.assets.ImageType
18
- import io.primer.android.data.configuration.models.PaymentMethodType
19
- import io.primer.android.data.configuration.models.PrimerPaymentMethodType
20
18
  import kotlinx.serialization.decodeFromString
21
19
  import kotlinx.serialization.encodeToString
22
20
  import kotlinx.serialization.json.Json
@@ -72,19 +70,11 @@ class PrimerRNHeadlessUniversalCheckout(
72
70
 
73
71
  @ReactMethod
74
72
  fun showPaymentMethod(paymentMethodTypeStr: String, promise: Promise) {
75
- val primerPaymentMethodType = PrimerPaymentMethodType.safeValueOf(paymentMethodTypeStr)
76
- if (primerPaymentMethodType == PaymentMethodType.UNKNOWN) {
77
- val exception =
78
- ErrorTypeRN.NativeBridgeFailed errorTo "Payment method type $paymentMethodTypeStr is not valid."
79
- onError(exception)
80
- promise.reject(exception.errorId, exception.description)
81
- } else {
82
73
  PrimerHeadlessUniversalCheckout.current.showPaymentMethod(
83
74
  reactContext,
84
- primerPaymentMethodType
75
+ paymentMethodTypeStr
85
76
  )
86
77
  promise.resolve(null)
87
- }
88
78
  }
89
79
 
90
80
  @ReactMethod
@@ -101,17 +91,8 @@ class PrimerRNHeadlessUniversalCheckout(
101
91
  successCallback: Callback
102
92
  ) {
103
93
 
104
- val primerPaymentMethodType = PrimerPaymentMethodType.safeValueOf(paymentMethodType)
105
94
  val type = ImageType.values().find { it.name.equals(assetType, ignoreCase = true) }
106
95
  when {
107
- primerPaymentMethodType == PaymentMethodType.UNKNOWN -> {
108
- errorCallback.invoke(
109
- json.encodeToString(
110
- ErrorTypeRN.InvalidPaymentMethodType errorTo
111
- "Asset for $paymentMethodType does not exist, make sure you don't have any typos."
112
- )
113
- )
114
- }
115
96
  type == null -> {
116
97
  errorCallback.invoke(
117
98
  json.encodeToString(
@@ -121,7 +102,7 @@ class PrimerRNHeadlessUniversalCheckout(
121
102
  )
122
103
  }
123
104
  else -> {
124
- PrimerHeadlessUniversalCheckout.getAsset(primerPaymentMethodType, type)?.let { resourceId ->
105
+ PrimerHeadlessUniversalCheckout.getAsset(paymentMethodType, type)?.let { resourceId ->
125
106
  val file = getFile(reactContext, paymentMethodType)
126
107
  AssetsManager.saveBitmapToFile(
127
108
  file,
@@ -15,7 +15,6 @@ import io.primer.android.completion.PrimerPaymentCreationDecisionHandler
15
15
  import io.primer.android.completion.PrimerResumeDecisionHandler
16
16
  import io.primer.android.components.PrimerHeadlessUniversalCheckoutListener
17
17
  import io.primer.android.components.domain.core.models.PrimerHeadlessUniversalCheckoutPaymentMethod
18
- import io.primer.android.data.configuration.models.PrimerPaymentMethodType
19
18
  import io.primer.android.domain.PrimerCheckoutData
20
19
  import io.primer.android.domain.action.models.PrimerClientSession
21
20
  import io.primer.android.domain.error.models.PrimerError
@@ -47,29 +46,29 @@ class PrimerRNHeadlessUniversalCheckoutListener : PrimerHeadlessUniversalCheckou
47
46
  sendEvent?.invoke(
48
47
  PrimerHeadlessUniversalCheckoutEvent.ON_HUC_AVAILABLE_PAYMENT_METHODS_LOADED.eventName,
49
48
  JSONObject().apply {
50
- put("paymentMethodTypes", JSONArray(paymentMethods.map { it.paymentMethodType.name }))
49
+ put("paymentMethodTypes", JSONArray(paymentMethods.map { it.paymentMethodType }))
51
50
  }
52
51
  )
53
52
  successCallback?.invoke(
54
- Arguments.fromList(paymentMethods.map { it.paymentMethodType.name })
53
+ Arguments.fromList(paymentMethods.map { it.paymentMethodType })
55
54
  )
56
55
  }
57
56
 
58
- override fun onPreparationStarted(paymentMethodType: PrimerPaymentMethodType) {
57
+ override fun onPreparationStarted(paymentMethodType: String) {
59
58
  sendEvent?.invoke(
60
59
  PrimerHeadlessUniversalCheckoutEvent.ON_HUC_PREPARE_START.eventName,
61
60
  JSONObject(Json.encodeToString(PrimerPaymentMethodDataRN(paymentMethodType)))
62
61
  )
63
62
  }
64
63
 
65
- override fun onPaymentMethodShowed(paymentMethodType: PrimerPaymentMethodType) {
64
+ override fun onPaymentMethodShowed(paymentMethodType: String) {
66
65
  sendEvent?.invoke(
67
66
  PrimerHeadlessUniversalCheckoutEvent.ON_HUC_PAYMENT_METHOD_SHOW.eventName,
68
67
  JSONObject(Json.encodeToString(PrimerPaymentMethodDataRN(paymentMethodType)))
69
68
  )
70
69
  }
71
70
 
72
- override fun onTokenizationStarted(paymentMethodType: PrimerPaymentMethodType) {
71
+ override fun onTokenizationStarted(paymentMethodType: String) {
73
72
  sendEvent?.invoke(
74
73
  PrimerHeadlessUniversalCheckoutEvent.ON_HUC_TOKENIZE_START.eventName,
75
74
  JSONObject(Json.encodeToString(PrimerPaymentMethodDataRN(paymentMethodType)))
@@ -4,6 +4,7 @@ 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 com.primerioreactnative.huc.manager.raw.PrimerRNHeadlessUniversalCheckoutRawManager
7
8
  import kotlinx.serialization.json.Json
8
9
 
9
10
  class ReactNativePackage : ReactPackage {
@@ -13,7 +14,8 @@ class ReactNativePackage : ReactPackage {
13
14
  override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
14
15
  return listOf(
15
16
  PrimerRN(reactContext, json),
16
- PrimerRNHeadlessUniversalCheckout(reactContext, json)
17
+ PrimerRNHeadlessUniversalCheckout(reactContext, json),
18
+ PrimerRNHeadlessUniversalCheckoutRawManager(reactContext, json)
17
19
  )
18
20
  }
19
21
 
@@ -1,8 +1,6 @@
1
1
  package com.primerioreactnative.datamodels
2
2
 
3
- import io.primer.android.data.configuration.models.PrimerPaymentMethodType
4
- import io.primer.android.domain.tokenization.models.PrimerPaymentMethodData
5
3
  import kotlinx.serialization.Serializable
6
4
 
7
5
  @Serializable
8
- data class PrimerPaymentMethodDataRN(val paymentMethodType: PrimerPaymentMethodType)
6
+ data class PrimerPaymentMethodDataRN(val paymentMethodType: String)
@@ -0,0 +1,22 @@
1
+ package com.primerioreactnative.huc.datamodels.manager.raw
2
+
3
+ import io.primer.android.components.domain.core.models.card.PrimerRawCardData
4
+ import kotlinx.serialization.Serializable
5
+
6
+ @Serializable
7
+ internal data class PrimerRNPrimerRawCardData(
8
+ val cardNumber: String? = null,
9
+ val cvv: String? = null,
10
+ val expiryMonth: String? = null,
11
+ val expiryYear: String? = null,
12
+ val cardholderName: String? = null
13
+ ) {
14
+ fun toPrimerCardData() =
15
+ PrimerRawCardData(
16
+ cardNumber.orEmpty(),
17
+ cvv.orEmpty(),
18
+ expiryMonth.orEmpty(),
19
+ expiryYear.orEmpty(),
20
+ cardholderName
21
+ )
22
+ }
@@ -0,0 +1,7 @@
1
+ package com.primerioreactnative.huc.events
2
+
3
+ internal enum class PrimerHeadlessUniversalCheckoutRawDataManagerEvent(val eventName: String) {
4
+ ON_METADATA_CHANGED("onMetadataChange"),
5
+ ON_VALIDATION_CHANGED("onValidation"),
6
+ ON_NATIVE_ERROR("onNativeError"),
7
+ }
@@ -0,0 +1,140 @@
1
+ package com.primerioreactnative.huc.manager.raw
2
+
3
+ import com.facebook.react.bridge.*
4
+ import com.facebook.react.modules.core.DeviceEventManagerModule
5
+ import com.primerioreactnative.Keys
6
+ import com.primerioreactnative.datamodels.ErrorTypeRN
7
+ import com.primerioreactnative.datamodels.PrimerErrorRN
8
+ import com.primerioreactnative.huc.datamodels.manager.raw.PrimerRNPrimerRawCardData
9
+ import com.primerioreactnative.huc.events.PrimerHeadlessUniversalCheckoutEvent
10
+ import com.primerioreactnative.utils.convertJsonToMap
11
+ import com.primerioreactnative.utils.errorTo
12
+ import io.primer.android.ExperimentalPrimerApi
13
+ import io.primer.android.components.manager.raw.PrimerHeadlessUniversalCheckoutRawDataManager
14
+ import io.primer.android.components.manager.raw.PrimerHeadlessUniversalCheckoutRawDataManagerInterface
15
+ import kotlinx.serialization.decodeFromString
16
+ import kotlinx.serialization.encodeToString
17
+ import kotlinx.serialization.json.Json
18
+ import org.json.JSONArray
19
+ import org.json.JSONObject
20
+
21
+ @ExperimentalPrimerApi
22
+ internal class PrimerRNHeadlessUniversalCheckoutRawManager(
23
+ private val reactContext: ReactApplicationContext,
24
+ private val json: Json,
25
+ ) : ReactContextBaseJavaModule(reactContext) {
26
+
27
+ private val listener = PrimerRNHeadlessUniversalCheckoutRawManagerListener()
28
+ private lateinit var rawManager: PrimerHeadlessUniversalCheckoutRawDataManagerInterface
29
+
30
+ init {
31
+ listener.sendEvent = { eventName, paramsJson -> sendEvent(eventName, paramsJson) }
32
+ }
33
+
34
+ override fun getName() = "PrimerHeadlessUniversalCheckoutRawDataManager"
35
+
36
+ @ReactMethod
37
+ fun initialize(paymentMethodTypeStr: String, promise: Promise) {
38
+ try {
39
+ rawManager = PrimerHeadlessUniversalCheckoutRawDataManager.newInstance(
40
+ paymentMethodTypeStr
41
+ )
42
+ rawManager.setManagerListener(listener)
43
+ promise.resolve(null)
44
+ } catch (e: Exception) {
45
+ val exception =
46
+ ErrorTypeRN.NativeBridgeFailed errorTo e.message.orEmpty()
47
+ promise.reject(exception.errorId, exception.description)
48
+ }
49
+ }
50
+
51
+ @ReactMethod
52
+ fun listRequiredInputElementTypesForPaymentMethodType(
53
+ paymentMethodTypeStr: String,
54
+ promise: Promise
55
+ ) {
56
+ if (::rawManager.isInitialized.not()) {
57
+ val exception =
58
+ ErrorTypeRN.NativeBridgeFailed errorTo "The PrimerHeadlessUniversalCheckoutRawDataManager" +
59
+ " has not been initialized. Make sure you have called the" +
60
+ " PrimerHeadlessUniversalCheckoutRawDataManager.configure function first."
61
+ promise.reject(exception.errorId, exception.description)
62
+ } else {
63
+ promise.resolve(
64
+ prepareData(
65
+ JSONObject().apply {
66
+ put(
67
+ "inputElementTypes",
68
+ JSONArray(rawManager.getRequiredInputElementTypes().map { it.name })
69
+ )
70
+ }
71
+ )
72
+ )
73
+ }
74
+ }
75
+
76
+ @ReactMethod
77
+ fun setRawData(rawDataStr: String, promise: Promise) {
78
+ if (::rawManager.isInitialized.not()) {
79
+ val exception =
80
+ ErrorTypeRN.NativeBridgeFailed errorTo "The PrimerHeadlessUniversalCheckoutRawDataManager" +
81
+ " has not been initialized. Make sure you have called the" +
82
+ " PrimerHeadlessUniversalCheckoutRawDataManager.configure function first."
83
+ promise.reject(exception.errorId, exception.description)
84
+ } else {
85
+ try {
86
+ val rawData =
87
+ json.decodeFromString<PrimerRNPrimerRawCardData>(
88
+ rawDataStr
89
+ )
90
+ rawManager.setRawData(rawData.toPrimerCardData())
91
+ promise.resolve(null)
92
+ } catch (e: Exception) {
93
+ val exception =
94
+ ErrorTypeRN.NativeBridgeFailed errorTo "Failed to decode PrimerCardData on Android." +
95
+ " Make sure you're providing a valid 'PrimerRawCardData' object"
96
+ onError(exception)
97
+ promise.reject(exception.errorId, exception.description, e)
98
+ }
99
+ }
100
+ }
101
+
102
+ @ReactMethod
103
+ fun submit(promise: Promise) {
104
+ if (::rawManager.isInitialized.not()) {
105
+ val exception =
106
+ ErrorTypeRN.NativeBridgeFailed errorTo "The PrimerHeadlessUniversalCheckoutRawDataManager" +
107
+ " has not been initialized. Make sure you have called the" +
108
+ " PrimerHeadlessUniversalCheckoutRawDataManager.configure function first."
109
+ promise.reject(exception.errorId, exception.description)
110
+ } else {
111
+ rawManager.submit()
112
+ promise.resolve(null)
113
+ }
114
+ }
115
+
116
+ private fun sendEvent(name: String, params: WritableMap) {
117
+ reactApplicationContext.getJSModule(
118
+ DeviceEventManagerModule.RCTDeviceEventEmitter::class.java
119
+ ).emit(name, params)
120
+ }
121
+
122
+ private fun sendEvent(name: String, data: JSONObject?) {
123
+ val params = prepareData(data)
124
+ reactApplicationContext.getJSModule(
125
+ DeviceEventManagerModule.RCTDeviceEventEmitter::class.java
126
+ ).emit(name, params)
127
+ }
128
+
129
+ private fun prepareData(data: JSONObject?): WritableMap {
130
+ return data?.let { convertJsonToMap(data) } ?: Arguments.createMap()
131
+ }
132
+
133
+ private fun onError(exception: PrimerErrorRN) {
134
+ val params = Arguments.createMap()
135
+ val errorJson = JSONObject(Json.encodeToString(exception))
136
+ val errorData = prepareData(errorJson)
137
+ params.putMap(Keys.ERROR, errorData)
138
+ sendEvent(PrimerHeadlessUniversalCheckoutEvent.ON_ERROR.eventName, params)
139
+ }
140
+ }
@@ -0,0 +1,49 @@
1
+ package com.primerioreactnative.huc.manager.raw
2
+
3
+ import com.primerioreactnative.datamodels.PrimerErrorRN
4
+ import com.primerioreactnative.huc.events.PrimerHeadlessUniversalCheckoutRawDataManagerEvent
5
+ import io.primer.android.ExperimentalPrimerApi
6
+ import io.primer.android.components.domain.core.models.card.PrimerCardMetadata
7
+ import io.primer.android.components.domain.core.models.metadata.PrimerPaymentMethodMetadata
8
+ import io.primer.android.components.domain.error.PrimerInputValidationError
9
+ import io.primer.android.components.manager.raw.PrimerHeadlessUniversalCheckoutRawDataManager
10
+ import io.primer.android.components.manager.raw.PrimerHeadlessUniversalCheckoutRawDataManagerListener
11
+ import kotlinx.serialization.encodeToString
12
+ import kotlinx.serialization.json.Json
13
+ import org.json.JSONArray
14
+ import org.json.JSONObject
15
+
16
+ @ExperimentalPrimerApi
17
+ internal class PrimerRNHeadlessUniversalCheckoutRawManagerListener :
18
+ PrimerHeadlessUniversalCheckoutRawDataManagerListener {
19
+
20
+ var sendEvent: ((eventName: String, paramsJson: JSONObject?) -> Unit)? = null
21
+
22
+ override fun onValidationChanged(isValid: Boolean, errors: List<PrimerInputValidationError>) {
23
+ sendEvent?.invoke(
24
+ PrimerHeadlessUniversalCheckoutRawDataManagerEvent.ON_VALIDATION_CHANGED.eventName,
25
+ JSONObject().apply {
26
+ put("isValid", isValid)
27
+ put(
28
+ "errors",
29
+ JSONArray(
30
+ errors.map {
31
+ JSONObject(Json.encodeToString(PrimerErrorRN(it.errorId, it.description)))
32
+ }
33
+ )
34
+ )
35
+ }
36
+ )
37
+ }
38
+
39
+ override fun onMetadataChanged(metadata: PrimerPaymentMethodMetadata) {
40
+ sendEvent?.invoke(
41
+ PrimerHeadlessUniversalCheckoutRawDataManagerEvent.ON_METADATA_CHANGED.eventName,
42
+ JSONObject().apply {
43
+ if (metadata is PrimerCardMetadata) {
44
+ put("cardNetwork", metadata.cardNetwork.name)
45
+ }
46
+ }
47
+ )
48
+ }
49
+ }
@@ -1,4 +1,6 @@
1
+
1
2
  struct NativeError: CustomNSError, LocalizedError, Codable {
3
+
2
4
  let errorId: String
3
5
  let errorDescription: String?
4
6
  let recoverySuggestion: String?
@@ -0,0 +1,46 @@
1
+ //
2
+ // RNTPrimerCardData.swift
3
+ // primer-io-react-native
4
+ //
5
+ // Created by Evangelos on 3/8/22.
6
+ //
7
+
8
+ import Foundation
9
+ import PrimerSDK
10
+
11
+ extension PrimerCardData {
12
+
13
+ convenience init?(cardDataStr: String) {
14
+ do {
15
+ guard let data = cardDataStr.data(using: .utf8) else {
16
+ return nil
17
+ }
18
+
19
+ let json = try JSONSerialization.jsonObject(with: data)
20
+
21
+ guard let dict = json as? [String: String] else {
22
+ return nil
23
+ }
24
+
25
+ if let cardNumber = dict["cardNumber"],
26
+ let cvv = dict["cvv"],
27
+ let expiryMonth = dict["expiryMonth"],
28
+ let expiryYear = dict["expiryYear"]
29
+ {
30
+ let cardholderName = dict["cardholderName"]
31
+ self.init(
32
+ cardNumber: cardNumber,
33
+ expiryMonth: expiryMonth,
34
+ expiryYear: expiryYear,
35
+ cvv: cvv,
36
+ cardholderName: cardholderName)
37
+ } else {
38
+ return nil
39
+ }
40
+
41
+ } catch {
42
+ return nil
43
+ }
44
+ }
45
+
46
+ }