@primer-io/react-native 2.3.0 → 2.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/.project +11 -0
- package/android/.settings/org.eclipse.buildship.core.prefs +2 -2
- package/android/build.gradle +1 -1
- package/android/src/main/java/com/primerioreactnative/PrimerRN.kt +1 -20
- package/android/src/main/java/com/primerioreactnative/PrimerRNHeadlessUniversalCheckout.kt +2 -21
- package/android/src/main/java/com/primerioreactnative/PrimerRNHeadlessUniversalCheckoutListener.kt +5 -6
- package/android/src/main/java/com/primerioreactnative/ReactNativePackage.kt +3 -1
- package/android/src/main/java/com/primerioreactnative/datamodels/PrimerPaymentMethodDataRN.kt +1 -3
- package/android/src/main/java/com/primerioreactnative/huc/datamodels/manager/raw/PrimerRNHeadlessCheckoutInputData.kt +22 -0
- package/android/src/main/java/com/primerioreactnative/huc/events/PrimerHeadlessUniversalCheckoutRawDataManagerEvent.kt +7 -0
- package/android/src/main/java/com/primerioreactnative/huc/manager/raw/PrimerRNHeadlessUniversalCheckoutRawManager.kt +140 -0
- package/android/src/main/java/com/primerioreactnative/huc/manager/raw/PrimerRNHeadlessUniversalCheckoutRawManagerListener.kt +49 -0
- package/ios/DataModels/PrimerErrorRN.swift +2 -0
- package/ios/DataModels/RNTPrimerCardData.swift +46 -0
- package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.swift +70 -107
- package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutRawDataManager.m +21 -0
- package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutRawDataManager.swift +152 -0
- package/ios/RNTPrimer.m +1 -1
- package/ios/RNTPrimer.swift +2 -9
- package/ios/ReactNative-Bridging-Header.h +10 -0
- package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js +5 -4
- package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +1 -1
- package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js +106 -0
- package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -0
- package/lib/commonjs/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js +85 -0
- package/lib/commonjs/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -0
- package/lib/commonjs/index.js +28 -6
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/models/PrimerRawData.js +2 -0
- package/lib/commonjs/models/PrimerRawData.js.map +1 -0
- package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js +3 -3
- package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +1 -1
- package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js +88 -0
- package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -0
- package/lib/module/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js +76 -0
- package/lib/module/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -0
- package/lib/module/index.js +3 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/models/PrimerRawData.js +2 -0
- package/lib/module/models/PrimerRawData.js.map +1 -0
- package/lib/typescript/src/headless_checkout/PrimerHeadlessUniversalCheckout.d.ts +1 -0
- package/lib/typescript/src/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.d.ts +16 -0
- package/lib/typescript/src/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.d.ts +12 -0
- package/lib/typescript/src/index.d.ts +3 -1
- package/lib/typescript/src/models/PrimerRawData.d.ts +9 -0
- package/package.json +1 -1
- package/primer-io-react-native.podspec +1 -1
- package/src/headless_checkout/PrimerHeadlessUniversalCheckout.ts +3 -3
- package/src/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.ts +104 -0
- package/src/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.ts +91 -0
- package/src/index.tsx +8 -1
- package/src/models/PrimerRawData.ts +9 -0
- package/ios/Core/ReactNative-Bridging-Header.h +0 -14
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(
|
|
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/
|
|
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
|
package/android/build.gradle
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
105
|
+
PrimerHeadlessUniversalCheckout.getAsset(paymentMethodType, type)?.let { resourceId ->
|
|
125
106
|
val file = getFile(reactContext, paymentMethodType)
|
|
126
107
|
AssetsManager.saveBitmapToFile(
|
|
127
108
|
file,
|
package/android/src/main/java/com/primerioreactnative/PrimerRNHeadlessUniversalCheckoutListener.kt
CHANGED
|
@@ -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
|
|
49
|
+
put("paymentMethodTypes", JSONArray(paymentMethods.map { it.paymentMethodType }))
|
|
51
50
|
}
|
|
52
51
|
)
|
|
53
52
|
successCallback?.invoke(
|
|
54
|
-
Arguments.fromList(paymentMethods.map { it.paymentMethodType
|
|
53
|
+
Arguments.fromList(paymentMethods.map { it.paymentMethodType })
|
|
55
54
|
)
|
|
56
55
|
}
|
|
57
56
|
|
|
58
|
-
override fun onPreparationStarted(paymentMethodType:
|
|
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:
|
|
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:
|
|
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
|
|
package/android/src/main/java/com/primerioreactnative/datamodels/PrimerPaymentMethodDataRN.kt
CHANGED
|
@@ -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:
|
|
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,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
|
+
}
|
|
@@ -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
|
+
}
|