@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.
Files changed (149) hide show
  1. package/android/build.gradle +3 -3
  2. package/android/gradle.properties +1 -1
  3. package/android/proguard-rules.txt +4 -0
  4. package/android/src/main/java/com/reactnativestripesdk/CurrencySelectorAppearance.kt +229 -0
  5. package/android/src/main/java/com/reactnativestripesdk/CurrencySelectorElementView.kt +8 -1
  6. package/android/src/main/java/com/reactnativestripesdk/CurrencySelectorElementViewManager.kt +11 -0
  7. package/android/src/main/java/com/reactnativestripesdk/EmbeddedPaymentElementView.kt +0 -22
  8. package/android/src/main/java/com/reactnativestripesdk/EmbeddedPaymentElementViewManager.kt +0 -22
  9. package/android/src/main/java/com/reactnativestripesdk/PaymentSheetManager.kt +11 -4
  10. package/android/src/main/java/com/reactnativestripesdk/StripeSdkModule.kt +12 -25
  11. package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/AddToWalletButtonManager.kt +8 -0
  12. package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/AddToWalletButtonView.kt +6 -0
  13. package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/PushProvisioningProxy.kt +6 -5
  14. package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/TapAndPayProxy.kt +91 -0
  15. package/android/src/main/java/com/reactnativestripesdk/utils/Errors.kt +11 -6
  16. package/android/src/oldarch/java/com/facebook/react/viewmanagers/AddToWalletButtonManagerDelegate.java +3 -0
  17. package/android/src/oldarch/java/com/facebook/react/viewmanagers/AddToWalletButtonManagerInterface.java +1 -0
  18. package/android/src/oldarch/java/com/facebook/react/viewmanagers/EmbeddedPaymentElementViewManagerDelegate.java +0 -3
  19. package/android/src/oldarch/java/com/facebook/react/viewmanagers/EmbeddedPaymentElementViewManagerInterface.java +0 -1
  20. package/android/src/oldarch/java/com/facebook/react/viewmanagers/StripeCurrencySelectorElementManagerDelegate.java +4 -0
  21. package/android/src/oldarch/java/com/facebook/react/viewmanagers/StripeCurrencySelectorElementManagerInterface.java +2 -0
  22. package/android/src/oldarch/java/com/reactnativestripesdk/NativeOnrampSdkModuleSpec.java +1 -1
  23. package/android/src/oldarch/java/com/reactnativestripesdk/NativeStripeSdkModuleSpec.java +0 -8
  24. package/android/src/onramp/java/com/reactnativestripesdk/OnrampErrors.kt +145 -0
  25. package/android/src/onramp/java/com/reactnativestripesdk/OnrampMappers.kt +10 -1
  26. package/android/src/onramp/java/com/reactnativestripesdk/OnrampSdkModule.kt +52 -38
  27. package/android/src/test/java/com/reactnativestripesdk/CurrencySelectorAppearanceTest.kt +137 -0
  28. package/android/src/test/java/com/reactnativestripesdk/OnrampErrorsTest.kt +168 -0
  29. package/ios/CurrencySelectorAppearance.swift +120 -0
  30. package/ios/CurrencySelectorElementManager.m +1 -0
  31. package/ios/CurrencySelectorElementView.swift +16 -1
  32. package/ios/Mappers.swift +8 -6
  33. package/ios/NewArch/EmbeddedPaymentElementViewComponentView.mm +0 -4
  34. package/ios/NewArch/StripeCurrencySelectorElementComponentView.mm +1 -0
  35. package/ios/OnrampErrors.swift +132 -0
  36. package/ios/StripeOnrampSdk.mm +3 -3
  37. package/ios/StripeSdk.mm +0 -20
  38. package/ios/StripeSdkImpl+Checkout.swift +0 -17
  39. package/ios/StripeSdkImpl+Embedded.swift +0 -24
  40. package/ios/StripeSdkImpl+PaymentSheet.swift +1 -2
  41. package/ios/StripeSdkImpl.swift +34 -22
  42. package/lib/commonjs/components/AddToWalletButton.js.map +1 -1
  43. package/lib/commonjs/components/CurrencySelectorElement.js +1 -1
  44. package/lib/commonjs/components/CurrencySelectorElement.js.map +1 -1
  45. package/lib/commonjs/components/StripeProvider.js +1 -1
  46. package/lib/commonjs/components/StripeProvider.js.map +1 -1
  47. package/lib/commonjs/connect/EmbeddedComponent.js +2 -2
  48. package/lib/commonjs/connect/EmbeddedComponent.js.map +1 -1
  49. package/lib/commonjs/hooks/useCheckout.js +1 -1
  50. package/lib/commonjs/hooks/useCheckout.js.map +1 -1
  51. package/lib/commonjs/hooks/useOnramp.js +1 -1
  52. package/lib/commonjs/hooks/useOnramp.js.map +1 -1
  53. package/lib/commonjs/internal/stripeConfig.js +2 -0
  54. package/lib/commonjs/internal/stripeConfig.js.map +1 -0
  55. package/lib/commonjs/specs/NativeAddToWalletButton.js +1 -1
  56. package/lib/commonjs/specs/NativeAddToWalletButton.js.map +1 -1
  57. package/lib/commonjs/specs/NativeCurrencySelectorElement.js +1 -1
  58. package/lib/commonjs/specs/NativeCurrencySelectorElement.js.map +1 -1
  59. package/lib/commonjs/specs/NativeEmbeddedPaymentElement.js +1 -1
  60. package/lib/commonjs/specs/NativeEmbeddedPaymentElement.js.map +1 -1
  61. package/lib/commonjs/specs/NativeStripeSdkModule.js.map +1 -1
  62. package/lib/commonjs/types/EmbeddedPaymentElement.js +1 -1
  63. package/lib/commonjs/types/EmbeddedPaymentElement.js.map +1 -1
  64. package/lib/commonjs/types/Errors.js +1 -1
  65. package/lib/commonjs/types/Errors.js.map +1 -1
  66. package/lib/commonjs/types/Onramp.js +1 -1
  67. package/lib/commonjs/types/Onramp.js.map +1 -1
  68. package/lib/commonjs/types/PushProvisioning.js.map +1 -1
  69. package/lib/module/components/AddToWalletButton.js.map +1 -1
  70. package/lib/module/components/CurrencySelectorElement.js +1 -1
  71. package/lib/module/components/CurrencySelectorElement.js.map +1 -1
  72. package/lib/module/components/StripeProvider.js +1 -1
  73. package/lib/module/components/StripeProvider.js.map +1 -1
  74. package/lib/module/connect/EmbeddedComponent.js +2 -2
  75. package/lib/module/connect/EmbeddedComponent.js.map +1 -1
  76. package/lib/module/hooks/useCheckout.js +1 -1
  77. package/lib/module/hooks/useCheckout.js.map +1 -1
  78. package/lib/module/hooks/useOnramp.js +1 -1
  79. package/lib/module/hooks/useOnramp.js.map +1 -1
  80. package/lib/module/internal/stripeConfig.js +2 -0
  81. package/lib/module/internal/stripeConfig.js.map +1 -0
  82. package/lib/module/specs/NativeAddToWalletButton.js +1 -1
  83. package/lib/module/specs/NativeAddToWalletButton.js.map +1 -1
  84. package/lib/module/specs/NativeCurrencySelectorElement.js +1 -1
  85. package/lib/module/specs/NativeCurrencySelectorElement.js.map +1 -1
  86. package/lib/module/specs/NativeEmbeddedPaymentElement.js +1 -1
  87. package/lib/module/specs/NativeEmbeddedPaymentElement.js.map +1 -1
  88. package/lib/module/specs/NativeStripeSdkModule.js.map +1 -1
  89. package/lib/module/types/EmbeddedPaymentElement.js +1 -1
  90. package/lib/module/types/EmbeddedPaymentElement.js.map +1 -1
  91. package/lib/module/types/Errors.js +1 -1
  92. package/lib/module/types/Errors.js.map +1 -1
  93. package/lib/module/types/Onramp.js +1 -1
  94. package/lib/module/types/Onramp.js.map +1 -1
  95. package/lib/module/types/PushProvisioning.js.map +1 -1
  96. package/lib/typescript/src/components/AddToWalletButton.d.ts +2 -0
  97. package/lib/typescript/src/components/AddToWalletButton.d.ts.map +1 -1
  98. package/lib/typescript/src/components/CurrencySelectorElement.d.ts +76 -1
  99. package/lib/typescript/src/components/CurrencySelectorElement.d.ts.map +1 -1
  100. package/lib/typescript/src/components/StripeProvider.d.ts.map +1 -1
  101. package/lib/typescript/src/connect/EmbeddedComponent.d.ts +23 -0
  102. package/lib/typescript/src/connect/EmbeddedComponent.d.ts.map +1 -1
  103. package/lib/typescript/src/hooks/useCheckout.d.ts.map +1 -1
  104. package/lib/typescript/src/hooks/useOnramp.d.ts +13 -13
  105. package/lib/typescript/src/hooks/useOnramp.d.ts.map +1 -1
  106. package/lib/typescript/src/internal/stripeConfig.d.ts +3 -0
  107. package/lib/typescript/src/internal/stripeConfig.d.ts.map +1 -0
  108. package/lib/typescript/src/specs/NativeAddToWalletButton.d.ts +1 -0
  109. package/lib/typescript/src/specs/NativeAddToWalletButton.d.ts.map +1 -1
  110. package/lib/typescript/src/specs/NativeCurrencySelectorElement.d.ts +4 -0
  111. package/lib/typescript/src/specs/NativeCurrencySelectorElement.d.ts.map +1 -1
  112. package/lib/typescript/src/specs/NativeEmbeddedPaymentElement.d.ts +0 -1
  113. package/lib/typescript/src/specs/NativeEmbeddedPaymentElement.d.ts.map +1 -1
  114. package/lib/typescript/src/specs/NativeOnrampSdkModule.d.ts +1 -1
  115. package/lib/typescript/src/specs/NativeOnrampSdkModule.d.ts.map +1 -1
  116. package/lib/typescript/src/specs/NativeStripeSdkModule.d.ts +0 -2
  117. package/lib/typescript/src/specs/NativeStripeSdkModule.d.ts.map +1 -1
  118. package/lib/typescript/src/types/Checkout.d.ts +0 -8
  119. package/lib/typescript/src/types/Checkout.d.ts.map +1 -1
  120. package/lib/typescript/src/types/EmbeddedPaymentElement.d.ts +1 -10
  121. package/lib/typescript/src/types/EmbeddedPaymentElement.d.ts.map +1 -1
  122. package/lib/typescript/src/types/Errors.d.ts +0 -5
  123. package/lib/typescript/src/types/Errors.d.ts.map +1 -1
  124. package/lib/typescript/src/types/Onramp.d.ts +84 -19
  125. package/lib/typescript/src/types/Onramp.d.ts.map +1 -1
  126. package/lib/typescript/src/types/PaymentMethod.d.ts +2 -0
  127. package/lib/typescript/src/types/PaymentMethod.d.ts.map +1 -1
  128. package/lib/typescript/src/types/PushProvisioning.d.ts +2 -0
  129. package/lib/typescript/src/types/PushProvisioning.d.ts.map +1 -1
  130. package/package.json +1 -1
  131. package/src/components/AddToWalletButton.tsx +2 -0
  132. package/src/components/CurrencySelectorElement.tsx +101 -1
  133. package/src/components/StripeProvider.tsx +2 -0
  134. package/src/connect/EmbeddedComponent.tsx +47 -10
  135. package/src/hooks/useCheckout.tsx +0 -9
  136. package/src/hooks/useOnramp.tsx +101 -18
  137. package/src/internal/stripeConfig.ts +9 -0
  138. package/src/specs/NativeAddToWalletButton.ts +1 -0
  139. package/src/specs/NativeCurrencySelectorElement.ts +5 -0
  140. package/src/specs/NativeEmbeddedPaymentElement.ts +1 -10
  141. package/src/specs/NativeOnrampSdkModule.ts +1 -1
  142. package/src/specs/NativeStripeSdkModule.ts +0 -9
  143. package/src/types/Checkout.ts +0 -9
  144. package/src/types/EmbeddedPaymentElement.tsx +4 -27
  145. package/src/types/Errors.ts +0 -6
  146. package/src/types/Onramp.ts +93 -19
  147. package/src/types/PaymentMethod.ts +2 -0
  148. package/src/types/PushProvisioning.ts +2 -0
  149. 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 presentCRSCARFDeclaration(Promise promise);
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("valid", result.valid)
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