@primer-io/react-native 2.4.0 → 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 (46) 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/PrimerRNHeadlessUniversalCheckout.kt +5 -5
  5. package/android/src/main/java/com/primerioreactnative/ReactNativePackage.kt +3 -1
  6. package/android/src/main/java/com/primerioreactnative/huc/datamodels/manager/raw/PrimerRNHeadlessCheckoutInputData.kt +22 -0
  7. package/android/src/main/java/com/primerioreactnative/huc/events/PrimerHeadlessUniversalCheckoutRawDataManagerEvent.kt +7 -0
  8. package/android/src/main/java/com/primerioreactnative/huc/manager/raw/PrimerRNHeadlessUniversalCheckoutRawManager.kt +140 -0
  9. package/android/src/main/java/com/primerioreactnative/huc/manager/raw/PrimerRNHeadlessUniversalCheckoutRawManagerListener.kt +49 -0
  10. package/ios/DataModels/PrimerErrorRN.swift +2 -0
  11. package/ios/DataModels/RNTPrimerCardData.swift +46 -0
  12. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.swift +53 -53
  13. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutRawDataManager.m +21 -0
  14. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutRawDataManager.swift +152 -0
  15. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js +5 -4
  16. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +1 -1
  17. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js +106 -0
  18. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -0
  19. package/lib/commonjs/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js +85 -0
  20. package/lib/commonjs/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -0
  21. package/lib/commonjs/index.js +28 -6
  22. package/lib/commonjs/index.js.map +1 -1
  23. package/lib/commonjs/models/PrimerRawData.js +2 -0
  24. package/lib/commonjs/models/PrimerRawData.js.map +1 -0
  25. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js +3 -3
  26. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +1 -1
  27. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js +88 -0
  28. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -0
  29. package/lib/module/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js +76 -0
  30. package/lib/module/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -0
  31. package/lib/module/index.js +3 -1
  32. package/lib/module/index.js.map +1 -1
  33. package/lib/module/models/PrimerRawData.js +2 -0
  34. package/lib/module/models/PrimerRawData.js.map +1 -0
  35. package/lib/typescript/src/headless_checkout/PrimerHeadlessUniversalCheckout.d.ts +1 -0
  36. package/lib/typescript/src/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.d.ts +16 -0
  37. package/lib/typescript/src/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.d.ts +12 -0
  38. package/lib/typescript/src/index.d.ts +3 -1
  39. package/lib/typescript/src/models/PrimerRawData.d.ts +9 -0
  40. package/package.json +1 -1
  41. package/primer-io-react-native.podspec +1 -1
  42. package/src/headless_checkout/PrimerHeadlessUniversalCheckout.ts +3 -3
  43. package/src/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.ts +104 -0
  44. package/src/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.ts +91 -0
  45. package/src/index.tsx +8 -1
  46. 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.4.0'
140
+ implementation 'io.primer:android:2.5.0'
141
141
  }
@@ -70,11 +70,11 @@ class PrimerRNHeadlessUniversalCheckout(
70
70
 
71
71
  @ReactMethod
72
72
  fun showPaymentMethod(paymentMethodTypeStr: String, promise: Promise) {
73
- PrimerHeadlessUniversalCheckout.current.showPaymentMethod(
74
- reactContext,
75
- paymentMethodTypeStr
76
- )
77
- promise.resolve(null)
73
+ PrimerHeadlessUniversalCheckout.current.showPaymentMethod(
74
+ reactContext,
75
+ paymentMethodTypeStr
76
+ )
77
+ promise.resolve(null)
78
78
  }
79
79
 
80
80
  @ReactMethod
@@ -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
 
@@ -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
+ }