@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.
- 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/PrimerRNHeadlessUniversalCheckout.kt +5 -5
- package/android/src/main/java/com/primerioreactnative/ReactNativePackage.kt +3 -1
- 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 +53 -53
- package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutRawDataManager.m +21 -0
- package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutRawDataManager.swift +152 -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/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
|
}
|
|
@@ -70,11 +70,11 @@ class PrimerRNHeadlessUniversalCheckout(
|
|
|
70
70
|
|
|
71
71
|
@ReactMethod
|
|
72
72
|
fun showPaymentMethod(paymentMethodTypeStr: String, promise: Promise) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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,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
|
+
}
|