@primer-io/react-native 2.5.1 → 2.7.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/build.gradle +1 -1
- package/android/src/main/java/com/primerioreactnative/PrimerRN.kt +1 -0
- package/android/src/main/java/com/primerioreactnative/PrimerRNEventListener.kt +24 -1
- package/android/src/main/java/com/primerioreactnative/PrimerRNHeadlessUniversalCheckoutListener.kt +24 -1
- package/android/src/main/java/com/primerioreactnative/datamodels/PrimerCheckoutAdditionalInfoRN.kt +13 -0
- package/android/src/main/java/com/primerioreactnative/datamodels/PrimerCheckoutDataRN.kt +4 -1
- package/android/src/main/java/com/primerioreactnative/datamodels/PrimerEvents.kt +1 -0
- package/android/src/main/java/com/primerioreactnative/extensions/PrimerCheckoutAdditionalInfo.kt +12 -0
- package/android/src/main/java/com/primerioreactnative/extensions/PrimerCheckoutData.kt +1 -1
- package/android/src/main/java/com/primerioreactnative/huc/datamodels/manager/raw/{PrimerRNHeadlessCheckoutInputData.kt → card/PrimerRNPRawCardData.kt} +2 -2
- package/android/src/main/java/com/primerioreactnative/huc/datamodels/manager/raw/phoneNumber/PrimerRNRawPhoneNumberData.kt +14 -0
- package/android/src/main/java/com/primerioreactnative/huc/manager/raw/PrimerRNHeadlessUniversalCheckoutRawManager.kt +33 -11
- package/android/src/main/java/com/primerioreactnative/utils/PrimerHeadlessUniversalCheckoutImplementedRNCallbacks.kt +2 -0
- package/android/src/main/java/com/primerioreactnative/utils/PrimerImplementedRNCallbacks.kt +2 -0
- package/ios/DataModels/ImplementedRNCallbacks.swift +6 -3
- package/ios/DataModels/RNTPrimerPhoneNumberData.swift +38 -0
- package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.swift +23 -1
- package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutRawDataManager.swift +11 -5
- package/ios/RNTPrimer.swift +72 -49
- package/lib/commonjs/Primer.js +14 -3
- package/lib/commonjs/Primer.js.map +1 -1
- package/lib/commonjs/RNPrimer.js +1 -1
- package/lib/commonjs/RNPrimer.js.map +1 -1
- package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js +17 -6
- package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +1 -1
- package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js +4 -0
- package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -1
- package/lib/commonjs/headless_checkout/RNPrimerHeadlessUniversalCheckout.js +1 -1
- package/lib/commonjs/headless_checkout/RNPrimerHeadlessUniversalCheckout.js.map +1 -1
- package/lib/commonjs/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js +10 -0
- package/lib/commonjs/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -1
- package/lib/commonjs/index.js +14 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/models/PrimerCheckoutAdditionalInfo.js +2 -0
- package/lib/commonjs/models/PrimerCheckoutAdditionalInfo.js.map +1 -0
- package/lib/commonjs/models/PrimerCheckoutData.js +3 -0
- package/lib/commonjs/models/PrimerCheckoutData.js.map +1 -1
- package/lib/module/Primer.js +14 -3
- package/lib/module/Primer.js.map +1 -1
- package/lib/module/RNPrimer.js +1 -1
- package/lib/module/RNPrimer.js.map +1 -1
- package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js +17 -6
- package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +1 -1
- package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js +4 -0
- package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -1
- package/lib/module/headless_checkout/RNPrimerHeadlessUniversalCheckout.js +1 -1
- package/lib/module/headless_checkout/RNPrimerHeadlessUniversalCheckout.js.map +1 -1
- package/lib/module/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js +10 -0
- package/lib/module/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.js.map +1 -1
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/models/PrimerCheckoutAdditionalInfo.js +2 -0
- package/lib/module/models/PrimerCheckoutAdditionalInfo.js.map +1 -0
- package/lib/module/models/PrimerCheckoutData.js +2 -0
- package/lib/module/models/PrimerCheckoutData.js.map +1 -1
- package/lib/typescript/src/RNPrimer.d.ts +1 -1
- package/lib/typescript/src/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.d.ts +1 -0
- package/lib/typescript/src/headless_checkout/RNPrimerHeadlessUniversalCheckout.d.ts +1 -1
- package/lib/typescript/src/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.d.ts +1 -0
- package/lib/typescript/src/index.d.ts +1 -0
- package/lib/typescript/src/models/PrimerCheckoutAdditionalInfo.d.ts +10 -0
- package/lib/typescript/src/models/PrimerCheckoutData.d.ts +3 -1
- package/lib/typescript/src/models/PrimerRawData.d.ts +3 -0
- package/lib/typescript/src/models/PrimerSettings.d.ts +2 -0
- package/package.json +1 -1
- package/primer-io-react-native.podspec +1 -1
- package/src/Primer.ts +16 -0
- package/src/RNPrimer.ts +2 -0
- package/src/headless_checkout/PrimerHeadlessUniversalCheckout.ts +16 -0
- package/src/headless_checkout/PrimerHeadlessUniversalCheckoutRawDataManager.ts +4 -0
- package/src/headless_checkout/RNPrimerHeadlessUniversalCheckout.ts +2 -0
- package/src/headless_checkout/RNPrimerHeadlessUniversalCheckoutRawDataManager.ts +11 -0
- package/src/index.tsx +5 -1
- package/src/models/PrimerCheckoutAdditionalInfo.ts +11 -0
- package/src/models/PrimerCheckoutData.ts +5 -2
- package/src/models/PrimerRawData.ts +5 -1
- package/src/models/PrimerSettings.ts +8 -6
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.7.0'
|
|
141
141
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
package com.primerioreactnative
|
|
2
2
|
|
|
3
3
|
import com.primerioreactnative.datamodels.*
|
|
4
|
+
import com.primerioreactnative.extensions.*
|
|
4
5
|
import com.primerioreactnative.extensions.toPrimerCheckoutDataRN
|
|
5
6
|
import com.primerioreactnative.extensions.toPrimerClientSessionRN
|
|
6
7
|
import com.primerioreactnative.extensions.toPrimerPaymentMethodDataRN
|
|
@@ -13,6 +14,8 @@ import io.primer.android.completion.PrimerResumeDecisionHandler
|
|
|
13
14
|
import io.primer.android.domain.PrimerCheckoutData
|
|
14
15
|
import io.primer.android.domain.action.models.PrimerClientSession
|
|
15
16
|
import io.primer.android.domain.error.models.PrimerError
|
|
17
|
+
import io.primer.android.domain.payments.additionalInfo.MultibancoCheckoutAdditionalInfo
|
|
18
|
+
import io.primer.android.domain.payments.additionalInfo.PrimerCheckoutAdditionalInfo
|
|
16
19
|
import io.primer.android.domain.tokenization.models.PrimerPaymentMethodData
|
|
17
20
|
import io.primer.android.domain.tokenization.models.PrimerPaymentMethodTokenData
|
|
18
21
|
import kotlinx.serialization.encodeToString
|
|
@@ -38,7 +41,11 @@ class PrimerRNEventListener : PrimerCheckoutListener {
|
|
|
38
41
|
if (implementedRNCallbacks?.isOnCheckoutCompleteImplemented == true) {
|
|
39
42
|
sendEvent?.invoke(
|
|
40
43
|
PrimerEvents.ON_CHECKOUT_COMPLETE.eventName,
|
|
41
|
-
JSONObject(Json.encodeToString(checkoutData.toPrimerCheckoutDataRN()))
|
|
44
|
+
JSONObject(Json.encodeToString(checkoutData.toPrimerCheckoutDataRN())).apply {
|
|
45
|
+
val additionalInfoJson = optJSONObject(Keys.ADDITIONAL_INFO)
|
|
46
|
+
additionalInfoJson?.remove("type")
|
|
47
|
+
putOpt(Keys.ADDITIONAL_INFO, additionalInfoJson)
|
|
48
|
+
}
|
|
42
49
|
)
|
|
43
50
|
} else {
|
|
44
51
|
sendError?.invoke(
|
|
@@ -139,6 +146,22 @@ class PrimerRNEventListener : PrimerCheckoutListener {
|
|
|
139
146
|
}
|
|
140
147
|
}
|
|
141
148
|
|
|
149
|
+
override fun onResumePending(additionalInfo: PrimerCheckoutAdditionalInfo?) {
|
|
150
|
+
if (implementedRNCallbacks?.isOnResumePendingImplemented == true) {
|
|
151
|
+
if (additionalInfo is MultibancoCheckoutAdditionalInfo) {
|
|
152
|
+
sendEvent?.invoke(
|
|
153
|
+
PrimerEvents.ON_RESUME_PENDING.eventName,
|
|
154
|
+
JSONObject(Json.encodeToString(additionalInfo.toCheckoutAdditionalInfoRN()))
|
|
155
|
+
)
|
|
156
|
+
}
|
|
157
|
+
} else {
|
|
158
|
+
sendError?.invoke(
|
|
159
|
+
ErrorTypeRN.NativeBridgeFailed
|
|
160
|
+
errorTo "Callback [onResumePending] should be implemented."
|
|
161
|
+
)
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
142
165
|
override fun onDismissed() {
|
|
143
166
|
if (implementedRNCallbacks?.isOnDismissImplemented == true) {
|
|
144
167
|
sendEvent?.invoke(
|
package/android/src/main/java/com/primerioreactnative/PrimerRNHeadlessUniversalCheckoutListener.kt
CHANGED
|
@@ -4,6 +4,7 @@ import com.facebook.react.bridge.Arguments
|
|
|
4
4
|
import com.facebook.react.bridge.Callback
|
|
5
5
|
import com.facebook.react.bridge.Promise
|
|
6
6
|
import com.primerioreactnative.datamodels.*
|
|
7
|
+
import com.primerioreactnative.extensions.*
|
|
7
8
|
import com.primerioreactnative.extensions.toPrimerCheckoutDataRN
|
|
8
9
|
import com.primerioreactnative.extensions.toPrimerClientSessionRN
|
|
9
10
|
import com.primerioreactnative.extensions.toPrimerPaymentMethodDataRN
|
|
@@ -18,6 +19,8 @@ import io.primer.android.components.domain.core.models.PrimerHeadlessUniversalCh
|
|
|
18
19
|
import io.primer.android.domain.PrimerCheckoutData
|
|
19
20
|
import io.primer.android.domain.action.models.PrimerClientSession
|
|
20
21
|
import io.primer.android.domain.error.models.PrimerError
|
|
22
|
+
import io.primer.android.domain.payments.additionalInfo.MultibancoCheckoutAdditionalInfo
|
|
23
|
+
import io.primer.android.domain.payments.additionalInfo.PrimerCheckoutAdditionalInfo
|
|
21
24
|
import io.primer.android.domain.tokenization.models.PrimerPaymentMethodData
|
|
22
25
|
import io.primer.android.domain.tokenization.models.PrimerPaymentMethodTokenData
|
|
23
26
|
import kotlinx.serialization.encodeToString
|
|
@@ -79,7 +82,11 @@ class PrimerRNHeadlessUniversalCheckoutListener : PrimerHeadlessUniversalCheckou
|
|
|
79
82
|
if (implementedRNCallbacks?.isOnCheckoutCompleteImplemented == true) {
|
|
80
83
|
sendEvent?.invoke(
|
|
81
84
|
PrimerHeadlessUniversalCheckoutEvent.ON_CHECKOUT_COMPLETE.eventName,
|
|
82
|
-
JSONObject(Json.encodeToString(checkoutData.toPrimerCheckoutDataRN()))
|
|
85
|
+
JSONObject(Json.encodeToString(checkoutData.toPrimerCheckoutDataRN())).apply {
|
|
86
|
+
val additionalInfoJson = optJSONObject(Keys.ADDITIONAL_INFO)
|
|
87
|
+
additionalInfoJson?.remove("type")
|
|
88
|
+
putOpt(Keys.ADDITIONAL_INFO, additionalInfoJson)
|
|
89
|
+
}
|
|
83
90
|
)
|
|
84
91
|
} else {
|
|
85
92
|
sendError?.invoke(
|
|
@@ -180,6 +187,22 @@ class PrimerRNHeadlessUniversalCheckoutListener : PrimerHeadlessUniversalCheckou
|
|
|
180
187
|
}
|
|
181
188
|
}
|
|
182
189
|
|
|
190
|
+
override fun onResumePending(additionalInfo: PrimerCheckoutAdditionalInfo?) {
|
|
191
|
+
if (implementedRNCallbacks?.isOnResumePendingImplemented == true) {
|
|
192
|
+
if (additionalInfo is MultibancoCheckoutAdditionalInfo) {
|
|
193
|
+
sendEvent?.invoke(
|
|
194
|
+
PrimerEvents.ON_RESUME_PENDING.eventName,
|
|
195
|
+
JSONObject(Json.encodeToString(additionalInfo.toCheckoutAdditionalInfoRN()))
|
|
196
|
+
)
|
|
197
|
+
}
|
|
198
|
+
} else {
|
|
199
|
+
sendError?.invoke(
|
|
200
|
+
ErrorTypeRN.NativeBridgeFailed
|
|
201
|
+
errorTo "Callback [onResumePending] should be implemented."
|
|
202
|
+
)
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
183
206
|
override fun onFailed(
|
|
184
207
|
error: PrimerError,
|
|
185
208
|
checkoutData: PrimerCheckoutData?,
|
package/android/src/main/java/com/primerioreactnative/datamodels/PrimerCheckoutAdditionalInfoRN.kt
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
package com.primerioreactnative.datamodels
|
|
2
|
+
|
|
3
|
+
import kotlinx.serialization.Serializable
|
|
4
|
+
|
|
5
|
+
@Serializable
|
|
6
|
+
sealed class PrimerCheckoutAdditionalInfoRN
|
|
7
|
+
|
|
8
|
+
@Serializable
|
|
9
|
+
data class MultibancoCheckoutAdditionalInfoRN(
|
|
10
|
+
val expiresAt: String,
|
|
11
|
+
val reference: String,
|
|
12
|
+
val entity: String,
|
|
13
|
+
) : PrimerCheckoutAdditionalInfoRN()
|
|
@@ -3,7 +3,10 @@ package com.primerioreactnative.datamodels
|
|
|
3
3
|
import kotlinx.serialization.Serializable
|
|
4
4
|
|
|
5
5
|
@Serializable
|
|
6
|
-
data class PrimerCheckoutDataRN(
|
|
6
|
+
data class PrimerCheckoutDataRN(
|
|
7
|
+
val payment: PrimerPaymentRN,
|
|
8
|
+
val additionalInfo: PrimerCheckoutAdditionalInfoRN? = null
|
|
9
|
+
)
|
|
7
10
|
|
|
8
11
|
@Serializable
|
|
9
12
|
data class PrimerPaymentRN(
|
package/android/src/main/java/com/primerioreactnative/extensions/PrimerCheckoutAdditionalInfo.kt
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
package com.primerioreactnative.extensions
|
|
2
|
+
|
|
3
|
+
import com.primerioreactnative.datamodels.MultibancoCheckoutAdditionalInfoRN
|
|
4
|
+
import io.primer.android.domain.payments.additionalInfo.MultibancoCheckoutAdditionalInfo
|
|
5
|
+
import io.primer.android.domain.payments.additionalInfo.PrimerCheckoutAdditionalInfo
|
|
6
|
+
|
|
7
|
+
internal fun PrimerCheckoutAdditionalInfo.toCheckoutAdditionalInfoRN() = when (this) {
|
|
8
|
+
is MultibancoCheckoutAdditionalInfo ->
|
|
9
|
+
MultibancoCheckoutAdditionalInfoRN(expiresAt, reference, entity)
|
|
10
|
+
else -> null
|
|
11
|
+
}
|
|
12
|
+
|
|
@@ -4,4 +4,4 @@ import com.primerioreactnative.datamodels.PrimerCheckoutDataRN
|
|
|
4
4
|
import io.primer.android.domain.PrimerCheckoutData
|
|
5
5
|
|
|
6
6
|
internal fun PrimerCheckoutData.toPrimerCheckoutDataRN() =
|
|
7
|
-
PrimerCheckoutDataRN(payment.toPrimerPaymentRN())
|
|
7
|
+
PrimerCheckoutDataRN(payment.toPrimerPaymentRN(), additionalInfo?.toCheckoutAdditionalInfoRN())
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
package com.primerioreactnative.huc.datamodels.manager.raw
|
|
1
|
+
package com.primerioreactnative.huc.datamodels.manager.raw.card
|
|
2
2
|
|
|
3
3
|
import io.primer.android.components.domain.core.models.card.PrimerRawCardData
|
|
4
4
|
import kotlinx.serialization.Serializable
|
|
5
5
|
|
|
6
6
|
@Serializable
|
|
7
|
-
internal data class
|
|
7
|
+
internal data class PrimerRNPRawCardData(
|
|
8
8
|
val cardNumber: String? = null,
|
|
9
9
|
val cvv: String? = null,
|
|
10
10
|
val expiryMonth: String? = null,
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
package com.primerioreactnative.huc.datamodels.manager.raw.phoneNumber
|
|
2
|
+
|
|
3
|
+
import io.primer.android.components.domain.core.models.phoneNumber.PrimerRawPhoneNumberData
|
|
4
|
+
import kotlinx.serialization.Serializable
|
|
5
|
+
|
|
6
|
+
@Serializable
|
|
7
|
+
internal data class PrimerRNRawPhoneNumberData(
|
|
8
|
+
val phoneNumber: String? = null,
|
|
9
|
+
) {
|
|
10
|
+
fun toPrimerRawPhoneNumberData() =
|
|
11
|
+
PrimerRawPhoneNumberData(
|
|
12
|
+
phoneNumber.orEmpty()
|
|
13
|
+
)
|
|
14
|
+
}
|
|
@@ -5,7 +5,8 @@ import com.facebook.react.modules.core.DeviceEventManagerModule
|
|
|
5
5
|
import com.primerioreactnative.Keys
|
|
6
6
|
import com.primerioreactnative.datamodels.ErrorTypeRN
|
|
7
7
|
import com.primerioreactnative.datamodels.PrimerErrorRN
|
|
8
|
-
import com.primerioreactnative.huc.datamodels.manager.raw.
|
|
8
|
+
import com.primerioreactnative.huc.datamodels.manager.raw.card.PrimerRNPRawCardData
|
|
9
|
+
import com.primerioreactnative.huc.datamodels.manager.raw.phoneNumber.PrimerRNRawPhoneNumberData
|
|
9
10
|
import com.primerioreactnative.huc.events.PrimerHeadlessUniversalCheckoutEvent
|
|
10
11
|
import com.primerioreactnative.utils.convertJsonToMap
|
|
11
12
|
import com.primerioreactnative.utils.errorTo
|
|
@@ -20,12 +21,13 @@ import org.json.JSONObject
|
|
|
20
21
|
|
|
21
22
|
@ExperimentalPrimerApi
|
|
22
23
|
internal class PrimerRNHeadlessUniversalCheckoutRawManager(
|
|
23
|
-
|
|
24
|
+
reactContext: ReactApplicationContext,
|
|
24
25
|
private val json: Json,
|
|
25
26
|
) : ReactContextBaseJavaModule(reactContext) {
|
|
26
27
|
|
|
27
28
|
private val listener = PrimerRNHeadlessUniversalCheckoutRawManagerListener()
|
|
28
29
|
private lateinit var rawManager: PrimerHeadlessUniversalCheckoutRawDataManagerInterface
|
|
30
|
+
private var paymentMethodTypeStr: String? = null
|
|
29
31
|
|
|
30
32
|
init {
|
|
31
33
|
listener.sendEvent = { eventName, paramsJson -> sendEvent(eventName, paramsJson) }
|
|
@@ -39,6 +41,7 @@ internal class PrimerRNHeadlessUniversalCheckoutRawManager(
|
|
|
39
41
|
rawManager = PrimerHeadlessUniversalCheckoutRawDataManager.newInstance(
|
|
40
42
|
paymentMethodTypeStr
|
|
41
43
|
)
|
|
44
|
+
this.paymentMethodTypeStr = paymentMethodTypeStr
|
|
42
45
|
rawManager.setManagerListener(listener)
|
|
43
46
|
promise.resolve(null)
|
|
44
47
|
} catch (e: Exception) {
|
|
@@ -57,7 +60,7 @@ internal class PrimerRNHeadlessUniversalCheckoutRawManager(
|
|
|
57
60
|
val exception =
|
|
58
61
|
ErrorTypeRN.NativeBridgeFailed errorTo "The PrimerHeadlessUniversalCheckoutRawDataManager" +
|
|
59
62
|
" has not been initialized. Make sure you have called the" +
|
|
60
|
-
"
|
|
63
|
+
" HeadlessUniversalCheckoutRawDataManager.configure function first."
|
|
61
64
|
promise.reject(exception.errorId, exception.description)
|
|
62
65
|
} else {
|
|
63
66
|
promise.resolve(
|
|
@@ -79,20 +82,25 @@ internal class PrimerRNHeadlessUniversalCheckoutRawManager(
|
|
|
79
82
|
val exception =
|
|
80
83
|
ErrorTypeRN.NativeBridgeFailed errorTo "The PrimerHeadlessUniversalCheckoutRawDataManager" +
|
|
81
84
|
" has not been initialized. Make sure you have called the" +
|
|
82
|
-
"
|
|
85
|
+
" HeadlessUniversalCheckoutRawDataManager.configure function first."
|
|
83
86
|
promise.reject(exception.errorId, exception.description)
|
|
84
87
|
} else {
|
|
85
88
|
try {
|
|
86
|
-
val rawData =
|
|
87
|
-
json.decodeFromString<
|
|
89
|
+
val rawData = when (paymentMethodTypeStr) {
|
|
90
|
+
"PAYMENT_CARD" -> json.decodeFromString<PrimerRNPRawCardData>(
|
|
88
91
|
rawDataStr
|
|
89
|
-
)
|
|
90
|
-
|
|
92
|
+
).toPrimerCardData()
|
|
93
|
+
"XENDIT_OVO" -> json.decodeFromString<PrimerRNRawPhoneNumberData>(
|
|
94
|
+
rawDataStr
|
|
95
|
+
).toPrimerRawPhoneNumberData()
|
|
96
|
+
else -> throw IllegalArgumentException("")
|
|
97
|
+
}
|
|
98
|
+
rawManager.setRawData(rawData)
|
|
91
99
|
promise.resolve(null)
|
|
92
100
|
} catch (e: Exception) {
|
|
93
101
|
val exception =
|
|
94
|
-
ErrorTypeRN.NativeBridgeFailed errorTo "Failed to decode
|
|
95
|
-
" Make sure you're providing a valid
|
|
102
|
+
ErrorTypeRN.NativeBridgeFailed errorTo "Failed to decode $rawDataStr on Android." +
|
|
103
|
+
" Make sure you're providing a valid object"
|
|
96
104
|
onError(exception)
|
|
97
105
|
promise.reject(exception.errorId, exception.description, e)
|
|
98
106
|
}
|
|
@@ -105,7 +113,7 @@ internal class PrimerRNHeadlessUniversalCheckoutRawManager(
|
|
|
105
113
|
val exception =
|
|
106
114
|
ErrorTypeRN.NativeBridgeFailed errorTo "The PrimerHeadlessUniversalCheckoutRawDataManager" +
|
|
107
115
|
" has not been initialized. Make sure you have called the" +
|
|
108
|
-
"
|
|
116
|
+
" HeadlessUniversalCheckoutRawDataManager.configure function first."
|
|
109
117
|
promise.reject(exception.errorId, exception.description)
|
|
110
118
|
} else {
|
|
111
119
|
rawManager.submit()
|
|
@@ -113,6 +121,20 @@ internal class PrimerRNHeadlessUniversalCheckoutRawManager(
|
|
|
113
121
|
}
|
|
114
122
|
}
|
|
115
123
|
|
|
124
|
+
@ReactMethod
|
|
125
|
+
fun disposeRawDataManager(promise: Promise) {
|
|
126
|
+
if (::rawManager.isInitialized.not()) {
|
|
127
|
+
val exception =
|
|
128
|
+
ErrorTypeRN.NativeBridgeFailed errorTo "The PrimerHeadlessUniversalCheckoutRawDataManager" +
|
|
129
|
+
" has not been initialized. Make sure you have called the" +
|
|
130
|
+
" HeadlessUniversalCheckoutRawDataManager.configure function first."
|
|
131
|
+
promise.reject(exception.errorId, exception.description)
|
|
132
|
+
} else {
|
|
133
|
+
rawManager.cleanup()
|
|
134
|
+
promise.resolve(null)
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
116
138
|
private fun sendEvent(name: String, params: WritableMap) {
|
|
117
139
|
reactApplicationContext.getJSModule(
|
|
118
140
|
DeviceEventManagerModule.RCTDeviceEventEmitter::class.java
|
|
@@ -19,6 +19,8 @@ data class PrimerHeadlessUniversalCheckoutImplementedRNCallbacks(
|
|
|
19
19
|
val isOnTokenizeSuccessImplemented: Boolean? = null,
|
|
20
20
|
@SerialName("onResumeSuccess")
|
|
21
21
|
val isOnResumeSuccessImplemented: Boolean? = null,
|
|
22
|
+
@SerialName("onResumePending")
|
|
23
|
+
val isOnResumePendingImplemented: Boolean? = null,
|
|
22
24
|
@SerialName("onHUCTokenizeStart")
|
|
23
25
|
val isOnHUCTokenizeStartsImplemented: Boolean? = null,
|
|
24
26
|
@SerialName("onHUCPrepareStart")
|
|
@@ -21,4 +21,6 @@ data class PrimerImplementedRNCallbacks(
|
|
|
21
21
|
val isOnTokenizeSuccessImplemented: Boolean? = null,
|
|
22
22
|
@SerialName("onResumeSuccess")
|
|
23
23
|
val isOnResumeSuccessImplemented: Boolean? = null,
|
|
24
|
+
@SerialName("onResumePending")
|
|
25
|
+
val isOnResumePendingImplemented: Boolean? = null,
|
|
24
26
|
)
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import Foundation
|
|
9
9
|
|
|
10
10
|
internal struct ImplementedRNCallbacks: Decodable {
|
|
11
|
-
|
|
11
|
+
|
|
12
12
|
internal var isOnCheckoutCompleteImplemented: Bool = false
|
|
13
13
|
internal var isOnBeforeClientSessionUpdateImplemented: Bool = false
|
|
14
14
|
internal var isOnClientSessionUpdateImplemented: Bool = false
|
|
@@ -17,11 +17,12 @@ internal struct ImplementedRNCallbacks: Decodable {
|
|
|
17
17
|
internal var isOnDismissImplemented: Bool = false
|
|
18
18
|
internal var isOnTokenizeSuccessImplemented: Bool = false
|
|
19
19
|
internal var isOnResumeSuccessImplemented: Bool = false
|
|
20
|
+
internal var isOnResumePendingImplemented: Bool = false
|
|
20
21
|
internal var isOnHUCTokenizeStartImplemented: Bool = false
|
|
21
22
|
internal var isOnHUCPrepareStartImplemented: Bool = false
|
|
22
23
|
internal var isOnHUCAvailablePaymentMethodsLoadedImplemented: Bool = false
|
|
23
24
|
internal var isOnHUCPaymentMethodShowImplemented: Bool = false
|
|
24
|
-
|
|
25
|
+
|
|
25
26
|
enum CodingKeys: String, CodingKey {
|
|
26
27
|
case isOnCheckoutCompleteImplemented = "onCheckoutComplete"
|
|
27
28
|
case isOnBeforeClientSessionUpdateImplemented = "onBeforeClientSessionUpdate"
|
|
@@ -31,12 +32,13 @@ internal struct ImplementedRNCallbacks: Decodable {
|
|
|
31
32
|
case isOnDismissImplemented = "onDismiss"
|
|
32
33
|
case isOnTokenizeSuccessImplemented = "onTokenizeSuccess"
|
|
33
34
|
case isOnResumeSuccessImplemented = "onResumeSuccess"
|
|
35
|
+
case isOnResumePendingImplemented = "onResumePending"
|
|
34
36
|
case isOnHUCTokenizeStartImplemented = "onHUCTokenizeStart"
|
|
35
37
|
case isOnHUCPrepareStartImplemented = "onHUCPrepareStart"
|
|
36
38
|
case isOnHUCAvailablePaymentMethodsLoadedImplemented = "onHUCAvailablePaymentMethodsLoaded"
|
|
37
39
|
case isOnHUCPaymentMethodShowImplemented = "onHUCPaymentMethodShow"
|
|
38
40
|
}
|
|
39
|
-
|
|
41
|
+
|
|
40
42
|
init(from decoder: Decoder) throws {
|
|
41
43
|
let container = try decoder.container(keyedBy: CodingKeys.self)
|
|
42
44
|
|
|
@@ -48,6 +50,7 @@ internal struct ImplementedRNCallbacks: Decodable {
|
|
|
48
50
|
self.isOnDismissImplemented = (try? container.decode(Bool?.self, forKey: .isOnDismissImplemented)) ?? false
|
|
49
51
|
self.isOnTokenizeSuccessImplemented = (try? container.decode(Bool?.self, forKey: .isOnTokenizeSuccessImplemented)) ?? false
|
|
50
52
|
self.isOnResumeSuccessImplemented = (try? container.decode(Bool?.self, forKey: .isOnResumeSuccessImplemented)) ?? false
|
|
53
|
+
self.isOnResumePendingImplemented = (try? container.decode(Bool?.self, forKey: .isOnResumePendingImplemented)) ?? false
|
|
51
54
|
self.isOnHUCTokenizeStartImplemented = (try? container.decode(Bool?.self, forKey: .isOnHUCTokenizeStartImplemented)) ?? false
|
|
52
55
|
self.isOnHUCPrepareStartImplemented = (try? container.decode(Bool?.self, forKey: .isOnHUCPrepareStartImplemented)) ?? false
|
|
53
56
|
self.isOnHUCAvailablePaymentMethodsLoadedImplemented = (try? container.decode(Bool?.self, forKey: .isOnHUCAvailablePaymentMethodsLoadedImplemented)) ?? false
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
//
|
|
2
|
+
// RNTPrimerPhoneNumberData.swift
|
|
3
|
+
// primer-io-react-native
|
|
4
|
+
//
|
|
5
|
+
// Created by Dario Carlomagno on 18/8/22.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
import PrimerSDK
|
|
10
|
+
|
|
11
|
+
extension PrimerPhoneNumberData {
|
|
12
|
+
|
|
13
|
+
convenience init?(phoneNumbeDatarStr: String) {
|
|
14
|
+
do {
|
|
15
|
+
guard let data = phoneNumbeDatarStr.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 phoneNumber = dict["phoneNumber"]
|
|
26
|
+
{
|
|
27
|
+
self.init(
|
|
28
|
+
phoneNumber: phoneNumber)
|
|
29
|
+
} else {
|
|
30
|
+
return nil
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
} catch {
|
|
34
|
+
return nil
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
}
|
|
@@ -17,6 +17,7 @@ enum PrimerHeadlessUniversalCheckoutEvents: Int, CaseIterable {
|
|
|
17
17
|
case onHUCPaymentMethodShow
|
|
18
18
|
case onTokenizeSuccess
|
|
19
19
|
case onResumeSuccess
|
|
20
|
+
case onResumePending
|
|
20
21
|
case onBeforePaymentCreate
|
|
21
22
|
case onBeforeClientSessionUpdate
|
|
22
23
|
case onClientSessionUpdate
|
|
@@ -35,6 +36,8 @@ enum PrimerHeadlessUniversalCheckoutEvents: Int, CaseIterable {
|
|
|
35
36
|
return "onTokenizeSuccess"
|
|
36
37
|
case .onResumeSuccess:
|
|
37
38
|
return "onResumeSuccess"
|
|
39
|
+
case .onResumePending:
|
|
40
|
+
return "onResumePending"
|
|
38
41
|
case .onBeforePaymentCreate:
|
|
39
42
|
return "onBeforePaymentCreate"
|
|
40
43
|
case .onBeforeClientSessionUpdate:
|
|
@@ -398,6 +401,25 @@ extension RNTPrimerHeadlessUniversalCheckout: PrimerHeadlessUniversalCheckoutDel
|
|
|
398
401
|
}
|
|
399
402
|
}
|
|
400
403
|
}
|
|
404
|
+
|
|
405
|
+
func primerHeadlessUniversalCheckoutDidEnterResumePendingWithPaymentAdditionalInfo(_ additionalInfo: PrimerCheckoutAdditionalInfo?) {
|
|
406
|
+
DispatchQueue.main.async {
|
|
407
|
+
if self.implementedRNCallbacks?.isOnResumePendingImplemented == true {
|
|
408
|
+
do {
|
|
409
|
+
let checkoutAdditionalInfo = try JSONEncoder().encode(additionalInfo)
|
|
410
|
+
let checkoutAdditionalInfoJson = try JSONSerialization.jsonObject(with: checkoutAdditionalInfo, options: .allowFragments)
|
|
411
|
+
self.sendEvent(withName: PrimerHeadlessUniversalCheckoutEvents.onResumePending.stringValue, body: checkoutAdditionalInfoJson)
|
|
412
|
+
} catch {
|
|
413
|
+
let checkoutData = PrimerCheckoutData(payment: nil, additionalInfo: additionalInfo)
|
|
414
|
+
self.handleRNBridgeError(error, checkoutData: checkoutData, stopOnDebug: true)
|
|
415
|
+
}
|
|
416
|
+
} else {
|
|
417
|
+
let err = NSError(domain: "native-bridge", code: 1, userInfo: [NSLocalizedDescriptionKey: "Callback [onResumePending] should be implemented."])
|
|
418
|
+
let checkoutData = PrimerCheckoutData(payment: nil, additionalInfo: additionalInfo)
|
|
419
|
+
self.handleRNBridgeError(err, checkoutData: checkoutData, stopOnDebug: false)
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
401
423
|
|
|
402
424
|
func primerHeadlessUniversalCheckoutClientSessionWillUpdate() {
|
|
403
425
|
if self.implementedRNCallbacks?.isOnBeforeClientSessionUpdateImplemented == true {
|
|
@@ -405,7 +427,7 @@ extension RNTPrimerHeadlessUniversalCheckout: PrimerHeadlessUniversalCheckoutDel
|
|
|
405
427
|
self.sendEvent(withName: PrimerHeadlessUniversalCheckoutEvents.onBeforeClientSessionUpdate.stringValue, body: nil)
|
|
406
428
|
}
|
|
407
429
|
} else {
|
|
408
|
-
//
|
|
430
|
+
// React Native app hasn't implemented this callback, ignore.
|
|
409
431
|
}
|
|
410
432
|
}
|
|
411
433
|
|
package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutRawDataManager.swift
CHANGED
|
@@ -88,14 +88,20 @@ class RNTPrimerHeadlessUniversalCheckoutRawDataManager: RCTEventEmitter {
|
|
|
88
88
|
return
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
if let rawCardData = PrimerCardData(cardDataStr: rawDataStr) {
|
|
92
|
+
rawDataManager.rawData = rawCardData
|
|
93
|
+
resolver(nil)
|
|
94
94
|
return
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
|
|
98
|
-
|
|
97
|
+
if let rawPhoneNumberData = PrimerPhoneNumberData(phoneNumbeDatarStr: rawDataStr) {
|
|
98
|
+
rawDataManager.rawData = rawPhoneNumberData
|
|
99
|
+
resolver(nil)
|
|
100
|
+
return
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
let err = NSError(domain: "native-bridge", code: 1, userInfo: [NSLocalizedDescriptionKey: "Failed to decode RawData on iOS. Make sure you're providing a valid 'PrimerRawData' (or any inherited) object"])
|
|
104
|
+
rejecter(err.rnError["errorId"]!, err.rnError["description"], err)
|
|
99
105
|
}
|
|
100
106
|
|
|
101
107
|
@objc
|