@stripe/stripe-react-native 0.66.0 → 0.68.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 +3 -3
- package/android/gradle.properties +1 -1
- package/android/proguard-rules.txt +4 -0
- package/android/src/main/java/com/reactnativestripesdk/CurrencySelectorAppearance.kt +229 -0
- package/android/src/main/java/com/reactnativestripesdk/CurrencySelectorElementView.kt +8 -1
- package/android/src/main/java/com/reactnativestripesdk/CurrencySelectorElementViewManager.kt +11 -0
- package/android/src/main/java/com/reactnativestripesdk/EmbeddedPaymentElementView.kt +0 -22
- package/android/src/main/java/com/reactnativestripesdk/EmbeddedPaymentElementViewManager.kt +0 -22
- package/android/src/main/java/com/reactnativestripesdk/PaymentSheetManager.kt +11 -4
- package/android/src/main/java/com/reactnativestripesdk/StripeSdkModule.kt +12 -25
- package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/AddToWalletButtonManager.kt +8 -0
- package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/AddToWalletButtonView.kt +6 -0
- package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/PushProvisioningProxy.kt +6 -5
- package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/TapAndPayProxy.kt +91 -0
- package/android/src/main/java/com/reactnativestripesdk/utils/Errors.kt +11 -6
- package/android/src/oldarch/java/com/facebook/react/viewmanagers/AddToWalletButtonManagerDelegate.java +3 -0
- package/android/src/oldarch/java/com/facebook/react/viewmanagers/AddToWalletButtonManagerInterface.java +1 -0
- package/android/src/oldarch/java/com/facebook/react/viewmanagers/EmbeddedPaymentElementViewManagerDelegate.java +0 -3
- package/android/src/oldarch/java/com/facebook/react/viewmanagers/EmbeddedPaymentElementViewManagerInterface.java +0 -1
- package/android/src/oldarch/java/com/facebook/react/viewmanagers/StripeCurrencySelectorElementManagerDelegate.java +4 -0
- package/android/src/oldarch/java/com/facebook/react/viewmanagers/StripeCurrencySelectorElementManagerInterface.java +2 -0
- package/android/src/oldarch/java/com/reactnativestripesdk/NativeOnrampSdkModuleSpec.java +1 -1
- package/android/src/oldarch/java/com/reactnativestripesdk/NativeStripeSdkModuleSpec.java +0 -8
- package/android/src/onramp/java/com/reactnativestripesdk/OnrampErrors.kt +145 -0
- package/android/src/onramp/java/com/reactnativestripesdk/OnrampMappers.kt +10 -1
- package/android/src/onramp/java/com/reactnativestripesdk/OnrampSdkModule.kt +52 -38
- package/android/src/test/java/com/reactnativestripesdk/CurrencySelectorAppearanceTest.kt +137 -0
- package/android/src/test/java/com/reactnativestripesdk/OnrampErrorsTest.kt +168 -0
- package/ios/CurrencySelectorAppearance.swift +120 -0
- package/ios/CurrencySelectorElementManager.m +1 -0
- package/ios/CurrencySelectorElementView.swift +16 -1
- package/ios/Mappers.swift +8 -6
- package/ios/NewArch/EmbeddedPaymentElementViewComponentView.mm +0 -4
- package/ios/NewArch/StripeCurrencySelectorElementComponentView.mm +1 -0
- package/ios/OnrampErrors.swift +132 -0
- package/ios/StripeOnrampSdk.mm +3 -3
- package/ios/StripeSdk.mm +0 -20
- package/ios/StripeSdkImpl+Checkout.swift +0 -17
- package/ios/StripeSdkImpl+Embedded.swift +0 -24
- package/ios/StripeSdkImpl+PaymentSheet.swift +1 -2
- package/ios/StripeSdkImpl.swift +34 -22
- package/lib/commonjs/components/AddToWalletButton.js.map +1 -1
- package/lib/commonjs/components/CurrencySelectorElement.js +1 -1
- package/lib/commonjs/components/CurrencySelectorElement.js.map +1 -1
- package/lib/commonjs/components/StripeProvider.js +1 -1
- package/lib/commonjs/components/StripeProvider.js.map +1 -1
- package/lib/commonjs/connect/EmbeddedComponent.js +2 -2
- package/lib/commonjs/connect/EmbeddedComponent.js.map +1 -1
- package/lib/commonjs/hooks/useCheckout.js +1 -1
- package/lib/commonjs/hooks/useCheckout.js.map +1 -1
- package/lib/commonjs/hooks/useOnramp.js +1 -1
- package/lib/commonjs/hooks/useOnramp.js.map +1 -1
- package/lib/commonjs/internal/stripeConfig.js +2 -0
- package/lib/commonjs/internal/stripeConfig.js.map +1 -0
- package/lib/commonjs/specs/NativeAddToWalletButton.js +1 -1
- package/lib/commonjs/specs/NativeAddToWalletButton.js.map +1 -1
- package/lib/commonjs/specs/NativeCurrencySelectorElement.js +1 -1
- package/lib/commonjs/specs/NativeCurrencySelectorElement.js.map +1 -1
- package/lib/commonjs/specs/NativeEmbeddedPaymentElement.js +1 -1
- package/lib/commonjs/specs/NativeEmbeddedPaymentElement.js.map +1 -1
- package/lib/commonjs/specs/NativeStripeSdkModule.js.map +1 -1
- package/lib/commonjs/types/EmbeddedPaymentElement.js +1 -1
- package/lib/commonjs/types/EmbeddedPaymentElement.js.map +1 -1
- package/lib/commonjs/types/Errors.js +1 -1
- package/lib/commonjs/types/Errors.js.map +1 -1
- package/lib/commonjs/types/Onramp.js +1 -1
- package/lib/commonjs/types/Onramp.js.map +1 -1
- package/lib/commonjs/types/PushProvisioning.js.map +1 -1
- package/lib/module/components/AddToWalletButton.js.map +1 -1
- package/lib/module/components/CurrencySelectorElement.js +1 -1
- package/lib/module/components/CurrencySelectorElement.js.map +1 -1
- package/lib/module/components/StripeProvider.js +1 -1
- package/lib/module/components/StripeProvider.js.map +1 -1
- package/lib/module/connect/EmbeddedComponent.js +2 -2
- package/lib/module/connect/EmbeddedComponent.js.map +1 -1
- package/lib/module/hooks/useCheckout.js +1 -1
- package/lib/module/hooks/useCheckout.js.map +1 -1
- package/lib/module/hooks/useOnramp.js +1 -1
- package/lib/module/hooks/useOnramp.js.map +1 -1
- package/lib/module/internal/stripeConfig.js +2 -0
- package/lib/module/internal/stripeConfig.js.map +1 -0
- package/lib/module/specs/NativeAddToWalletButton.js +1 -1
- package/lib/module/specs/NativeAddToWalletButton.js.map +1 -1
- package/lib/module/specs/NativeCurrencySelectorElement.js +1 -1
- package/lib/module/specs/NativeCurrencySelectorElement.js.map +1 -1
- package/lib/module/specs/NativeEmbeddedPaymentElement.js +1 -1
- package/lib/module/specs/NativeEmbeddedPaymentElement.js.map +1 -1
- package/lib/module/specs/NativeStripeSdkModule.js.map +1 -1
- package/lib/module/types/EmbeddedPaymentElement.js +1 -1
- package/lib/module/types/EmbeddedPaymentElement.js.map +1 -1
- package/lib/module/types/Errors.js +1 -1
- package/lib/module/types/Errors.js.map +1 -1
- package/lib/module/types/Onramp.js +1 -1
- package/lib/module/types/Onramp.js.map +1 -1
- package/lib/module/types/PushProvisioning.js.map +1 -1
- package/lib/typescript/src/components/AddToWalletButton.d.ts +2 -0
- package/lib/typescript/src/components/AddToWalletButton.d.ts.map +1 -1
- package/lib/typescript/src/components/CurrencySelectorElement.d.ts +76 -1
- package/lib/typescript/src/components/CurrencySelectorElement.d.ts.map +1 -1
- package/lib/typescript/src/components/StripeProvider.d.ts.map +1 -1
- package/lib/typescript/src/connect/EmbeddedComponent.d.ts +23 -0
- package/lib/typescript/src/connect/EmbeddedComponent.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useCheckout.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useOnramp.d.ts +13 -13
- package/lib/typescript/src/hooks/useOnramp.d.ts.map +1 -1
- package/lib/typescript/src/internal/stripeConfig.d.ts +3 -0
- package/lib/typescript/src/internal/stripeConfig.d.ts.map +1 -0
- package/lib/typescript/src/specs/NativeAddToWalletButton.d.ts +1 -0
- package/lib/typescript/src/specs/NativeAddToWalletButton.d.ts.map +1 -1
- package/lib/typescript/src/specs/NativeCurrencySelectorElement.d.ts +4 -0
- package/lib/typescript/src/specs/NativeCurrencySelectorElement.d.ts.map +1 -1
- package/lib/typescript/src/specs/NativeEmbeddedPaymentElement.d.ts +0 -1
- package/lib/typescript/src/specs/NativeEmbeddedPaymentElement.d.ts.map +1 -1
- package/lib/typescript/src/specs/NativeOnrampSdkModule.d.ts +1 -1
- package/lib/typescript/src/specs/NativeOnrampSdkModule.d.ts.map +1 -1
- package/lib/typescript/src/specs/NativeStripeSdkModule.d.ts +0 -2
- package/lib/typescript/src/specs/NativeStripeSdkModule.d.ts.map +1 -1
- package/lib/typescript/src/types/Checkout.d.ts +0 -8
- package/lib/typescript/src/types/Checkout.d.ts.map +1 -1
- package/lib/typescript/src/types/EmbeddedPaymentElement.d.ts +1 -10
- package/lib/typescript/src/types/EmbeddedPaymentElement.d.ts.map +1 -1
- package/lib/typescript/src/types/Errors.d.ts +0 -5
- package/lib/typescript/src/types/Errors.d.ts.map +1 -1
- package/lib/typescript/src/types/Onramp.d.ts +84 -19
- package/lib/typescript/src/types/Onramp.d.ts.map +1 -1
- package/lib/typescript/src/types/PaymentMethod.d.ts +2 -0
- package/lib/typescript/src/types/PaymentMethod.d.ts.map +1 -1
- package/lib/typescript/src/types/PushProvisioning.d.ts +2 -0
- package/lib/typescript/src/types/PushProvisioning.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/AddToWalletButton.tsx +2 -0
- package/src/components/CurrencySelectorElement.tsx +101 -1
- package/src/components/StripeProvider.tsx +2 -0
- package/src/connect/EmbeddedComponent.tsx +47 -10
- package/src/hooks/useCheckout.tsx +0 -9
- package/src/hooks/useOnramp.tsx +101 -18
- package/src/internal/stripeConfig.ts +9 -0
- package/src/specs/NativeAddToWalletButton.ts +1 -0
- package/src/specs/NativeCurrencySelectorElement.ts +5 -0
- package/src/specs/NativeEmbeddedPaymentElement.ts +1 -10
- package/src/specs/NativeOnrampSdkModule.ts +1 -1
- package/src/specs/NativeStripeSdkModule.ts +0 -9
- package/src/types/Checkout.ts +0 -9
- package/src/types/EmbeddedPaymentElement.tsx +4 -27
- package/src/types/Errors.ts +0 -6
- package/src/types/Onramp.ts +93 -19
- package/src/types/PaymentMethod.ts +2 -0
- package/src/types/PushProvisioning.ts +2 -0
- package/stripe-react-native.podspec +3 -3
|
@@ -12,10 +12,14 @@ import com.reactnativestripesdk.utils.getIntOr
|
|
|
12
12
|
typealias TokenCheckHandler =
|
|
13
13
|
(isCardInWallet: Boolean, token: WritableMap?, error: WritableMap?) -> Unit
|
|
14
14
|
|
|
15
|
+
typealias EligibilityCheckHandler = (canAdd: Boolean, token: WritableMap?, error: WritableMap?) -> Unit
|
|
16
|
+
|
|
15
17
|
object TapAndPayProxy {
|
|
16
18
|
private const val TAG = "StripeTapAndPay"
|
|
17
19
|
private var tapAndPayClient: Any? = null
|
|
18
20
|
const val REQUEST_CODE_TOKENIZE = 90909
|
|
21
|
+
private const val FALLBACK_MASTERCARD_CONSTANT = 3
|
|
22
|
+
private const val FALLBACK_VISA_CONSTANT = 4
|
|
19
23
|
|
|
20
24
|
private fun getTapandPayTokens(activity: Activity): Task<List<Any>>? =
|
|
21
25
|
try {
|
|
@@ -75,6 +79,93 @@ object TapAndPayProxy {
|
|
|
75
79
|
}
|
|
76
80
|
}
|
|
77
81
|
|
|
82
|
+
fun checkEligibility(
|
|
83
|
+
activity: Activity,
|
|
84
|
+
cardLastFour: String,
|
|
85
|
+
cardBrand: String,
|
|
86
|
+
callback: EligibilityCheckHandler,
|
|
87
|
+
) {
|
|
88
|
+
try {
|
|
89
|
+
val tapAndPayClass = Class.forName("com.google.android.gms.tapandpay.TapAndPay")
|
|
90
|
+
val getClientMethod = tapAndPayClass.getMethod("getClient", Activity::class.java)
|
|
91
|
+
val client = getClientMethod.invoke(null, activity)
|
|
92
|
+
|
|
93
|
+
val (network, tokenServiceProvider) = mapBrandToConstants(cardBrand)
|
|
94
|
+
val builderClass =
|
|
95
|
+
Class.forName(
|
|
96
|
+
"com.google.android.gms.tapandpay.issuer.HasEligibleTokenizationTargetRequest\$Builder"
|
|
97
|
+
)
|
|
98
|
+
val builder = builderClass.getDeclaredConstructor().newInstance()
|
|
99
|
+
builderClass.getMethod("setIdentifier", String::class.java).invoke(builder, cardLastFour)
|
|
100
|
+
builderClass.getMethod("setNetwork", Int::class.java).invoke(builder, network)
|
|
101
|
+
builderClass.getMethod("setTokenServiceProvider", Int::class.java).invoke(builder, tokenServiceProvider)
|
|
102
|
+
builderClass.getMethod("setIssuerName", String::class.java).invoke(builder, "Stripe")
|
|
103
|
+
val request = builderClass.getMethod("build").invoke(builder)
|
|
104
|
+
|
|
105
|
+
val requestClass = Class.forName("com.google.android.gms.tapandpay.issuer.HasEligibleTokenizationTargetRequest")
|
|
106
|
+
val tapAndPayClientClass = Class.forName("com.google.android.gms.tapandpay.TapAndPayClient")
|
|
107
|
+
val method = tapAndPayClientClass.getMethod("hasEligibleTokenizationTarget", requestClass)
|
|
108
|
+
|
|
109
|
+
@Suppress("UNCHECKED_CAST")
|
|
110
|
+
val task = method.invoke(client, request) as Task<Boolean>
|
|
111
|
+
task.addOnCompleteListener { completedTask ->
|
|
112
|
+
if (completedTask.isSuccessful) {
|
|
113
|
+
val hasTarget = completedTask.result
|
|
114
|
+
findExistingToken(activity, cardLastFour) { _, token, _ ->
|
|
115
|
+
callback(hasTarget, token, null)
|
|
116
|
+
}
|
|
117
|
+
} else {
|
|
118
|
+
Log.w(
|
|
119
|
+
TAG,
|
|
120
|
+
"hasEligibleTokenizationTarget failed, falling back to listTokens: " + completedTask.exception,
|
|
121
|
+
)
|
|
122
|
+
fallbackToListTokens(activity, cardLastFour, callback)
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
} catch (e: Exception) {
|
|
126
|
+
Log.e(TAG, "There was a problem calling hasEligibleTokenizationTarget with Google TapAndPay: " + e.message)
|
|
127
|
+
fallbackToListTokens(activity, cardLastFour, callback)
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
private fun fallbackToListTokens(
|
|
132
|
+
activity: Activity,
|
|
133
|
+
cardLastFour: String,
|
|
134
|
+
callback: EligibilityCheckHandler,
|
|
135
|
+
) {
|
|
136
|
+
findExistingToken(activity, cardLastFour) { isInWallet, token, error ->
|
|
137
|
+
if (error != null) {
|
|
138
|
+
callback(false, null, error)
|
|
139
|
+
} else {
|
|
140
|
+
callback(!isInWallet, token, null)
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
private fun mapBrandToConstants(cardBrand: String): Pair<Int, Int> {
|
|
146
|
+
try {
|
|
147
|
+
val tapAndPayClass = Class.forName("com.google.android.gms.tapandpay.TapAndPay")
|
|
148
|
+
return if (cardBrand.lowercase() == "mastercard") {
|
|
149
|
+
Pair(
|
|
150
|
+
tapAndPayClass.getField("CARD_NETWORK_MASTERCARD").getInt(null),
|
|
151
|
+
tapAndPayClass.getField("TOKEN_PROVIDER_MASTERCARD").getInt(null),
|
|
152
|
+
)
|
|
153
|
+
} else {
|
|
154
|
+
Pair(
|
|
155
|
+
tapAndPayClass.getField("CARD_NETWORK_VISA").getInt(null),
|
|
156
|
+
tapAndPayClass.getField("TOKEN_PROVIDER_VISA").getInt(null),
|
|
157
|
+
)
|
|
158
|
+
}
|
|
159
|
+
} catch (e: Exception) {
|
|
160
|
+
Log.e(TAG, "There was a problem getting TapAndPay constants: " + e.message)
|
|
161
|
+
return if (cardBrand.lowercase() == "mastercard") {
|
|
162
|
+
Pair(FALLBACK_MASTERCARD_CONSTANT, FALLBACK_MASTERCARD_CONSTANT)
|
|
163
|
+
} else {
|
|
164
|
+
Pair(FALLBACK_VISA_CONSTANT, FALLBACK_VISA_CONSTANT)
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
78
169
|
fun tokenize(
|
|
79
170
|
activity: Activity,
|
|
80
171
|
tokenReferenceId: String,
|
|
@@ -5,6 +5,7 @@ import com.facebook.react.bridge.WritableMap
|
|
|
5
5
|
import com.stripe.android.core.exception.APIException
|
|
6
6
|
import com.stripe.android.core.exception.AuthenticationException
|
|
7
7
|
import com.stripe.android.core.exception.InvalidRequestException
|
|
8
|
+
import com.stripe.android.core.exception.StripeException
|
|
8
9
|
import com.stripe.android.exception.CardException
|
|
9
10
|
import com.stripe.android.model.PaymentIntent
|
|
10
11
|
import com.stripe.android.model.SetupIntent
|
|
@@ -173,6 +174,16 @@ internal fun createError(
|
|
|
173
174
|
error.stripeError?.code,
|
|
174
175
|
)
|
|
175
176
|
}
|
|
177
|
+
is StripeException -> {
|
|
178
|
+
mapError(
|
|
179
|
+
code,
|
|
180
|
+
error.message,
|
|
181
|
+
error.localizedMessage,
|
|
182
|
+
error.stripeError?.declineCode,
|
|
183
|
+
error.stripeError?.type,
|
|
184
|
+
error.stripeError?.code
|
|
185
|
+
)
|
|
186
|
+
}
|
|
176
187
|
else -> mapError(code, error.message, error.localizedMessage.orEmpty(), null, null, null)
|
|
177
188
|
}
|
|
178
189
|
|
|
@@ -197,9 +208,3 @@ internal fun createMissingInitError(): WritableMap =
|
|
|
197
208
|
"Stripe has not been initialized. Initialize Stripe in your app with the StripeProvider component " +
|
|
198
209
|
"or the initStripe method.",
|
|
199
210
|
)
|
|
200
|
-
|
|
201
|
-
internal fun createOnrampNotConfiguredError(): WritableMap =
|
|
202
|
-
createError(
|
|
203
|
-
ErrorType.Failed.toString(),
|
|
204
|
-
"Onramp is not configured.",
|
|
205
|
-
)
|
|
@@ -33,6 +33,9 @@ public class AddToWalletButtonManagerDelegate<T extends View, U extends BaseView
|
|
|
33
33
|
case "testEnv":
|
|
34
34
|
mViewManager.setTestEnv(view, value == null ? false : (boolean) value);
|
|
35
35
|
break;
|
|
36
|
+
case "isBounceProvisioned":
|
|
37
|
+
mViewManager.setIsBounceProvisioned(view, value == null ? false : (boolean) value);
|
|
38
|
+
break;
|
|
36
39
|
case "cardDetails":
|
|
37
40
|
mViewManager.setCardDetails(view, new DynamicFromObject(value));
|
|
38
41
|
break;
|
|
@@ -18,6 +18,7 @@ public interface AddToWalletButtonManagerInterface<T extends View> {
|
|
|
18
18
|
void setIOSButtonStyle(T view, @Nullable String value);
|
|
19
19
|
void setAndroidAssetSource(T view, @Nullable ReadableMap value);
|
|
20
20
|
void setTestEnv(T view, boolean value);
|
|
21
|
+
void setIsBounceProvisioned(T view, boolean value);
|
|
21
22
|
void setCardDetails(T view, Dynamic value);
|
|
22
23
|
void setToken(T view, Dynamic value);
|
|
23
24
|
void setEphemeralKey(T view, Dynamic value);
|
|
@@ -50,9 +50,6 @@ public class EmbeddedPaymentElementViewManagerDelegate<T extends View, U extends
|
|
|
50
50
|
case "update":
|
|
51
51
|
mViewManager.update(view, args != null ? args.getString(0) : null);
|
|
52
52
|
break;
|
|
53
|
-
case "updateWithCheckout":
|
|
54
|
-
mViewManager.updateWithCheckout(view, args != null ? args.getString(0) : null);
|
|
55
|
-
break;
|
|
56
53
|
}
|
|
57
54
|
}
|
|
58
55
|
}
|
|
@@ -20,5 +20,4 @@ public interface EmbeddedPaymentElementViewManagerInterface<T extends View> {
|
|
|
20
20
|
void confirm(T view);
|
|
21
21
|
void clearPaymentOption(T view);
|
|
22
22
|
void update(T view, @Nullable String intentConfigurationJson);
|
|
23
|
-
void updateWithCheckout(T view, @Nullable String sessionKey);
|
|
24
23
|
}
|
|
@@ -11,6 +11,7 @@ package com.facebook.react.viewmanagers;
|
|
|
11
11
|
|
|
12
12
|
import android.view.View;
|
|
13
13
|
import androidx.annotation.Nullable;
|
|
14
|
+
import com.facebook.react.bridge.DynamicFromObject;
|
|
14
15
|
import com.facebook.react.uimanager.BaseViewManager;
|
|
15
16
|
import com.facebook.react.uimanager.BaseViewManagerDelegate;
|
|
16
17
|
import com.facebook.react.uimanager.LayoutShadowNode;
|
|
@@ -28,6 +29,9 @@ public class StripeCurrencySelectorElementManagerDelegate<T extends View, U exte
|
|
|
28
29
|
case "disabled":
|
|
29
30
|
mViewManager.setDisabled(view, value == null ? false : (boolean) value);
|
|
30
31
|
break;
|
|
32
|
+
case "appearance":
|
|
33
|
+
mViewManager.setAppearance(view, new DynamicFromObject(value));
|
|
34
|
+
break;
|
|
31
35
|
default:
|
|
32
36
|
super.setProperty(view, propName, value);
|
|
33
37
|
}
|
|
@@ -11,8 +11,10 @@ package com.facebook.react.viewmanagers;
|
|
|
11
11
|
|
|
12
12
|
import android.view.View;
|
|
13
13
|
import androidx.annotation.Nullable;
|
|
14
|
+
import com.facebook.react.bridge.Dynamic;
|
|
14
15
|
|
|
15
16
|
public interface StripeCurrencySelectorElementManagerInterface<T extends View> {
|
|
16
17
|
void setSessionKey(T view, @Nullable String value);
|
|
17
18
|
void setDisabled(T view, boolean value);
|
|
19
|
+
void setAppearance(T view, Dynamic value);
|
|
18
20
|
}
|
|
@@ -69,7 +69,7 @@ public abstract class NativeOnrampSdkModuleSpec extends ReactContextBaseJavaModu
|
|
|
69
69
|
|
|
70
70
|
@ReactMethod
|
|
71
71
|
@DoNotStrip
|
|
72
|
-
public abstract void
|
|
72
|
+
public abstract void presentUserAttestation(Promise promise);
|
|
73
73
|
|
|
74
74
|
@ReactMethod
|
|
75
75
|
@DoNotStrip
|
|
@@ -265,10 +265,6 @@ public abstract class NativeStripeSdkModuleSpec extends ReactContextBaseJavaModu
|
|
|
265
265
|
@DoNotStrip
|
|
266
266
|
public abstract void updateEmbeddedPaymentElement(ReadableMap intentConfig, Promise promise);
|
|
267
267
|
|
|
268
|
-
@ReactMethod
|
|
269
|
-
@DoNotStrip
|
|
270
|
-
public abstract void updateEmbeddedPaymentElementWithCheckout(String sessionKey, Promise promise);
|
|
271
|
-
|
|
272
268
|
@ReactMethod
|
|
273
269
|
@DoNotStrip
|
|
274
270
|
public abstract void clearEmbeddedPaymentOption(double viewTag, Promise promise);
|
|
@@ -329,10 +325,6 @@ public abstract class NativeStripeSdkModuleSpec extends ReactContextBaseJavaModu
|
|
|
329
325
|
@DoNotStrip
|
|
330
326
|
public abstract void checkoutSelectShippingOption(String sessionKey, String id, Promise promise);
|
|
331
327
|
|
|
332
|
-
@ReactMethod
|
|
333
|
-
@DoNotStrip
|
|
334
|
-
public abstract void checkoutUpdateTaxId(String sessionKey, String type, String value, Promise promise);
|
|
335
|
-
|
|
336
328
|
@ReactMethod
|
|
337
329
|
@DoNotStrip
|
|
338
330
|
public abstract void checkoutRunServerUpdateStart(String sessionKey, Promise promise);
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
@file:OptIn(ExperimentalCryptoOnramp::class)
|
|
2
|
+
|
|
3
|
+
package com.reactnativestripesdk
|
|
4
|
+
|
|
5
|
+
import com.facebook.react.bridge.Arguments
|
|
6
|
+
import com.facebook.react.bridge.WritableArray
|
|
7
|
+
import com.facebook.react.bridge.WritableMap
|
|
8
|
+
import com.reactnativestripesdk.utils.ErrorType
|
|
9
|
+
import com.stripe.android.core.exception.StripeException
|
|
10
|
+
import com.stripe.android.crypto.onramp.ExperimentalCryptoOnramp
|
|
11
|
+
import com.stripe.android.crypto.onramp.exception.AppAttestationException
|
|
12
|
+
import com.stripe.android.crypto.onramp.exception.CryptoOnrampApiException
|
|
13
|
+
import com.stripe.android.crypto.onramp.exception.SDKVersion
|
|
14
|
+
import com.stripe.android.crypto.onramp.exception.StripeCryptoOnrampError
|
|
15
|
+
|
|
16
|
+
internal fun createOnrampFailedError(error: Throwable): WritableMap =
|
|
17
|
+
createOnrampError(ErrorType.Failed.toString(), error)
|
|
18
|
+
|
|
19
|
+
internal fun createOnrampNotConfiguredError(): WritableMap =
|
|
20
|
+
createOnrampMessageError(
|
|
21
|
+
ErrorType.Failed.toString(),
|
|
22
|
+
"Onramp is not configured.",
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
private fun createOnrampError(
|
|
26
|
+
code: String,
|
|
27
|
+
error: Throwable,
|
|
28
|
+
): WritableMap {
|
|
29
|
+
val apiException =
|
|
30
|
+
error as? CryptoOnrampApiException
|
|
31
|
+
?: return createNonApiOnrampError(code, error)
|
|
32
|
+
|
|
33
|
+
val stripeError = apiException.stripeError
|
|
34
|
+
val onrampErrorType = apiException.toOnrampErrorType()
|
|
35
|
+
|
|
36
|
+
return createOnrampErrorMap(
|
|
37
|
+
code = code,
|
|
38
|
+
message = apiException.userMessage,
|
|
39
|
+
localizedMessage = apiException.localizedMessage,
|
|
40
|
+
declineCode = stripeError?.declineCode,
|
|
41
|
+
type = apiException.context.apiErrorType ?: stripeError?.type,
|
|
42
|
+
stripeErrorCode = apiException.code,
|
|
43
|
+
) {
|
|
44
|
+
putString("onrampErrorType", onrampErrorType)
|
|
45
|
+
putString("developerMessage", apiException.developerMessage)
|
|
46
|
+
putString("userMessage", apiException.userMessage)
|
|
47
|
+
putString("reason", apiException.context.reason)
|
|
48
|
+
putString("operation", apiException.context.operation)
|
|
49
|
+
putString("appPackageName", apiException.context.appPackageName)
|
|
50
|
+
putString("mode", apiException.context.mode)
|
|
51
|
+
putArray("sdkVersions", mapFromSdkVersions(apiException.sdkVersions))
|
|
52
|
+
putString("requestId", apiException.context.requestId)
|
|
53
|
+
putString("apiErrorCode", apiException.context.apiErrorCode)
|
|
54
|
+
putString("apiErrorType", apiException.context.apiErrorType)
|
|
55
|
+
putString("apiErrorMessage", apiException.context.apiErrorMessage)
|
|
56
|
+
putString("apiUserMessage", apiException.context.apiUserMessage)
|
|
57
|
+
putString("docUrl", apiException.context.docUrl)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
private fun createNonApiOnrampError(
|
|
62
|
+
code: String,
|
|
63
|
+
error: Throwable,
|
|
64
|
+
): WritableMap {
|
|
65
|
+
val onrampError =
|
|
66
|
+
error as? StripeCryptoOnrampError
|
|
67
|
+
?: return createGenericError(code, error)
|
|
68
|
+
|
|
69
|
+
return createOnrampErrorMap(
|
|
70
|
+
code = code,
|
|
71
|
+
message = onrampError.userMessage,
|
|
72
|
+
localizedMessage = error.localizedMessage,
|
|
73
|
+
stripeErrorCode = onrampError.code,
|
|
74
|
+
) {
|
|
75
|
+
putString("developerMessage", onrampError.developerMessage)
|
|
76
|
+
putString("userMessage", onrampError.userMessage)
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
private fun createOnrampMessageError(
|
|
81
|
+
code: String,
|
|
82
|
+
message: String?,
|
|
83
|
+
): WritableMap =
|
|
84
|
+
createOnrampErrorMap(code = code, message = message)
|
|
85
|
+
|
|
86
|
+
private fun CryptoOnrampApiException.toOnrampErrorType(): String =
|
|
87
|
+
if (this is AppAttestationException) {
|
|
88
|
+
"AppAttestationError"
|
|
89
|
+
} else {
|
|
90
|
+
"UncategorizedApiError"
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
private fun createGenericError(
|
|
94
|
+
code: String,
|
|
95
|
+
error: Throwable,
|
|
96
|
+
): WritableMap {
|
|
97
|
+
val stripeError = (error as? StripeException)?.stripeError
|
|
98
|
+
|
|
99
|
+
return createOnrampErrorMap(
|
|
100
|
+
code = code,
|
|
101
|
+
message = error.message,
|
|
102
|
+
localizedMessage = error.localizedMessage,
|
|
103
|
+
declineCode = stripeError?.declineCode,
|
|
104
|
+
type = stripeError?.type,
|
|
105
|
+
stripeErrorCode = stripeError?.code,
|
|
106
|
+
)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
private fun createOnrampErrorMap(
|
|
110
|
+
code: String,
|
|
111
|
+
message: String?,
|
|
112
|
+
localizedMessage: String? = message,
|
|
113
|
+
declineCode: String? = null,
|
|
114
|
+
type: String? = null,
|
|
115
|
+
stripeErrorCode: String? = null,
|
|
116
|
+
configure: (WritableMap.() -> Unit)? = null,
|
|
117
|
+
): WritableMap {
|
|
118
|
+
val map: WritableMap = Arguments.createMap()
|
|
119
|
+
val details: WritableMap = Arguments.createMap()
|
|
120
|
+
|
|
121
|
+
details.putString("code", code)
|
|
122
|
+
details.putString("message", message)
|
|
123
|
+
details.putString("localizedMessage", localizedMessage)
|
|
124
|
+
details.putString("declineCode", declineCode)
|
|
125
|
+
details.putString("type", type)
|
|
126
|
+
details.putString("stripeErrorCode", stripeErrorCode)
|
|
127
|
+
configure?.invoke(details)
|
|
128
|
+
|
|
129
|
+
map.putMap("error", details)
|
|
130
|
+
return map
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
private fun mapFromSdkVersions(
|
|
134
|
+
sdkVersions: List<SDKVersion>,
|
|
135
|
+
): WritableArray =
|
|
136
|
+
Arguments.createArray().apply {
|
|
137
|
+
sdkVersions.forEach { sdkVersion ->
|
|
138
|
+
pushMap(
|
|
139
|
+
Arguments.createMap().apply {
|
|
140
|
+
putString("name", sdkVersion.name)
|
|
141
|
+
putString("version", sdkVersion.version)
|
|
142
|
+
},
|
|
143
|
+
)
|
|
144
|
+
}
|
|
145
|
+
}
|
|
@@ -10,6 +10,7 @@ import com.facebook.react.bridge.ReadableMap
|
|
|
10
10
|
import com.facebook.react.bridge.WritableArray
|
|
11
11
|
import com.stripe.android.core.model.CountryCode
|
|
12
12
|
import com.stripe.android.crypto.onramp.ExperimentalCryptoOnramp
|
|
13
|
+
import com.stripe.android.crypto.onramp.exception.SDKVersion
|
|
13
14
|
import com.stripe.android.crypto.onramp.model.KycInfo
|
|
14
15
|
import com.stripe.android.crypto.onramp.model.OnrampConfiguration
|
|
15
16
|
import com.stripe.android.crypto.onramp.model.PaymentMethodDisplayData
|
|
@@ -32,6 +33,7 @@ import com.stripe.android.paymentsheet.PaymentSheet
|
|
|
32
33
|
internal fun mapConfig(
|
|
33
34
|
configMap: ReadableMap,
|
|
34
35
|
publishableKey: String,
|
|
36
|
+
additionalSdkVersions: List<SDKVersion> = emptyList(),
|
|
35
37
|
): OnrampConfiguration {
|
|
36
38
|
val appearanceMap = configMap.getMap("appearance")
|
|
37
39
|
val appearance =
|
|
@@ -52,6 +54,11 @@ internal fun mapConfig(
|
|
|
52
54
|
.appearance(appearance)
|
|
53
55
|
.cryptoCustomerId(cryptoCustomerId)
|
|
54
56
|
.apply { googlePayConfig?.let { googlePayConfig(it) } }
|
|
57
|
+
.apply {
|
|
58
|
+
if (additionalSdkVersions.isNotEmpty()) {
|
|
59
|
+
this.additionalSdkVersions(additionalSdkVersions)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
55
62
|
}
|
|
56
63
|
|
|
57
64
|
@SuppressLint("RestrictedApi")
|
|
@@ -222,14 +229,16 @@ internal fun mapFromComplianceIdentifierRequirements(
|
|
|
222
229
|
) = Arguments.createMap().apply {
|
|
223
230
|
putArray("identifiers", mapFromComplianceIdentifierRequirementsList(requirements.identifiers))
|
|
224
231
|
putArray("alternatives", mapFromComplianceIdentifierAlternativeGroups(requirements.alternatives))
|
|
232
|
+
putBoolean("carfTinRequired", requirements.carfTinRequired)
|
|
225
233
|
}
|
|
226
234
|
|
|
227
235
|
internal fun mapFromSubmitIdentifiersResult(
|
|
228
236
|
result: SubmitIdentifiersResult,
|
|
229
237
|
) = Arguments.createMap().apply {
|
|
230
|
-
putBoolean("
|
|
238
|
+
putBoolean("completed", result.completed)
|
|
231
239
|
putArray("identifiers", mapFromComplianceIdentifierRequirementsList(result.identifiers))
|
|
232
240
|
putArray("alternatives", mapFromComplianceIdentifierAlternativeGroups(result.alternatives))
|
|
241
|
+
putBoolean("carfTinRequired", result.carfTinRequired)
|
|
233
242
|
putArray("invalidIdentifiers", mapFromComplianceIdentifierTypes(result.invalidIdentifiers))
|
|
234
243
|
}
|
|
235
244
|
|