@primer-io/react-native 0.13.0-beta.1 → 0.15.2
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 +6 -2
- package/android/consumer-rules.pro +12 -0
- package/android/gradle.properties +1 -1
- package/android/src/main/java/com/primerioreactnative/PrimerRN.kt +192 -153
- package/android/src/main/java/com/primerioreactnative/PrimerRNEventListener.kt +131 -86
- package/android/src/main/java/com/primerioreactnative/ReactNativePackage.kt +3 -14
- package/android/src/main/java/com/primerioreactnative/datamodels/PrimerErrorRN.kt +3 -4
- package/android/src/main/java/com/primerioreactnative/datamodels/PrimerEventsRN.kt +11 -0
- package/android/src/main/java/com/primerioreactnative/datamodels/PrimerSettingsRN.kt +4 -3
- package/android/src/main/java/com/primerioreactnative/utils/ErrorHelper.kt +11 -0
- package/android/src/main/java/com/primerioreactnative/utils/PrimerImplementedRNCallbacks.kt +14 -0
- package/ios/DataModels/PrimerErrorRN.swift +1 -1
- package/ios/DataModels/PrimerSettingsRN.swift +6 -0
- package/ios/RNTPrimer.m +43 -0
- package/ios/RNTPrimer.swift +394 -0
- package/ios/ReactNative-Bridging-Header.h +3 -0
- package/ios/ReactNative.xcodeproj/project.pbxproj +44 -0
- package/lib/commonjs/Primer.js +220 -209
- package/lib/commonjs/Primer.js.map +1 -1
- package/lib/commonjs/RNPrimer.js +145 -0
- package/lib/commonjs/RNPrimer.js.map +1 -0
- package/lib/commonjs/index.js +1 -28
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/models/primer-intent.js.map +1 -1
- package/lib/commonjs/models/utils/redirectScheme.js +4 -0
- package/lib/commonjs/models/utils/redirectScheme.js.map +1 -0
- package/lib/module/Primer.js +204 -210
- package/lib/module/Primer.js.map +1 -1
- package/lib/module/RNPrimer.js +136 -0
- package/lib/module/RNPrimer.js.map +1 -0
- package/lib/module/index.js +3 -4
- package/lib/module/index.js.map +1 -1
- package/lib/module/models/primer-intent.js.map +1 -1
- package/lib/module/models/utils/redirectScheme.js +2 -0
- package/lib/module/models/utils/redirectScheme.js.map +1 -0
- package/lib/typescript/Primer.d.ts +13 -0
- package/lib/typescript/RNPrimer.d.ts +24 -0
- package/lib/typescript/index.d.ts +1 -3
- package/lib/typescript/models/primer-callbacks.d.ts +7 -9
- package/lib/typescript/models/primer-config.d.ts +16 -13
- package/lib/typescript/models/primer-intent.d.ts +1 -1
- package/lib/typescript/models/primer-request.d.ts +2 -12
- package/lib/typescript/models/primer-settings.d.ts +5 -6
- package/lib/typescript/models/primer.d.ts +4 -4
- package/lib/typescript/models/utils/redirectScheme.d.ts +3 -0
- package/package.json +4 -1
- package/primer-io-react-native.podspec +2 -3
- package/src/Primer.ts +227 -178
- package/src/RNPrimer.ts +170 -0
- package/src/index.tsx +2 -3
- package/src/models/primer-callbacks.ts +9 -27
- package/src/models/primer-config.ts +23 -20
- package/src/models/primer-intent.ts +1 -1
- package/src/models/primer-request.ts +2 -16
- package/src/models/primer-settings.ts +5 -6
- package/src/models/primer.ts +5 -5
- package/src/models/utils/redirectScheme.ts +5 -0
- package/android/src/main/java/com/primerioreactnative/PrimerCardNumberEditTextManager.kt +0 -83
- package/android/src/main/java/com/primerioreactnative/PrimerHeadlessUniversalCheckout.kt +0 -201
- package/android/src/main/java/com/primerioreactnative/huc/assets/AssetsManager.kt +0 -56
- package/android/src/main/java/com/primerioreactnative/huc/events/PrimerHeadlessUniversalCheckoutEvent.kt +0 -11
- package/android/src/main/java/com/primerioreactnative/huc/extensions/Map.kt +0 -10
- package/ios/Core/PrimerRN+PrimerDelegate.swift +0 -148
- package/ios/Core/PrimerRN.m +0 -34
- package/ios/Core/PrimerRN.swift +0 -168
- package/ios/Core/ReactNative-Bridging-Header.h +0 -13
- package/ios/Headless Universal Checkout/RNTPrimerCardNumberInputElementManager.m +0 -23
- package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.m +0 -30
- package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.swift +0 -241
- package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.m +0 -14
- package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.swift +0 -117
- package/lib/commonjs/PrimerInput.js +0 -80
- package/lib/commonjs/PrimerInput.js.map +0 -1
- package/lib/commonjs/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js +0 -14
- package/lib/commonjs/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js.map +0 -1
- package/lib/commonjs/headless_checkout/NativePrimerHeadlessUniversalCheckout.js +0 -73
- package/lib/commonjs/headless_checkout/NativePrimerHeadlessUniversalCheckout.js.map +0 -1
- package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js +0 -119
- package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +0 -1
- package/lib/commonjs/headless_checkout/types.js +0 -2
- package/lib/commonjs/headless_checkout/types.js.map +0 -1
- package/lib/module/PrimerInput.js +0 -46
- package/lib/module/PrimerInput.js.map +0 -1
- package/lib/module/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js +0 -5
- package/lib/module/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js.map +0 -1
- package/lib/module/headless_checkout/NativePrimerHeadlessUniversalCheckout.js +0 -64
- package/lib/module/headless_checkout/NativePrimerHeadlessUniversalCheckout.js.map +0 -1
- package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js +0 -104
- package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +0 -1
- package/lib/module/headless_checkout/types.js +0 -2
- package/lib/module/headless_checkout/types.js.map +0 -1
- package/lib/typescript/PrimerInput.d.ts +0 -15
- package/lib/typescript/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.d.ts +0 -1
- package/lib/typescript/headless_checkout/NativePrimerHeadlessUniversalCheckout.d.ts +0 -10
- package/lib/typescript/headless_checkout/PrimerHeadlessUniversalCheckout.d.ts +0 -14
- package/lib/typescript/headless_checkout/types.d.ts +0 -16
- package/src/PrimerInput.tsx +0 -73
- package/src/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.tsx +0 -2
- package/src/headless_checkout/NativePrimerHeadlessUniversalCheckout.ts +0 -94
- package/src/headless_checkout/PrimerHeadlessUniversalCheckout.ts +0 -136
- package/src/headless_checkout/types.ts +0 -18
|
@@ -1,124 +1,169 @@
|
|
|
1
1
|
package com.primerioreactnative
|
|
2
2
|
|
|
3
3
|
import android.util.Log
|
|
4
|
-
import com.
|
|
5
|
-
import com.primerioreactnative.
|
|
6
|
-
import com.primerioreactnative.
|
|
7
|
-
import com.primerioreactnative.
|
|
8
|
-
import com.primerioreactnative.datamodels.PrimerPaymentInstrumentTokenRN
|
|
9
|
-
import com.primerioreactnative.utils.PrimerEventQueueRN
|
|
4
|
+
import com.primerioreactnative.datamodels.*
|
|
5
|
+
import com.primerioreactnative.utils.PrimerImplementedRNCallbacks
|
|
6
|
+
import com.primerioreactnative.utils.asError
|
|
7
|
+
import com.primerioreactnative.utils.errorTo
|
|
10
8
|
import io.primer.android.CheckoutEventListener
|
|
11
|
-
import io.primer.android.completion.ActionResumeHandler
|
|
12
9
|
import io.primer.android.completion.ResumeHandler
|
|
13
10
|
import io.primer.android.events.CheckoutEvent
|
|
14
11
|
import kotlinx.serialization.encodeToString
|
|
15
12
|
import kotlinx.serialization.json.Json
|
|
13
|
+
import org.json.JSONObject
|
|
16
14
|
|
|
17
15
|
class PrimerRNEventListener : CheckoutEventListener {
|
|
18
16
|
|
|
19
|
-
private var
|
|
20
|
-
private var
|
|
21
|
-
private var
|
|
22
|
-
private var
|
|
23
|
-
private var
|
|
24
|
-
var onPrimerErrorQueue: PrimerEventQueueRN? = null
|
|
25
|
-
var onSavedPaymentInstrumentsFetchedQueue: PrimerEventQueueRN? = null
|
|
17
|
+
private var clientTokenCallback: ((String?, PrimerErrorRN?) -> Unit)? = null
|
|
18
|
+
private var onClientSessionActions: ((String?, PrimerErrorRN?) -> Unit)? = null
|
|
19
|
+
private var onTokenizeSuccess: ((String?, PrimerErrorRN?) -> Unit)? = null
|
|
20
|
+
private var onResumeSuccess: ((String?, PrimerErrorRN?) -> Unit)? = null
|
|
21
|
+
private var implementedRNCallbacks: PrimerImplementedRNCallbacks? = null
|
|
26
22
|
|
|
27
|
-
var
|
|
28
|
-
var actionCompletion: ((error: String?, token: String?) -> Unit)? = null
|
|
23
|
+
private var resumeHandler: ResumeHandler? = null
|
|
29
24
|
|
|
30
|
-
var
|
|
31
|
-
var
|
|
32
|
-
|
|
33
|
-
fun configureOnTokenizeSuccess(callback: Callback) {
|
|
34
|
-
onTokenizeSuccessQueue = PrimerEventQueueRN()
|
|
35
|
-
onTokenizeSuccessQueue?.poll(callback)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
fun configureOnClientSessionActions(callback: Callback) {
|
|
39
|
-
onClientSessionActionsQueue = PrimerEventQueueRN()
|
|
40
|
-
onClientSessionActionsQueue?.poll(callback)
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
fun configureOnResumeSuccess(callback: Callback) {
|
|
44
|
-
onResumeSuccessQueue = PrimerEventQueueRN()
|
|
45
|
-
onResumeSuccessQueue?.poll(callback)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
fun configureOnVaultSuccess(callback: Callback) {
|
|
49
|
-
onVaultSuccessQueue = PrimerEventQueueRN()
|
|
50
|
-
onVaultSuccessQueue?.poll(callback)
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
fun configureOnDismiss(callback: Callback) {
|
|
54
|
-
onDismissQueue = PrimerEventQueueRN()
|
|
55
|
-
onDismissQueue?.poll(callback)
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
fun configureOnPrimerError(callback: Callback) {
|
|
59
|
-
onPrimerErrorQueue = PrimerEventQueueRN()
|
|
60
|
-
onPrimerErrorQueue?.poll(callback)
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
fun configureOnSavedPaymentInstrumentsFetched(callback: Callback) {
|
|
64
|
-
onSavedPaymentInstrumentsFetchedQueue = PrimerEventQueueRN()
|
|
65
|
-
onSavedPaymentInstrumentsFetchedQueue?.poll(callback)
|
|
66
|
-
}
|
|
25
|
+
var sendEvent: ((eventName: String, paramsJson: JSONObject?) -> Unit)? = null
|
|
26
|
+
var sendError: ((error: PrimerErrorRN) -> Unit)? = null
|
|
67
27
|
|
|
68
28
|
override fun onClientSessionActions(event: CheckoutEvent.OnClientSessionActions) {
|
|
69
29
|
val token = PrimerOnClientSessionActionsRequestRN.build(event.data)
|
|
70
|
-
val request = Json.encodeToString(token)
|
|
30
|
+
val request = JSONObject(Json.encodeToString(token))
|
|
71
31
|
|
|
72
|
-
|
|
73
|
-
|
|
32
|
+
onClientSessionActions = { newClientToken, err ->
|
|
33
|
+
when {
|
|
34
|
+
err != null -> resumeHandler?.handleError(err.asError())
|
|
35
|
+
newClientToken != null -> resumeHandler?.handleNewClientToken(newClientToken)
|
|
36
|
+
else -> resumeHandler?.handleSuccess()
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
event.resumeHandler.handleClientToken(null)
|
|
41
|
+
sendEvent?.invoke(PrimerEventsRN.OnClientSessionActions.string, request)
|
|
74
42
|
}
|
|
75
43
|
|
|
76
44
|
override fun onCheckoutEvent(e: CheckoutEvent) {
|
|
77
45
|
when (e) {
|
|
78
|
-
is CheckoutEvent.TokenAddedToVault -> {
|
|
79
|
-
val token = PrimerPaymentInstrumentTokenRN.fromPaymentMethodToken(e.data)
|
|
80
|
-
val request = Json.encodeToString(token)
|
|
81
|
-
onVaultSuccessQueue?.addRequestAndPoll(request)
|
|
82
|
-
}
|
|
83
46
|
is CheckoutEvent.TokenizationSuccess -> {
|
|
84
47
|
val token = PrimerPaymentInstrumentTokenRN.fromPaymentMethodToken(e.data)
|
|
85
|
-
val request = Json.encodeToString(token)
|
|
86
|
-
|
|
48
|
+
val request = JSONObject(Json.encodeToString(token))
|
|
49
|
+
onTokenizeSuccess = { newClientToken, err ->
|
|
50
|
+
when {
|
|
51
|
+
err != null -> resumeHandler?.handleError(err.asError())
|
|
52
|
+
newClientToken != null -> resumeHandler?.handleNewClientToken(newClientToken)
|
|
53
|
+
else -> resumeHandler?.handleSuccess()
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
87
57
|
resumeHandler = e.resumeHandler
|
|
88
|
-
|
|
89
|
-
is CheckoutEvent.TokenSelected -> {
|
|
90
|
-
val token = PrimerPaymentInstrumentTokenRN.fromPaymentMethodToken(e.data)
|
|
91
|
-
val request = Json.encodeToString(token)
|
|
92
|
-
onTokenizeSuccessQueue?.addRequestAndPoll(request)
|
|
58
|
+
sendEvent?.invoke(PrimerEventsRN.OnTokenizeSuccessCallback.string, request)
|
|
93
59
|
}
|
|
94
60
|
is CheckoutEvent.ResumeSuccess -> {
|
|
95
61
|
val token = e.resumeToken
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
62
|
+
if (implementedRNCallbacks?.isOnResumeSuccessImplemented == true) {
|
|
63
|
+
onResumeSuccess = { newClientToken, err ->
|
|
64
|
+
when {
|
|
65
|
+
err != null -> resumeHandler?.handleError(err.asError())
|
|
66
|
+
newClientToken != null -> resumeHandler?.handleNewClientToken(newClientToken)
|
|
67
|
+
else -> resumeHandler?.handleSuccess()
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
resumeHandler = e.resumeHandler
|
|
72
|
+
val resumeToken = mapOf(Keys.RESUME_TOKEN to token)
|
|
73
|
+
sendEvent?.invoke(
|
|
74
|
+
PrimerEventsRN.OnResumeSuccess.string,
|
|
75
|
+
JSONObject(Json.encodeToString(resumeToken))
|
|
76
|
+
)
|
|
77
|
+
} else {
|
|
78
|
+
sendError?.invoke(ErrorTypeRN.InitFailed
|
|
79
|
+
errorTo "Callback [onResumeSuccess] should had been implemented.")
|
|
80
|
+
}
|
|
102
81
|
}
|
|
103
82
|
is CheckoutEvent.ApiError -> {
|
|
104
83
|
Log.e("PrimerRN", "ApiError: ${e.data}")
|
|
105
|
-
val exception =
|
|
106
|
-
|
|
107
|
-
|
|
84
|
+
val exception = ErrorTypeRN.CheckoutFlowFailed errorTo e.data.description
|
|
85
|
+
sendError?.invoke(exception)
|
|
86
|
+
}
|
|
87
|
+
is CheckoutEvent.TokenAddedToVault -> {
|
|
88
|
+
val token = PrimerPaymentInstrumentTokenRN.fromPaymentMethodToken(e.data)
|
|
89
|
+
val request = JSONObject(Json.encodeToString(token))
|
|
90
|
+
sendEvent?.invoke(
|
|
91
|
+
PrimerEventsRN.OnVaultSuccess.string,
|
|
92
|
+
request
|
|
108
93
|
)
|
|
109
|
-
|
|
110
|
-
|
|
94
|
+
}
|
|
95
|
+
is CheckoutEvent.TokenSelected -> {
|
|
96
|
+
val token = PrimerPaymentInstrumentTokenRN.fromPaymentMethodToken(e.data)
|
|
97
|
+
val request = JSONObject(Json.encodeToString(token))
|
|
98
|
+
onTokenizeSuccess = { newClientToken, err ->
|
|
99
|
+
when {
|
|
100
|
+
err != null -> resumeHandler?.handleError(err.asError())
|
|
101
|
+
newClientToken != null -> resumeHandler?.handleNewClientToken(newClientToken)
|
|
102
|
+
else -> resumeHandler?.handleSuccess()
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
resumeHandler = e.resumeHandler
|
|
107
|
+
sendEvent?.invoke(PrimerEventsRN.OnTokenizeSuccessCallback.string, request)
|
|
108
|
+
}
|
|
109
|
+
is CheckoutEvent.Exit -> {
|
|
110
|
+
removeCallbacksAndHandlers()
|
|
111
|
+
if (implementedRNCallbacks?.isOnCheckoutDismissedImplemented == true) {
|
|
112
|
+
sendEvent?.invoke(
|
|
113
|
+
PrimerEventsRN.OnCheckoutDismissed.string,
|
|
114
|
+
null
|
|
115
|
+
)
|
|
116
|
+
} else {
|
|
117
|
+
sendError?.invoke(ErrorTypeRN.InitFailed
|
|
118
|
+
errorTo "Callback [onCheckoutDismissed] should had been implemented.")
|
|
119
|
+
}
|
|
111
120
|
}
|
|
112
121
|
is CheckoutEvent.TokenizationError -> {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
ErrorTypeRN.TokenizationFailed
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
122
|
+
if (implementedRNCallbacks?.isCheckoutFailedImplemented == true) {
|
|
123
|
+
Log.e("PrimerRN", "TokenizationError: ${e.data}")
|
|
124
|
+
val exception = ErrorTypeRN.TokenizationFailed errorTo e.data.description
|
|
125
|
+
sendError?.invoke(exception)
|
|
126
|
+
} else {
|
|
127
|
+
sendError?.invoke(ErrorTypeRN.InitFailed
|
|
128
|
+
errorTo "Callback [onResumeError] should had been implemented.")
|
|
129
|
+
}
|
|
120
130
|
}
|
|
121
131
|
else -> Unit
|
|
122
132
|
}
|
|
123
133
|
}
|
|
134
|
+
|
|
135
|
+
fun onClientTokenCallback(clientToken: String?, error: PrimerErrorRN?) {
|
|
136
|
+
this.clientTokenCallback?.invoke(clientToken, error)
|
|
137
|
+
sendEvent?.invoke(PrimerEventsRN.OnClientTokenCallback.string, null)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
fun onClientSessionActions(clientToken: String?, error: PrimerErrorRN?) {
|
|
141
|
+
if (implementedRNCallbacks?.isClientSessionActionsImplemented == true) {
|
|
142
|
+
this.onClientSessionActions?.invoke(clientToken, error)
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
fun onTokenizeSuccess(clientToken: String?, error: PrimerErrorRN?) {
|
|
147
|
+
this.onTokenizeSuccess?.invoke(clientToken, error)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
fun onResumeSuccess(clientToken: String?, error: PrimerErrorRN?) {
|
|
151
|
+
if (implementedRNCallbacks?.isOnResumeSuccessImplemented == true) {
|
|
152
|
+
this.onResumeSuccess?.invoke(clientToken, error)
|
|
153
|
+
} else {
|
|
154
|
+
sendError?.invoke(ErrorTypeRN.CheckoutFlowFailed
|
|
155
|
+
errorTo "Callback [onResumeSuccess] should had been implemented.")
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
fun removeCallbacksAndHandlers() {
|
|
160
|
+
clientTokenCallback = null
|
|
161
|
+
onClientSessionActions = null
|
|
162
|
+
onTokenizeSuccess = null
|
|
163
|
+
onResumeSuccess = null
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
fun setImplementedCallbacks(implementedRNCallbacks: PrimerImplementedRNCallbacks) {
|
|
167
|
+
this.implementedRNCallbacks = implementedRNCallbacks
|
|
168
|
+
}
|
|
124
169
|
}
|
|
@@ -4,26 +4,15 @@ 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 kotlinx.serialization.json.Json
|
|
8
7
|
|
|
9
|
-
class ReactNativePackage : ReactPackage {
|
|
10
|
-
|
|
11
|
-
private val json = Json { ignoreUnknownKeys = true }
|
|
12
8
|
|
|
9
|
+
class ReactNativePackage : ReactPackage {
|
|
13
10
|
override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
|
|
14
|
-
return listOf(
|
|
15
|
-
PrimerRN(reactContext),
|
|
16
|
-
PrimerHeadlessUniversalCheckout(reactContext, json)
|
|
17
|
-
)
|
|
11
|
+
return listOf(PrimerRN(reactContext))
|
|
18
12
|
}
|
|
19
13
|
|
|
20
14
|
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
|
|
21
|
-
return
|
|
22
|
-
PrimerCardNumberEditTextManager(),
|
|
23
|
-
PrimerCardholderNameEditTextManager(),
|
|
24
|
-
PrimerExpiryEditTextManager(),
|
|
25
|
-
PrimerCvvEditTextManager(),
|
|
26
|
-
)
|
|
15
|
+
return emptyList()
|
|
27
16
|
}
|
|
28
17
|
}
|
|
29
18
|
|
|
@@ -5,8 +5,9 @@ import kotlinx.serialization.Serializable
|
|
|
5
5
|
|
|
6
6
|
@Serializable
|
|
7
7
|
data class PrimerErrorRN(
|
|
8
|
-
val
|
|
9
|
-
val
|
|
8
|
+
val errorId: String? = null,
|
|
9
|
+
val errorDescription: String? = null,
|
|
10
|
+
val recoverySuggestion: String? = null
|
|
10
11
|
)
|
|
11
12
|
|
|
12
13
|
@Serializable
|
|
@@ -15,6 +16,4 @@ enum class ErrorTypeRN {
|
|
|
15
16
|
InitFailed,
|
|
16
17
|
CheckoutFlowFailed,
|
|
17
18
|
TokenizationFailed,
|
|
18
|
-
AssetMissing,
|
|
19
|
-
AssetMismatch
|
|
20
19
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
package com.primerioreactnative.datamodels
|
|
2
|
+
|
|
3
|
+
sealed class PrimerEventsRN(val string: String) {
|
|
4
|
+
object OnClientTokenCallback: PrimerEventsRN("onClientTokenCallback")
|
|
5
|
+
object OnClientSessionActions: PrimerEventsRN("onClientSessionActions")
|
|
6
|
+
object OnTokenizeSuccessCallback: PrimerEventsRN("onTokenizeSuccessCallback")
|
|
7
|
+
object OnResumeSuccess: PrimerEventsRN("onResumeSuccess")
|
|
8
|
+
object OnCheckoutDismissed: PrimerEventsRN("onCheckoutDismissed")
|
|
9
|
+
object OnError: PrimerEventsRN("onError")
|
|
10
|
+
object OnVaultSuccess: PrimerEventsRN("onVaultSuccess")
|
|
11
|
+
}
|
|
@@ -92,17 +92,18 @@ data class OptionsRN(
|
|
|
92
92
|
val isResultScreenEnabled: Boolean? = null,
|
|
93
93
|
val isLoadingScreenEnabled: Boolean? = null,
|
|
94
94
|
val isFullScreenEnabled: Boolean? = null,
|
|
95
|
-
val
|
|
95
|
+
val is3DSOnVaultingEnabled: Boolean? = null,
|
|
96
96
|
val locale: String? = null,
|
|
97
97
|
val android: AndroidOptionsRN? = null,
|
|
98
|
+
val is3DSDevelopmentModeEnabled: Boolean = true
|
|
98
99
|
) {
|
|
99
100
|
fun format(): Options {
|
|
100
101
|
return Options(
|
|
101
102
|
showUI = isLoadingScreenEnabled ?: true,
|
|
102
103
|
redirectScheme = android?.redirectScheme,
|
|
103
|
-
is3DSOnVaultingEnabled =
|
|
104
|
+
is3DSOnVaultingEnabled = is3DSOnVaultingEnabled ?: false,
|
|
104
105
|
debugOptions = PrimerDebugOptions(
|
|
105
|
-
is3DSSanityCheckEnabled =
|
|
106
|
+
is3DSSanityCheckEnabled = !is3DSDevelopmentModeEnabled, // false on emulator
|
|
106
107
|
),
|
|
107
108
|
)
|
|
108
109
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
package com.primerioreactnative.utils
|
|
2
|
+
|
|
3
|
+
import com.primerioreactnative.datamodels.ErrorTypeRN
|
|
4
|
+
import com.primerioreactnative.datamodels.PrimerErrorRN
|
|
5
|
+
|
|
6
|
+
infix fun ErrorTypeRN.errorTo(message: String) = PrimerErrorRN(
|
|
7
|
+
ErrorTypeRN.CheckoutFlowFailed.name,
|
|
8
|
+
message
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
fun PrimerErrorRN.asError() = Error("${this.errorId}: ${this.errorDescription}")
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
package com.primerioreactnative.utils
|
|
2
|
+
|
|
3
|
+
import kotlinx.serialization.Serializable
|
|
4
|
+
|
|
5
|
+
@Serializable
|
|
6
|
+
data class PrimerImplementedRNCallbacks(
|
|
7
|
+
val isClientTokenCallbackImplemented: Boolean? = null,
|
|
8
|
+
val isTokenAddedToVaultImplemented: Boolean? = null,
|
|
9
|
+
val isOnResumeSuccessImplemented: Boolean? = null,
|
|
10
|
+
val isOnResumeErrorImplemented: Boolean? = null,
|
|
11
|
+
val isOnCheckoutDismissedImplemented: Boolean? = null,
|
|
12
|
+
val isCheckoutFailedImplemented: Boolean? = null,
|
|
13
|
+
val isClientSessionActionsImplemented: Boolean? = null
|
|
14
|
+
)
|
|
@@ -15,7 +15,7 @@ enum ErrorTypeRN: String, Error, Encodable {
|
|
|
15
15
|
case generic
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
struct NativeError: CustomNSError, LocalizedError {
|
|
18
|
+
struct NativeError: CustomNSError, LocalizedError, Codable {
|
|
19
19
|
let errorId: String
|
|
20
20
|
let errorDescription: String?
|
|
21
21
|
let recoverySuggestion: String?
|
|
@@ -20,6 +20,8 @@ extension PrimerSettingsRN {
|
|
|
20
20
|
postalCode: billingAddress.postalCode
|
|
21
21
|
)
|
|
22
22
|
}
|
|
23
|
+
|
|
24
|
+
let debugOptions = PrimerDebugOptions(is3DSSanityCheckEnabled: !(options?.is3DSDevelopmentModeEnabled ?? false))
|
|
23
25
|
|
|
24
26
|
return PrimerSettings(
|
|
25
27
|
merchantIdentifier: options?.ios?.merchantIdentifier,
|
|
@@ -35,7 +37,9 @@ extension PrimerSettingsRN {
|
|
|
35
37
|
businessDetails: business?.primerFormat,
|
|
36
38
|
orderItems: order?.itemsFormatted ?? [],
|
|
37
39
|
isInitialLoadingHidden: !(options?.isLoadingScreenEnabled ?? true),
|
|
40
|
+
is3DSOnVaultingEnabled: options?.is3DSOnVaultingEnabled ?? false,
|
|
38
41
|
orderId: order?.id,
|
|
42
|
+
debugOptions: debugOptions,
|
|
39
43
|
customer: Customer(
|
|
40
44
|
firstName: customer?.firstName,
|
|
41
45
|
lastName: customer?.lastName,
|
|
@@ -145,6 +149,8 @@ fileprivate struct OptionsRN: Decodable {
|
|
|
145
149
|
let isResultScreenEnabled: Bool?
|
|
146
150
|
let isLoadingScreenEnabled: Bool?
|
|
147
151
|
let isFullScreenEnabled: Bool?
|
|
152
|
+
let is3DSOnVaultingEnabled: Bool?
|
|
153
|
+
let is3DSDevelopmentModeEnabled: Bool?
|
|
148
154
|
let locale: String?
|
|
149
155
|
let ios: IosOptionsRN?
|
|
150
156
|
}
|
package/ios/RNTPrimer.m
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
//
|
|
2
|
+
// RNTPrimer.m
|
|
3
|
+
// primer-io-react-native
|
|
4
|
+
//
|
|
5
|
+
// Created by Evangelos on 15/3/22.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#import <React/RCTBridgeModule.h>
|
|
9
|
+
#import <React/RCTEventEmitter.h>
|
|
10
|
+
|
|
11
|
+
@interface RCT_EXTERN_MODULE(NativePrimer, RCTEventEmitter)
|
|
12
|
+
|
|
13
|
+
RCT_EXTERN_METHOD(configureWithSettings:(NSString *)settingsStr resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
|
|
14
|
+
|
|
15
|
+
RCT_EXTERN_METHOD(configureWithTheme:(NSString *)themeStr resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
|
|
16
|
+
|
|
17
|
+
RCT_EXTERN_METHOD(showUniversalCheckout:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
|
|
18
|
+
|
|
19
|
+
RCT_EXTERN_METHOD(showUniversalCheckoutWithClientToken:(NSString *)clientToken resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
|
|
20
|
+
|
|
21
|
+
RCT_EXTERN_METHOD(showVaultManager:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
|
|
22
|
+
|
|
23
|
+
RCT_EXTERN_METHOD(showVaultManager:(NSString *)clientToken resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
RCT_EXTERN_METHOD(handleNewClientToken:(NSString *)clientToken resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
|
|
28
|
+
|
|
29
|
+
RCT_EXTERN_METHOD(handleError:(NSString *)errorStr resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
|
|
30
|
+
|
|
31
|
+
RCT_EXTERN_METHOD(handleSuccess:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
|
|
32
|
+
|
|
33
|
+
RCT_EXTERN_METHOD(setImplementedRNCallbacks:(NSString *)implementedRNCallbacksStr resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
RCT_EXTERN_METHOD(showPaymentMethod:(NSString *)clientToken paymentMethodStr:(NSString *)paymentMethodStr intentStr:(NSString *)intentStr resolver:(RCTPromiseResolveBlock)resolver rejecter:(RCTPromiseRejectBlock)rejecter)
|
|
41
|
+
|
|
42
|
+
@end
|
|
43
|
+
|