@stripe/stripe-react-native 0.64.0 → 0.64.1
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/README.md +2 -2
- package/android/build.gradle +2 -2
- package/android/detekt/detekt-baseline.xml +81 -0
- package/android/detekt/detekt.gradle +45 -0
- package/android/detekt/detekt.yml +722 -0
- package/android/gradle.properties +4 -4
- package/android/src/main/java/com/reactnativestripesdk/AuBECSDebitFormView.kt +3 -1
- package/android/src/main/java/com/reactnativestripesdk/AuBECSDebitFormViewManager.kt +2 -1
- package/android/src/main/java/com/reactnativestripesdk/CardFieldView.kt +5 -1
- package/android/src/main/java/com/reactnativestripesdk/CurrencySelectorElementView.kt +26 -0
- package/android/src/main/java/com/reactnativestripesdk/CurrencySelectorElementViewManager.kt +42 -0
- package/android/src/main/java/com/reactnativestripesdk/EmbeddedPaymentElementView.kt +105 -49
- package/android/src/main/java/com/reactnativestripesdk/EmbeddedPaymentElementViewManager.kt +72 -12
- package/android/src/main/java/com/reactnativestripesdk/FinancialConnectionsSheetManager.kt +8 -4
- package/android/src/main/java/com/reactnativestripesdk/GooglePayButtonManager.kt +2 -1
- package/android/src/main/java/com/reactnativestripesdk/GooglePayButtonView.kt +26 -11
- package/android/src/main/java/com/reactnativestripesdk/GooglePayLauncherManager.kt +2 -1
- package/android/src/main/java/com/reactnativestripesdk/NavigationBarView.kt +14 -5
- package/android/src/main/java/com/reactnativestripesdk/PaymentElementConfig.kt +6 -2
- package/android/src/main/java/com/reactnativestripesdk/PaymentLauncherManager.kt +2 -2
- package/android/src/main/java/com/reactnativestripesdk/PaymentMethodCreateParamsFactory.kt +2 -1
- package/android/src/main/java/com/reactnativestripesdk/PaymentMethodMessagingElementConfig.kt +7 -4
- package/android/src/main/java/com/reactnativestripesdk/PaymentMethodMessagingElementViewManager.kt +2 -1
- package/android/src/main/java/com/reactnativestripesdk/PaymentOptionDisplayDataMapper.kt +8 -4
- package/android/src/main/java/com/reactnativestripesdk/PaymentSheetAppearance.kt +9 -3
- package/android/src/main/java/com/reactnativestripesdk/PaymentSheetManager.kt +110 -29
- package/android/src/main/java/com/reactnativestripesdk/StripeSdkModule.kt +250 -12
- package/android/src/main/java/com/reactnativestripesdk/StripeSdkPackage.kt +1 -0
- package/android/src/main/java/com/reactnativestripesdk/addresssheet/AddressLauncherManager.kt +2 -1
- package/android/src/main/java/com/reactnativestripesdk/addresssheet/AddressSheetView.kt +3 -1
- package/android/src/main/java/com/reactnativestripesdk/customersheet/CustomerSheetManager.kt +6 -2
- package/android/src/main/java/com/reactnativestripesdk/customersheet/ReactNativeCustomerAdapter.kt +3 -1
- package/android/src/main/java/com/reactnativestripesdk/customersheet/ReactNativeCustomerSessionProvider.kt +2 -1
- package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/AddToWalletButtonManager.kt +2 -1
- package/android/src/main/java/com/reactnativestripesdk/utils/CheckoutAddressUpdate.kt +45 -0
- package/android/src/main/java/com/reactnativestripesdk/utils/CheckoutMappers.kt +101 -0
- package/android/src/main/java/com/reactnativestripesdk/utils/Errors.kt +4 -2
- package/android/src/main/java/com/reactnativestripesdk/utils/Extensions.kt +5 -1
- package/android/src/main/java/com/reactnativestripesdk/utils/Mappers.kt +29 -17
- package/android/src/main/java/com/reactnativestripesdk/utils/PostalCodeUtilities.kt +2 -1
- package/android/src/oldarch/java/com/facebook/react/viewmanagers/EmbeddedPaymentElementViewManagerDelegate.java +6 -0
- package/android/src/oldarch/java/com/facebook/react/viewmanagers/EmbeddedPaymentElementViewManagerInterface.java +2 -0
- package/android/src/oldarch/java/com/facebook/react/viewmanagers/StripeCurrencySelectorElementManagerDelegate.java +35 -0
- package/android/src/oldarch/java/com/facebook/react/viewmanagers/StripeCurrencySelectorElementManagerInterface.java +18 -0
- package/android/src/oldarch/java/com/reactnativestripesdk/NativeStripeSdkModuleSpec.java +44 -0
- package/android/src/test/java/com/reactnativestripesdk/PaymentMethodMessagingElementConfigTest.kt +3 -3
- package/android/src/test/java/com/reactnativestripesdk/mappers/MappersTest.kt +60 -0
- package/android/src/test/java/com/reactnativestripesdk/mappers/OnrampMappersTest.kt +38 -0
- package/android/src/test/java/com/reactnativestripesdk/mappers/PaymentOptionDisplayDataMapperTest.kt +9 -4
- package/android/src/test/java/com/reactnativestripesdk/utils/CheckoutMappersTest.kt +89 -0
- package/android/src/test/java/com/reactnativestripesdk/utils/CheckoutTestFixtures.java +49 -0
- package/ios/ConnectAccountOnboarding/ConnectAccountOnboardingViewController.swift +6 -8
- package/ios/CurrencySelectorElementManager.m +9 -0
- package/ios/CurrencySelectorElementManager.swift +12 -0
- package/ios/CurrencySelectorElementView.swift +24 -0
- package/ios/Mappers+Checkout.swift +193 -0
- package/ios/Mappers.swift +0 -5
- package/ios/NewArch/EmbeddedPaymentElementViewComponentView.mm +16 -2
- package/ios/NewArch/StripeCurrencySelectorElementComponentView.h +10 -0
- package/ios/NewArch/StripeCurrencySelectorElementComponentView.mm +75 -0
- package/ios/PaymentMethodMessagingElementConfig.swift +6 -3
- package/ios/PaymentMethodMessagingElementView.swift +19 -0
- package/ios/StripeSdk.mm +123 -0
- package/ios/StripeSdkImpl+Checkout.swift +308 -0
- package/ios/StripeSdkImpl+Embedded.swift +108 -27
- package/ios/StripeSdkImpl+PaymentSheet.swift +18 -2
- package/ios/StripeSdkImpl.swift +3 -93
- package/jest/mock.js +14 -1
- package/lib/commonjs/components/AddToWalletButton.js +1 -1
- package/lib/commonjs/components/AddToWalletButton.js.map +1 -1
- package/lib/commonjs/components/AddressSheet.js +1 -1
- package/lib/commonjs/components/AddressSheet.js.map +1 -1
- package/lib/commonjs/components/AuBECSDebitForm.js +1 -1
- package/lib/commonjs/components/AuBECSDebitForm.js.map +1 -1
- package/lib/commonjs/components/CardField.js +1 -1
- package/lib/commonjs/components/CardField.js.map +1 -1
- package/lib/commonjs/components/CardForm.js +1 -1
- package/lib/commonjs/components/CardForm.js.map +1 -1
- package/lib/commonjs/components/CurrencySelectorElement.js +2 -0
- package/lib/commonjs/components/CurrencySelectorElement.js.map +1 -0
- package/lib/commonjs/components/PaymentMethodMessagingElement.js +2 -0
- package/lib/commonjs/components/PaymentMethodMessagingElement.js.map +1 -0
- package/lib/commonjs/components/PlatformPayButton.js +1 -1
- package/lib/commonjs/components/PlatformPayButton.js.map +1 -1
- package/lib/commonjs/components/StripeContainer.js +1 -1
- package/lib/commonjs/components/StripeContainer.js.map +1 -1
- package/lib/commonjs/connect/Components.js +1 -1
- package/lib/commonjs/connect/Components.js.map +1 -1
- package/lib/commonjs/connect/ConnectComponentsProvider.js +1 -1
- package/lib/commonjs/connect/ConnectComponentsProvider.js.map +1 -1
- package/lib/commonjs/connect/EmbeddedComponent.js +1 -1
- package/lib/commonjs/connect/EmbeddedComponent.js.map +1 -1
- package/lib/commonjs/connect/ModalCloseButton.js +1 -1
- package/lib/commonjs/connect/ModalCloseButton.js.map +1 -1
- package/lib/commonjs/connect/NavigationBar.js +1 -1
- package/lib/commonjs/connect/NavigationBar.js.map +1 -1
- package/lib/commonjs/events.js.map +1 -1
- package/lib/commonjs/functions.js +1 -1
- package/lib/commonjs/functions.js.map +1 -1
- package/lib/commonjs/helpers.js +1 -1
- package/lib/commonjs/hooks/useCheckout.js +2 -0
- package/lib/commonjs/hooks/useCheckout.js.map +1 -0
- package/lib/commonjs/hooks/useOnramp.js +1 -1
- package/lib/commonjs/hooks/useOnramp.js.map +1 -1
- package/lib/commonjs/index.js +1 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/specs/NativeAddToWalletButton.js +1 -1
- package/lib/commonjs/specs/NativeAddressSheet.js +1 -1
- package/lib/commonjs/specs/NativeApplePayButton.js +1 -1
- package/lib/commonjs/specs/NativeAuBECSDebitForm.js +1 -1
- package/lib/commonjs/specs/NativeCardField.js +1 -1
- package/lib/commonjs/specs/NativeCardField.js.map +1 -1
- package/lib/commonjs/specs/NativeCardForm.js +1 -1
- package/lib/commonjs/specs/NativeCardForm.js.map +1 -1
- package/lib/commonjs/specs/NativeConnectAccountOnboardingView.js +1 -1
- package/lib/commonjs/specs/NativeCurrencySelectorElement.js +2 -0
- package/lib/commonjs/specs/NativeCurrencySelectorElement.js.map +1 -0
- package/lib/commonjs/specs/NativeEmbeddedPaymentElement.js +1 -1
- package/lib/commonjs/specs/NativeEmbeddedPaymentElement.js.map +1 -1
- package/lib/commonjs/specs/NativeGooglePayButton.js +1 -1
- package/lib/commonjs/specs/NativeNavigationBar.js +1 -1
- package/lib/commonjs/specs/NativePaymentMethodMessagingElement.js +1 -1
- package/lib/commonjs/specs/NativePaymentMethodMessagingElement.js.map +1 -1
- package/lib/commonjs/specs/NativeStripeContainer.js +1 -1
- package/lib/commonjs/specs/NativeStripeSdkModule.js.map +1 -1
- package/lib/commonjs/types/Checkout.js +2 -0
- package/lib/commonjs/types/Checkout.js.map +1 -0
- package/lib/commonjs/types/EmbeddedPaymentElement.js +1 -1
- package/lib/commonjs/types/EmbeddedPaymentElement.js.map +1 -1
- package/lib/commonjs/types/PaymentSheet.js.map +1 -1
- package/lib/module/components/AddToWalletButton.js +1 -1
- package/lib/module/components/AddToWalletButton.js.map +1 -1
- package/lib/module/components/AddressSheet.js +1 -1
- package/lib/module/components/AddressSheet.js.map +1 -1
- package/lib/module/components/AuBECSDebitForm.js +1 -1
- package/lib/module/components/AuBECSDebitForm.js.map +1 -1
- package/lib/module/components/CardField.js +1 -1
- package/lib/module/components/CardField.js.map +1 -1
- package/lib/module/components/CardForm.js +1 -1
- package/lib/module/components/CardForm.js.map +1 -1
- package/lib/module/components/CurrencySelectorElement.js +2 -0
- package/lib/module/components/CurrencySelectorElement.js.map +1 -0
- package/lib/module/components/PaymentMethodMessagingElement.js +2 -0
- package/lib/module/components/PaymentMethodMessagingElement.js.map +1 -0
- package/lib/module/components/PlatformPayButton.js +1 -1
- package/lib/module/components/PlatformPayButton.js.map +1 -1
- package/lib/module/components/StripeContainer.js +1 -1
- package/lib/module/components/StripeContainer.js.map +1 -1
- package/lib/module/connect/Components.js +1 -1
- package/lib/module/connect/Components.js.map +1 -1
- package/lib/module/connect/ConnectComponentsProvider.js +1 -1
- package/lib/module/connect/ConnectComponentsProvider.js.map +1 -1
- package/lib/module/connect/EmbeddedComponent.js +1 -1
- package/lib/module/connect/EmbeddedComponent.js.map +1 -1
- package/lib/module/connect/ModalCloseButton.js +1 -1
- package/lib/module/connect/ModalCloseButton.js.map +1 -1
- package/lib/module/connect/NavigationBar.js +1 -1
- package/lib/module/connect/NavigationBar.js.map +1 -1
- package/lib/module/events.js.map +1 -1
- package/lib/module/functions.js +1 -1
- package/lib/module/functions.js.map +1 -1
- package/lib/module/helpers.js +1 -1
- package/lib/module/hooks/useCheckout.js +2 -0
- package/lib/module/hooks/useCheckout.js.map +1 -0
- package/lib/module/hooks/useOnramp.js +1 -1
- package/lib/module/hooks/useOnramp.js.map +1 -1
- package/lib/module/index.js +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/specs/NativeAddToWalletButton.js +1 -1
- package/lib/module/specs/NativeAddressSheet.js +1 -1
- package/lib/module/specs/NativeApplePayButton.js +1 -1
- package/lib/module/specs/NativeAuBECSDebitForm.js +1 -1
- package/lib/module/specs/NativeCardField.js +1 -1
- package/lib/module/specs/NativeCardField.js.map +1 -1
- package/lib/module/specs/NativeCardForm.js +1 -1
- package/lib/module/specs/NativeCardForm.js.map +1 -1
- package/lib/module/specs/NativeConnectAccountOnboardingView.js +1 -1
- package/lib/module/specs/NativeCurrencySelectorElement.js +2 -0
- package/lib/module/specs/NativeCurrencySelectorElement.js.map +1 -0
- package/lib/module/specs/NativeEmbeddedPaymentElement.js +1 -1
- package/lib/module/specs/NativeEmbeddedPaymentElement.js.map +1 -1
- package/lib/module/specs/NativeGooglePayButton.js +1 -1
- package/lib/module/specs/NativeNavigationBar.js +1 -1
- package/lib/module/specs/NativePaymentMethodMessagingElement.js +1 -1
- package/lib/module/specs/NativePaymentMethodMessagingElement.js.map +1 -1
- package/lib/module/specs/NativeStripeContainer.js +1 -1
- package/lib/module/specs/NativeStripeSdkModule.js.map +1 -1
- package/lib/module/types/Checkout.js +2 -0
- package/lib/module/types/Checkout.js.map +1 -0
- package/lib/module/types/EmbeddedPaymentElement.js +1 -1
- package/lib/module/types/EmbeddedPaymentElement.js.map +1 -1
- package/lib/module/types/PaymentSheet.js.map +1 -1
- package/lib/typescript/src/components/CurrencySelectorElement.d.ts +62 -0
- package/lib/typescript/src/components/CurrencySelectorElement.d.ts.map +1 -0
- package/lib/typescript/src/components/PaymentMethodMessagingElement.d.ts +41 -0
- package/lib/typescript/src/components/PaymentMethodMessagingElement.d.ts.map +1 -0
- package/lib/typescript/src/events.d.ts +11 -0
- package/lib/typescript/src/events.d.ts.map +1 -1
- package/lib/typescript/src/functions.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useCheckout.d.ts +21 -0
- package/lib/typescript/src/hooks/useCheckout.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useOnramp.d.ts +1 -0
- package/lib/typescript/src/hooks/useOnramp.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +3 -0
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/specs/NativeCurrencySelectorElement.d.ts +25 -0
- package/lib/typescript/src/specs/NativeCurrencySelectorElement.d.ts.map +1 -0
- package/lib/typescript/src/specs/NativeEmbeddedPaymentElement.d.ts +5 -1
- package/lib/typescript/src/specs/NativeEmbeddedPaymentElement.d.ts.map +1 -1
- package/lib/typescript/src/specs/NativePaymentMethodMessagingElement.d.ts +1 -6
- package/lib/typescript/src/specs/NativePaymentMethodMessagingElement.d.ts.map +1 -1
- package/lib/typescript/src/specs/NativeStripeSdkModule.d.ts +16 -1
- package/lib/typescript/src/specs/NativeStripeSdkModule.d.ts.map +1 -1
- package/lib/typescript/src/types/Checkout.d.ts +336 -0
- package/lib/typescript/src/types/Checkout.d.ts.map +1 -0
- package/lib/typescript/src/types/EmbeddedPaymentElement.d.ts +36 -1
- package/lib/typescript/src/types/EmbeddedPaymentElement.d.ts.map +1 -1
- package/lib/typescript/src/types/PaymentMethod.d.ts +1 -5
- package/lib/typescript/src/types/PaymentMethod.d.ts.map +1 -1
- package/lib/typescript/src/types/PaymentSheet.d.ts +22 -6
- package/lib/typescript/src/types/PaymentSheet.d.ts.map +1 -1
- package/lib/typescript/src/types/components/PaymentMethodMessagingElementComponent.d.ts +16 -1
- package/lib/typescript/src/types/components/PaymentMethodMessagingElementComponent.d.ts.map +1 -1
- package/package.json +21 -7
- package/src/components/CurrencySelectorElement.tsx +95 -0
- package/src/components/PaymentMethodMessagingElement.tsx +109 -0
- package/src/events.ts +11 -0
- package/src/functions.ts +30 -1
- package/src/hooks/useCheckout.tsx +207 -0
- package/src/hooks/useOnramp.tsx +9 -3
- package/src/index.tsx +4 -0
- package/src/specs/NativeCurrencySelectorElement.ts +35 -0
- package/src/specs/NativeEmbeddedPaymentElement.ts +12 -2
- package/src/specs/NativePaymentMethodMessagingElement.ts +0 -7
- package/src/specs/NativeStripeSdkModule.ts +58 -1
- package/src/types/Checkout.ts +377 -0
- package/src/types/EmbeddedPaymentElement.tsx +117 -26
- package/src/types/PaymentMethod.ts +0 -6
- package/src/types/PaymentSheet.ts +29 -6
- package/src/types/components/PaymentMethodMessagingElementComponent.tsx +17 -1
- package/stripe-react-native.podspec +8 -8
- package/android/spotless.gradle +0 -19
|
@@ -144,7 +144,6 @@ internal fun mapPaymentMethodType(type: PaymentMethod.Type?): String =
|
|
|
144
144
|
PaymentMethod.Type.Oxxo -> "Oxxo"
|
|
145
145
|
PaymentMethod.Type.P24 -> "P24"
|
|
146
146
|
PaymentMethod.Type.SepaDebit -> "SepaDebit"
|
|
147
|
-
PaymentMethod.Type.Upi -> "Upi"
|
|
148
147
|
PaymentMethod.Type.WeChatPay -> "WeChatPay"
|
|
149
148
|
PaymentMethod.Type.Klarna -> "Klarna"
|
|
150
149
|
PaymentMethod.Type.USBankAccount -> "USBankAccount"
|
|
@@ -176,7 +175,6 @@ internal fun mapToPaymentMethodType(type: String?): PaymentMethod.Type? =
|
|
|
176
175
|
"Oxxo" -> PaymentMethod.Type.Oxxo
|
|
177
176
|
"P24" -> PaymentMethod.Type.P24
|
|
178
177
|
"SepaDebit" -> PaymentMethod.Type.SepaDebit
|
|
179
|
-
"Upi" -> PaymentMethod.Type.Upi
|
|
180
178
|
"WeChatPay" -> PaymentMethod.Type.WeChatPay
|
|
181
179
|
"Klarna" -> PaymentMethod.Type.Klarna
|
|
182
180
|
"USBankAccount" -> PaymentMethod.Type.USBankAccount
|
|
@@ -207,7 +205,9 @@ internal fun mapFromBillingDetails(billingDatails: PaymentMethod.BillingDetails?
|
|
|
207
205
|
return details
|
|
208
206
|
}
|
|
209
207
|
|
|
210
|
-
internal fun mapFromPaymentSheetBillingDetails(
|
|
208
|
+
internal fun mapFromPaymentSheetBillingDetails(
|
|
209
|
+
billing: com.stripe.android.paymentsheet.PaymentSheet.BillingDetails?
|
|
210
|
+
): WritableMap {
|
|
211
211
|
val details = Arguments.createMap()
|
|
212
212
|
details.putString("name", billing?.name)
|
|
213
213
|
details.putString("email", billing?.email)
|
|
@@ -436,7 +436,6 @@ internal fun mapFromPaymentMethod(paymentMethod: PaymentMethod): WritableMap {
|
|
|
436
436
|
it.putString("bank", paymentMethod.fpx?.bank)
|
|
437
437
|
},
|
|
438
438
|
)
|
|
439
|
-
pm.putMap("Upi", Arguments.createMap().also { it.putString("vpa", paymentMethod.upi?.vpa) })
|
|
440
439
|
pm.putMap(
|
|
441
440
|
"USBankAccount",
|
|
442
441
|
Arguments.createMap().also {
|
|
@@ -560,7 +559,6 @@ internal fun mapNextAction(
|
|
|
560
559
|
NextActionType.CashAppRedirect,
|
|
561
560
|
NextActionType.BlikAuthorize,
|
|
562
561
|
NextActionType.UseStripeSdk,
|
|
563
|
-
NextActionType.UpiAwaitNotification,
|
|
564
562
|
NextActionType.DisplayPayNowDetails,
|
|
565
563
|
NextActionType.DisplayPromptPayDetails,
|
|
566
564
|
null,
|
|
@@ -716,7 +714,7 @@ internal fun mapToShippingDetails(shippingDetails: ReadableMap?): ConfirmPayment
|
|
|
716
714
|
)
|
|
717
715
|
}
|
|
718
716
|
|
|
719
|
-
private fun convertToUnixTimestamp(timestamp: Long): String = (timestamp *
|
|
717
|
+
private fun convertToUnixTimestamp(timestamp: Long): String = (timestamp * SECONDS_TO_MILLIS).toString()
|
|
720
718
|
|
|
721
719
|
fun mapToUICustomization(params: ReadableMap): PaymentAuthConfig.Stripe3ds2UiCustomization {
|
|
722
720
|
val labelCustomization = params.getMap("label")
|
|
@@ -968,15 +966,15 @@ internal fun mapToPreferredNetworks(networksAsInts: List<Int>?): List<CardBrand>
|
|
|
968
966
|
|
|
969
967
|
val intToCardBrand =
|
|
970
968
|
mapOf(
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
969
|
+
CARD_BRAND_JCB to CardBrand.JCB,
|
|
970
|
+
CARD_BRAND_AMEX to CardBrand.AmericanExpress,
|
|
971
|
+
CARD_BRAND_CARTES_BANCAIRES to CardBrand.CartesBancaires,
|
|
972
|
+
CARD_BRAND_DINERS_CLUB to CardBrand.DinersClub,
|
|
973
|
+
CARD_BRAND_DISCOVER to CardBrand.Discover,
|
|
974
|
+
CARD_BRAND_MASTERCARD to CardBrand.MasterCard,
|
|
975
|
+
CARD_BRAND_UNION_PAY to CardBrand.UnionPay,
|
|
976
|
+
CARD_BRAND_VISA to CardBrand.Visa,
|
|
977
|
+
CARD_BRAND_UNKNOWN to CardBrand.Unknown,
|
|
980
978
|
)
|
|
981
979
|
|
|
982
980
|
return networksAsInts.mapNotNull { intToCardBrand[it] }
|
|
@@ -1038,7 +1036,9 @@ private fun Map<String, Any?>.toReadableMap(): ReadableMap {
|
|
|
1038
1036
|
}
|
|
1039
1037
|
|
|
1040
1038
|
@SuppressLint("RestrictedApi")
|
|
1041
|
-
internal fun parseCustomPaymentMethods(
|
|
1039
|
+
internal fun parseCustomPaymentMethods(
|
|
1040
|
+
customPaymentMethodConfig: ReadableMap?
|
|
1041
|
+
): List<PaymentSheet.CustomPaymentMethod> {
|
|
1042
1042
|
if (customPaymentMethodConfig == null) {
|
|
1043
1043
|
return emptyList()
|
|
1044
1044
|
}
|
|
@@ -1051,7 +1051,8 @@ internal fun parseCustomPaymentMethods(customPaymentMethodConfig: ReadableMap?):
|
|
|
1051
1051
|
val id = customPaymentMethodMap.getString("id")
|
|
1052
1052
|
if (id != null) {
|
|
1053
1053
|
val subtitle = customPaymentMethodMap.getString("subtitle")
|
|
1054
|
-
val disableBillingDetailCollection = customPaymentMethodMap
|
|
1054
|
+
val disableBillingDetailCollection = customPaymentMethodMap
|
|
1055
|
+
.getBooleanOr("disableBillingDetailCollection", false)
|
|
1055
1056
|
result.add(
|
|
1056
1057
|
PaymentSheet.CustomPaymentMethod(
|
|
1057
1058
|
id = id,
|
|
@@ -1194,3 +1195,14 @@ fun readableArrayOf(vararg elements: Any?): ReadableArray =
|
|
|
1194
1195
|
}
|
|
1195
1196
|
}
|
|
1196
1197
|
}
|
|
1198
|
+
|
|
1199
|
+
private const val SECONDS_TO_MILLIS = 1000
|
|
1200
|
+
private const val CARD_BRAND_JCB = 0
|
|
1201
|
+
private const val CARD_BRAND_AMEX = 1
|
|
1202
|
+
private const val CARD_BRAND_CARTES_BANCAIRES = 2
|
|
1203
|
+
private const val CARD_BRAND_DINERS_CLUB = 3
|
|
1204
|
+
private const val CARD_BRAND_DISCOVER = 4
|
|
1205
|
+
private const val CARD_BRAND_MASTERCARD = 5
|
|
1206
|
+
private const val CARD_BRAND_UNION_PAY = 6
|
|
1207
|
+
private const val CARD_BRAND_VISA = 7
|
|
1208
|
+
private const val CARD_BRAND_UNKNOWN = 8
|
|
@@ -2,7 +2,8 @@ package com.reactnativestripesdk.utils
|
|
|
2
2
|
|
|
3
3
|
class PostalCodeUtilities {
|
|
4
4
|
companion object {
|
|
5
|
-
internal fun isValidGlobalPostalCodeCharacter(c: Char): Boolean =
|
|
5
|
+
internal fun isValidGlobalPostalCodeCharacter(c: Char): Boolean =
|
|
6
|
+
Character.isLetterOrDigit(c) || c.isWhitespace() || c == '-'
|
|
6
7
|
|
|
7
8
|
internal fun isValidUsPostalCodeCharacter(c: Char): Boolean = Character.isDigit(c) || c.isWhitespace() || c == '-'
|
|
8
9
|
}
|
|
@@ -30,6 +30,9 @@ public class EmbeddedPaymentElementViewManagerDelegate<T extends View, U extends
|
|
|
30
30
|
case "intentConfiguration":
|
|
31
31
|
mViewManager.setIntentConfiguration(view, new DynamicFromObject(value));
|
|
32
32
|
break;
|
|
33
|
+
case "checkout":
|
|
34
|
+
mViewManager.setCheckout(view, new DynamicFromObject(value));
|
|
35
|
+
break;
|
|
33
36
|
default:
|
|
34
37
|
super.setProperty(view, propName, value);
|
|
35
38
|
}
|
|
@@ -47,6 +50,9 @@ public class EmbeddedPaymentElementViewManagerDelegate<T extends View, U extends
|
|
|
47
50
|
case "update":
|
|
48
51
|
mViewManager.update(view, args != null ? args.getString(0) : null);
|
|
49
52
|
break;
|
|
53
|
+
case "updateWithCheckout":
|
|
54
|
+
mViewManager.updateWithCheckout(view, args != null ? args.getString(0) : null);
|
|
55
|
+
break;
|
|
50
56
|
}
|
|
51
57
|
}
|
|
52
58
|
}
|
|
@@ -16,7 +16,9 @@ import com.facebook.react.bridge.Dynamic;
|
|
|
16
16
|
public interface EmbeddedPaymentElementViewManagerInterface<T extends View> {
|
|
17
17
|
void setConfiguration(T view, Dynamic value);
|
|
18
18
|
void setIntentConfiguration(T view, Dynamic value);
|
|
19
|
+
void setCheckout(T view, Dynamic value);
|
|
19
20
|
void confirm(T view);
|
|
20
21
|
void clearPaymentOption(T view);
|
|
21
22
|
void update(T view, @Nullable String intentConfigurationJson);
|
|
23
|
+
void updateWithCheckout(T view, @Nullable String sessionKey);
|
|
22
24
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
3
|
+
*
|
|
4
|
+
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
5
|
+
* once the code is regenerated.
|
|
6
|
+
*
|
|
7
|
+
* @generated by codegen project: GeneratePropsJavaDelegate.js
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
package com.facebook.react.viewmanagers;
|
|
11
|
+
|
|
12
|
+
import android.view.View;
|
|
13
|
+
import androidx.annotation.Nullable;
|
|
14
|
+
import com.facebook.react.uimanager.BaseViewManager;
|
|
15
|
+
import com.facebook.react.uimanager.BaseViewManagerDelegate;
|
|
16
|
+
import com.facebook.react.uimanager.LayoutShadowNode;
|
|
17
|
+
|
|
18
|
+
public class StripeCurrencySelectorElementManagerDelegate<T extends View, U extends BaseViewManager<T, ? extends LayoutShadowNode> & StripeCurrencySelectorElementManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
|
|
19
|
+
public StripeCurrencySelectorElementManagerDelegate(U viewManager) {
|
|
20
|
+
super(viewManager);
|
|
21
|
+
}
|
|
22
|
+
@Override
|
|
23
|
+
public void setProperty(T view, String propName, @Nullable Object value) {
|
|
24
|
+
switch (propName) {
|
|
25
|
+
case "sessionKey":
|
|
26
|
+
mViewManager.setSessionKey(view, value == null ? null : (String) value);
|
|
27
|
+
break;
|
|
28
|
+
case "disabled":
|
|
29
|
+
mViewManager.setDisabled(view, value == null ? false : (boolean) value);
|
|
30
|
+
break;
|
|
31
|
+
default:
|
|
32
|
+
super.setProperty(view, propName, value);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
3
|
+
*
|
|
4
|
+
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
5
|
+
* once the code is regenerated.
|
|
6
|
+
*
|
|
7
|
+
* @generated by codegen project: GeneratePropsJavaInterface.js
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
package com.facebook.react.viewmanagers;
|
|
11
|
+
|
|
12
|
+
import android.view.View;
|
|
13
|
+
import androidx.annotation.Nullable;
|
|
14
|
+
|
|
15
|
+
public interface StripeCurrencySelectorElementManagerInterface<T extends View> {
|
|
16
|
+
void setSessionKey(T view, @Nullable String value);
|
|
17
|
+
void setDisabled(T view, boolean value);
|
|
18
|
+
}
|
|
@@ -253,6 +253,10 @@ public abstract class NativeStripeSdkModuleSpec extends ReactContextBaseJavaModu
|
|
|
253
253
|
@DoNotStrip
|
|
254
254
|
public abstract void createEmbeddedPaymentElement(ReadableMap intentConfig, ReadableMap configuration, Promise promise);
|
|
255
255
|
|
|
256
|
+
@ReactMethod
|
|
257
|
+
@DoNotStrip
|
|
258
|
+
public abstract void createEmbeddedPaymentElementWithCheckout(String sessionKey, ReadableMap configuration, Promise promise);
|
|
259
|
+
|
|
256
260
|
@ReactMethod
|
|
257
261
|
@DoNotStrip
|
|
258
262
|
public abstract void confirmEmbeddedPaymentElement(double viewTag, Promise promise);
|
|
@@ -261,6 +265,10 @@ public abstract class NativeStripeSdkModuleSpec extends ReactContextBaseJavaModu
|
|
|
261
265
|
@DoNotStrip
|
|
262
266
|
public abstract void updateEmbeddedPaymentElement(ReadableMap intentConfig, Promise promise);
|
|
263
267
|
|
|
268
|
+
@ReactMethod
|
|
269
|
+
@DoNotStrip
|
|
270
|
+
public abstract void updateEmbeddedPaymentElementWithCheckout(String sessionKey, Promise promise);
|
|
271
|
+
|
|
264
272
|
@ReactMethod
|
|
265
273
|
@DoNotStrip
|
|
266
274
|
public abstract void clearEmbeddedPaymentOption(double viewTag, Promise promise);
|
|
@@ -293,6 +301,42 @@ public abstract class NativeStripeSdkModuleSpec extends ReactContextBaseJavaModu
|
|
|
293
301
|
@DoNotStrip
|
|
294
302
|
public abstract void pollAndClearPendingStripeConnectUrls(Promise promise);
|
|
295
303
|
|
|
304
|
+
@ReactMethod
|
|
305
|
+
@DoNotStrip
|
|
306
|
+
public abstract void initCheckoutSession(String clientSecret, ReadableMap configuration, Promise promise);
|
|
307
|
+
|
|
308
|
+
@ReactMethod
|
|
309
|
+
@DoNotStrip
|
|
310
|
+
public abstract void checkoutUpdateShippingAddress(String sessionKey, ReadableMap address, @Nullable String name, @Nullable String phone, Promise promise);
|
|
311
|
+
|
|
312
|
+
@ReactMethod
|
|
313
|
+
@DoNotStrip
|
|
314
|
+
public abstract void checkoutUpdateBillingAddress(String sessionKey, ReadableMap address, @Nullable String name, @Nullable String phone, Promise promise);
|
|
315
|
+
|
|
316
|
+
@ReactMethod
|
|
317
|
+
@DoNotStrip
|
|
318
|
+
public abstract void checkoutApplyPromotionCode(String sessionKey, String code, Promise promise);
|
|
319
|
+
|
|
320
|
+
@ReactMethod
|
|
321
|
+
@DoNotStrip
|
|
322
|
+
public abstract void checkoutRemovePromotionCode(String sessionKey, Promise promise);
|
|
323
|
+
|
|
324
|
+
@ReactMethod
|
|
325
|
+
@DoNotStrip
|
|
326
|
+
public abstract void checkoutUpdateLineItemQuantity(String sessionKey, String lineItemId, double quantity, Promise promise);
|
|
327
|
+
|
|
328
|
+
@ReactMethod
|
|
329
|
+
@DoNotStrip
|
|
330
|
+
public abstract void checkoutSelectShippingOption(String sessionKey, String id, Promise promise);
|
|
331
|
+
|
|
332
|
+
@ReactMethod
|
|
333
|
+
@DoNotStrip
|
|
334
|
+
public abstract void checkoutUpdateTaxId(String sessionKey, String type, String value, Promise promise);
|
|
335
|
+
|
|
336
|
+
@ReactMethod
|
|
337
|
+
@DoNotStrip
|
|
338
|
+
public abstract void checkoutRefresh(String sessionKey, Promise promise);
|
|
339
|
+
|
|
296
340
|
@ReactMethod
|
|
297
341
|
@DoNotStrip
|
|
298
342
|
public abstract void addListener(String eventType);
|
package/android/src/test/java/com/reactnativestripesdk/PaymentMethodMessagingElementConfigTest.kt
CHANGED
|
@@ -404,7 +404,7 @@ class PaymentMethodMessagingElementConfigTest {
|
|
|
404
404
|
readableMapOf(
|
|
405
405
|
"font" to
|
|
406
406
|
readableMapOf(
|
|
407
|
-
"
|
|
407
|
+
"size" to 20,
|
|
408
408
|
),
|
|
409
409
|
)
|
|
410
410
|
|
|
@@ -416,7 +416,7 @@ class PaymentMethodMessagingElementConfigTest {
|
|
|
416
416
|
PaymentMethodMessagingElement.Appearance
|
|
417
417
|
.Font()
|
|
418
418
|
.fontFamily(null)
|
|
419
|
-
.fontSizeSp((
|
|
419
|
+
.fontSizeSp((20).toFloat())
|
|
420
420
|
font(font)
|
|
421
421
|
colors(PaymentMethodMessagingElement.Appearance.Colors())
|
|
422
422
|
}
|
|
@@ -433,7 +433,7 @@ class PaymentMethodMessagingElementConfigTest {
|
|
|
433
433
|
"linkTextColor" to "#00FFFF",
|
|
434
434
|
"font" to
|
|
435
435
|
readableMapOf(
|
|
436
|
-
"
|
|
436
|
+
"size" to 20,
|
|
437
437
|
),
|
|
438
438
|
)
|
|
439
439
|
|
|
@@ -2,6 +2,7 @@ package com.reactnativestripesdk.mappers
|
|
|
2
2
|
|
|
3
3
|
import android.annotation.SuppressLint
|
|
4
4
|
import com.facebook.react.bridge.WritableMap
|
|
5
|
+
import com.reactnativestripesdk.utils.buildCheckoutAddressUpdate
|
|
5
6
|
import com.reactnativestripesdk.utils.createCanAddCardResult
|
|
6
7
|
import com.reactnativestripesdk.utils.mapNextAction
|
|
7
8
|
import com.reactnativestripesdk.utils.mapPaymentMethodType
|
|
@@ -348,6 +349,65 @@ class MappersTest {
|
|
|
348
349
|
assertEquals("cpmt_valid", result[0].id)
|
|
349
350
|
}
|
|
350
351
|
|
|
352
|
+
// ============================================
|
|
353
|
+
// buildCheckoutAddressUpdate Tests
|
|
354
|
+
// ============================================
|
|
355
|
+
|
|
356
|
+
@Test
|
|
357
|
+
fun buildCheckoutAddressUpdate_TrimsFields() {
|
|
358
|
+
val update =
|
|
359
|
+
buildCheckoutAddressUpdate(
|
|
360
|
+
name = " Jane Doe ",
|
|
361
|
+
phone = " 5551234567 ",
|
|
362
|
+
address =
|
|
363
|
+
readableMapOf(
|
|
364
|
+
"country" to " US ",
|
|
365
|
+
"line1" to " 123 Main St ",
|
|
366
|
+
"line2" to " Apt 4 ",
|
|
367
|
+
"city" to " San Francisco ",
|
|
368
|
+
"state" to " CA ",
|
|
369
|
+
"postalCode" to " 94111 ",
|
|
370
|
+
),
|
|
371
|
+
)
|
|
372
|
+
|
|
373
|
+
assertNotNull(update)
|
|
374
|
+
assertEquals("Jane Doe", update!!.name)
|
|
375
|
+
assertEquals("5551234567", update.phone)
|
|
376
|
+
assertEquals("US", update.country)
|
|
377
|
+
assertEquals("123 Main St", update.line1)
|
|
378
|
+
assertEquals("Apt 4", update.line2)
|
|
379
|
+
assertEquals("San Francisco", update.city)
|
|
380
|
+
assertEquals("CA", update.state)
|
|
381
|
+
assertEquals("94111", update.postalCode)
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
@Test
|
|
385
|
+
fun buildCheckoutAddressUpdate_RequiresCountry() {
|
|
386
|
+
val withoutCountry =
|
|
387
|
+
buildCheckoutAddressUpdate(
|
|
388
|
+
name = "Jane Doe",
|
|
389
|
+
phone = "5551234567",
|
|
390
|
+
address =
|
|
391
|
+
readableMapOf(
|
|
392
|
+
"line1" to "123 Main St",
|
|
393
|
+
"city" to "San Francisco",
|
|
394
|
+
),
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
val blankCountry =
|
|
398
|
+
buildCheckoutAddressUpdate(
|
|
399
|
+
name = "Jane Doe",
|
|
400
|
+
phone = "5551234567",
|
|
401
|
+
address =
|
|
402
|
+
readableMapOf(
|
|
403
|
+
"country" to " ",
|
|
404
|
+
),
|
|
405
|
+
)
|
|
406
|
+
|
|
407
|
+
assertNull(withoutCountry)
|
|
408
|
+
assertNull(blankCountry)
|
|
409
|
+
}
|
|
410
|
+
|
|
351
411
|
// ============================================
|
|
352
412
|
// mapToAddress Tests
|
|
353
413
|
// ============================================
|
|
@@ -8,9 +8,11 @@ import com.reactnativestripesdk.mapAppearance
|
|
|
8
8
|
import com.reactnativestripesdk.mapConfig
|
|
9
9
|
import com.reactnativestripesdk.mapFromKycInfo
|
|
10
10
|
import com.reactnativestripesdk.mapGooglePayConfig
|
|
11
|
+
import com.reactnativestripesdk.mapPaymentDetailsType
|
|
11
12
|
import com.reactnativestripesdk.utils.readableMapOf
|
|
12
13
|
import com.stripe.android.crypto.onramp.ExperimentalCryptoOnramp
|
|
13
14
|
import com.stripe.android.crypto.onramp.model.KycInfo
|
|
15
|
+
import com.stripe.android.crypto.onramp.model.PaymentMethodDisplayData
|
|
14
16
|
import com.stripe.android.googlepaylauncher.GooglePayEnvironment
|
|
15
17
|
import com.stripe.android.googlepaylauncher.GooglePayPaymentMethodLauncher
|
|
16
18
|
import com.stripe.android.link.LinkAppearance.Style
|
|
@@ -363,6 +365,35 @@ class OnrampMappersTest {
|
|
|
363
365
|
assertNull(state.primaryButton.heightDp)
|
|
364
366
|
}
|
|
365
367
|
|
|
368
|
+
@Test
|
|
369
|
+
fun mapAppearance_WithPrimaryButton_HeightOnly() {
|
|
370
|
+
val primaryButton =
|
|
371
|
+
readableMapOf(
|
|
372
|
+
"height" to 48.0,
|
|
373
|
+
)
|
|
374
|
+
val appearanceMap =
|
|
375
|
+
readableMapOf(
|
|
376
|
+
"primaryButton" to primaryButton,
|
|
377
|
+
)
|
|
378
|
+
val state = mapAppearance(appearanceMap).build()
|
|
379
|
+
|
|
380
|
+
assertNull(state.primaryButton.cornerRadiusDp)
|
|
381
|
+
assertEquals(48f, state.primaryButton.heightDp)
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
@Test
|
|
385
|
+
fun mapAppearance_WithPrimaryButton_EmptyMap() {
|
|
386
|
+
val primaryButton = readableMapOf()
|
|
387
|
+
val appearanceMap =
|
|
388
|
+
readableMapOf(
|
|
389
|
+
"primaryButton" to primaryButton,
|
|
390
|
+
)
|
|
391
|
+
val state = mapAppearance(appearanceMap).build()
|
|
392
|
+
|
|
393
|
+
assertNull(state.primaryButton.cornerRadiusDp)
|
|
394
|
+
assertNull(state.primaryButton.heightDp)
|
|
395
|
+
}
|
|
396
|
+
|
|
366
397
|
@Test
|
|
367
398
|
fun mapAppearance_FullConfig() {
|
|
368
399
|
val lightColors =
|
|
@@ -405,6 +436,13 @@ class OnrampMappersTest {
|
|
|
405
436
|
assertEquals(48f, state.primaryButton.heightDp)
|
|
406
437
|
}
|
|
407
438
|
|
|
439
|
+
@Test
|
|
440
|
+
fun mapPaymentDetailsType_MapsAllSupportedTypes() {
|
|
441
|
+
assertEquals("Card", mapPaymentDetailsType(PaymentMethodDisplayData.Type.Card))
|
|
442
|
+
assertEquals("BankAccount", mapPaymentDetailsType(PaymentMethodDisplayData.Type.BankAccount))
|
|
443
|
+
assertEquals("GooglePay", mapPaymentDetailsType(PaymentMethodDisplayData.Type.GooglePay))
|
|
444
|
+
}
|
|
445
|
+
|
|
408
446
|
@Test
|
|
409
447
|
fun mapFromKycInfo_AllFields() {
|
|
410
448
|
val kycInfo =
|
package/android/src/test/java/com/reactnativestripesdk/mappers/PaymentOptionDisplayDataMapperTest.kt
CHANGED
|
@@ -52,7 +52,8 @@ class PaymentOptionDisplayDataMapperTest {
|
|
|
52
52
|
val result = annotatedString.toHtmlString()
|
|
53
53
|
|
|
54
54
|
Assert.assertEquals(
|
|
55
|
-
"By continuing, you agree to our <a href=\"https://stripe.com/privacy\">Privacy Policy</a>
|
|
55
|
+
"By continuing, you agree to our <a href=\"https://stripe.com/privacy\">Privacy Policy</a>" +
|
|
56
|
+
" and <a href=\"https://stripe.com/terms\">Terms of Service</a>.",
|
|
56
57
|
result,
|
|
57
58
|
)
|
|
58
59
|
}
|
|
@@ -193,7 +194,8 @@ class PaymentOptionDisplayDataMapperTest {
|
|
|
193
194
|
val result = annotatedString.toHtmlString()
|
|
194
195
|
|
|
195
196
|
Assert.assertEquals(
|
|
196
|
-
"Visit our <b><font color=\"#0000FF\"><a href=\"https://stripe.com/privacy\">
|
|
197
|
+
"Visit our <b><font color=\"#0000FF\"><a href=\"https://stripe.com/privacy\">" +
|
|
198
|
+
"Privacy Policy</a></font></b> for details",
|
|
197
199
|
result,
|
|
198
200
|
)
|
|
199
201
|
}
|
|
@@ -293,7 +295,8 @@ class PaymentOptionDisplayDataMapperTest {
|
|
|
293
295
|
val result = annotatedString.toHtmlString()
|
|
294
296
|
|
|
295
297
|
Assert.assertEquals(
|
|
296
|
-
"Check <b><a href=\"https://stripe.com\">Stripe</a></b> and <i><font color=\"#00FF00\"
|
|
298
|
+
"Check <b><a href=\"https://stripe.com\">Stripe</a></b> and <i><font color=\"#00FF00\">" +
|
|
299
|
+
"<a href=\"https://github.com\">GitHub</a></font></i>",
|
|
297
300
|
result,
|
|
298
301
|
)
|
|
299
302
|
}
|
|
@@ -449,7 +452,9 @@ class PaymentOptionDisplayDataMapperTest {
|
|
|
449
452
|
val result = annotatedString.toHtmlString()
|
|
450
453
|
|
|
451
454
|
Assert.assertEquals(
|
|
452
|
-
"By continuing, you agree to <b><font color=\"#0000FF\"><u><a href=\"https://stripe.com/terms\">
|
|
455
|
+
"By continuing, you agree to <b><font color=\"#0000FF\"><u><a href=\"https://stripe.com/terms\">" +
|
|
456
|
+
"Terms</a></u></font></b> and <i><font color=\"#FF0000\"><a href=\"https://stripe.com/privacy\">" +
|
|
457
|
+
"Privacy</a></font></i>. Important details are <span style=\"background-color: #FFFF00;\">highlighted</span>.",
|
|
453
458
|
result,
|
|
454
459
|
)
|
|
455
460
|
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
package com.reactnativestripesdk.utils
|
|
2
|
+
|
|
3
|
+
import com.stripe.android.paymentelement.CheckoutSessionPreview
|
|
4
|
+
import org.junit.Assert.assertEquals
|
|
5
|
+
import org.junit.Assert.assertFalse
|
|
6
|
+
import org.junit.Assert.assertNotNull
|
|
7
|
+
import org.junit.Test
|
|
8
|
+
import org.junit.runner.RunWith
|
|
9
|
+
import org.robolectric.RobolectricTestRunner
|
|
10
|
+
|
|
11
|
+
@RunWith(RobolectricTestRunner::class)
|
|
12
|
+
@OptIn(CheckoutSessionPreview::class)
|
|
13
|
+
class CheckoutMappersTest {
|
|
14
|
+
@Test
|
|
15
|
+
fun mapFromCheckoutState_mapsLoadedSessionAndCurrentAndroidPlaceholders() {
|
|
16
|
+
val mapped =
|
|
17
|
+
mapFromCheckoutState(
|
|
18
|
+
isLoading = false,
|
|
19
|
+
session = CheckoutTestFixtures.fullSession(),
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
assertEquals("loaded", mapped.getString("status"))
|
|
23
|
+
|
|
24
|
+
val session = mapped.getMap("session")
|
|
25
|
+
assertNotNull(session)
|
|
26
|
+
assertEquals("cs_test_123", session!!.getString("id"))
|
|
27
|
+
assertEquals("unknown", session.getString("status"))
|
|
28
|
+
assertEquals("unknown", session.getString("paymentStatus"))
|
|
29
|
+
assertFalse(session.getBoolean("livemode"))
|
|
30
|
+
assertEquals("usd", session.getString("currency"))
|
|
31
|
+
assertFalse(session.hasKey("customerId"))
|
|
32
|
+
assertFalse(session.hasKey("customerEmail"))
|
|
33
|
+
assertFalse(session.hasKey("billingAddress"))
|
|
34
|
+
assertFalse(session.hasKey("shippingAddress"))
|
|
35
|
+
|
|
36
|
+
val totals = session.getMap("totals")
|
|
37
|
+
assertNotNull(totals)
|
|
38
|
+
assertEquals(5000.0, totals!!.getDouble("subtotal"), 0.0)
|
|
39
|
+
assertEquals(4044.0, totals.getDouble("total"), 0.0)
|
|
40
|
+
assertEquals(4044.0, totals.getDouble("due"), 0.0)
|
|
41
|
+
assertEquals(0.0, totals.getDouble("discount"), 0.0)
|
|
42
|
+
assertEquals(500.0, totals.getDouble("shipping"), 0.0)
|
|
43
|
+
assertEquals(294.0, totals.getDouble("tax"), 0.0)
|
|
44
|
+
|
|
45
|
+
val discounts = session.getArray("discounts")
|
|
46
|
+
assertNotNull(discounts)
|
|
47
|
+
assertEquals(0, discounts!!.size())
|
|
48
|
+
|
|
49
|
+
val lineItems = session.getArray("lineItems")
|
|
50
|
+
assertNotNull(lineItems)
|
|
51
|
+
assertEquals(2, lineItems!!.size())
|
|
52
|
+
assertEquals("li_item1", lineItems.getMap(0)?.getString("id"))
|
|
53
|
+
assertEquals("Llama Figure", lineItems.getMap(0)?.getString("name"))
|
|
54
|
+
assertEquals(2, lineItems.getMap(0)?.getInt("quantity"))
|
|
55
|
+
assertEquals(0.0, lineItems.getMap(0)?.getDouble("unitAmount") ?: -1.0, 0.0)
|
|
56
|
+
assertEquals("usd", lineItems.getMap(0)?.getString("currency"))
|
|
57
|
+
assertEquals(2499.0, lineItems.getMap(1)?.getDouble("unitAmount") ?: -1.0, 0.0)
|
|
58
|
+
|
|
59
|
+
val shippingOptions = session.getArray("shippingOptions")
|
|
60
|
+
assertNotNull(shippingOptions)
|
|
61
|
+
assertEquals(2, shippingOptions!!.size())
|
|
62
|
+
assertEquals("shr_standard", shippingOptions.getMap(0)?.getString("id"))
|
|
63
|
+
assertEquals("Standard Shipping", shippingOptions.getMap(0)?.getString("displayName"))
|
|
64
|
+
assertEquals(500.0, shippingOptions.getMap(0)?.getDouble("amount") ?: -1.0, 0.0)
|
|
65
|
+
assertEquals("usd", shippingOptions.getMap(0)?.getString("currency"))
|
|
66
|
+
assertFalse(shippingOptions.getMap(0)?.hasKey("deliveryEstimate") ?: true)
|
|
67
|
+
assertEquals("1-2 business days", shippingOptions.getMap(1)?.getString("deliveryEstimate"))
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@Test
|
|
71
|
+
fun mapFromCheckoutState_mapsLoadingStateAndOmitsBlankCurrency() {
|
|
72
|
+
val mapped =
|
|
73
|
+
mapFromCheckoutState(
|
|
74
|
+
isLoading = true,
|
|
75
|
+
session = CheckoutTestFixtures.blankCurrencySession(),
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
assertEquals("loading", mapped.getString("status"))
|
|
79
|
+
|
|
80
|
+
val session = mapped.getMap("session")
|
|
81
|
+
assertNotNull(session)
|
|
82
|
+
assertEquals("cs_test_blank_currency", session!!.getString("id"))
|
|
83
|
+
assertFalse(session.hasKey("currency"))
|
|
84
|
+
assertFalse(session.hasKey("totals"))
|
|
85
|
+
assertEquals(0, session.getArray("lineItems")!!.size())
|
|
86
|
+
assertEquals(0, session.getArray("shippingOptions")!!.size())
|
|
87
|
+
assertEquals(0, session.getArray("discounts")!!.size())
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
package com.reactnativestripesdk.utils;
|
|
2
|
+
|
|
3
|
+
import com.stripe.android.checkout.CheckoutSession;
|
|
4
|
+
import com.stripe.android.paymentsheet.verticalmode.CurrencySelectorOptions;
|
|
5
|
+
import java.util.Arrays;
|
|
6
|
+
import java.util.Collections;
|
|
7
|
+
|
|
8
|
+
public final class CheckoutTestFixtures {
|
|
9
|
+
private CheckoutTestFixtures() {}
|
|
10
|
+
|
|
11
|
+
public static CheckoutSession fullSession() {
|
|
12
|
+
CheckoutSession.TotalSummary totals =
|
|
13
|
+
new CheckoutSession.TotalSummary(
|
|
14
|
+
5000L,
|
|
15
|
+
4044L,
|
|
16
|
+
4044L,
|
|
17
|
+
Arrays.asList(
|
|
18
|
+
new CheckoutSession.DiscountAmount(500L, "SUMMER10"),
|
|
19
|
+
new CheckoutSession.DiscountAmount(250L, "LOYALTY5")),
|
|
20
|
+
Collections.singletonList(
|
|
21
|
+
new CheckoutSession.TaxAmount(294L, false, "Sales Tax", 6.875d)),
|
|
22
|
+
new CheckoutSession.ShippingRate(
|
|
23
|
+
"shr_standard", 500L, "Standard Shipping", "5-7 business days"),
|
|
24
|
+
null);
|
|
25
|
+
|
|
26
|
+
return new CheckoutSession(
|
|
27
|
+
"cs_test_123",
|
|
28
|
+
"usd",
|
|
29
|
+
totals,
|
|
30
|
+
Arrays.asList(
|
|
31
|
+
new CheckoutSession.LineItem("li_item1", "Llama Figure", 2, null, 1998L, 1998L),
|
|
32
|
+
new CheckoutSession.LineItem("li_item2", "Alpaca Plushie", 1, 2499L, 2499L, 2499L)),
|
|
33
|
+
Arrays.asList(
|
|
34
|
+
new CheckoutSession.ShippingRate("shr_standard", 500L, "Standard Shipping", null),
|
|
35
|
+
new CheckoutSession.ShippingRate(
|
|
36
|
+
"shr_express", 1500L, "Express Shipping", "1-2 business days")),
|
|
37
|
+
(CurrencySelectorOptions) null);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public static CheckoutSession blankCurrencySession() {
|
|
41
|
+
return new CheckoutSession(
|
|
42
|
+
"cs_test_blank_currency",
|
|
43
|
+
"",
|
|
44
|
+
null,
|
|
45
|
+
Collections.<CheckoutSession.LineItem>emptyList(),
|
|
46
|
+
Collections.<CheckoutSession.ShippingRate>emptyList(),
|
|
47
|
+
(CurrencySelectorOptions) null);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -122,12 +122,10 @@ class ConnectAccountOnboardingViewController: UIViewController {
|
|
|
122
122
|
reactContentView?.layoutIfNeeded()
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
}
|
|
132
|
-
}
|
|
125
|
+
// No viewWillDisappear/isBeingDismissed handler here. The modal uses .fullScreen
|
|
126
|
+
// presentation which prevents swipe-to-dismiss, so the only user-initiated exit path
|
|
127
|
+
// is the close button (handleCloseButtonPressed). Adding isBeingDismissed here would
|
|
128
|
+
// cause spurious onExit events when iOS presents a child VC (e.g. ASWebAuthenticationSession
|
|
129
|
+
// for identity verification) over this modal — UIKit calls viewWillDisappear and reports
|
|
130
|
+
// isBeingDismissed = true even though the user didn't close the modal.
|
|
133
131
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#import <Foundation/Foundation.h>
|
|
2
|
+
#import <React/RCTBridgeModule.h>
|
|
3
|
+
#import <React/RCTViewManager.h>
|
|
4
|
+
|
|
5
|
+
@interface RCT_EXTERN_MODULE(StripeCurrencySelectorElementManager, RCTViewManager)
|
|
6
|
+
RCT_EXPORT_VIEW_PROPERTY(sessionKey, NSString)
|
|
7
|
+
RCT_EXPORT_VIEW_PROPERTY(disabled, BOOL)
|
|
8
|
+
RCT_EXPORT_VIEW_PROPERTY(onHeightChange, RCTDirectEventBlock)
|
|
9
|
+
@end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
|
|
3
|
+
@objc(StripeCurrencySelectorElementManager)
|
|
4
|
+
class StripeCurrencySelectorElementManager: RCTViewManager {
|
|
5
|
+
override static func requiresMainQueueSetup() -> Bool {
|
|
6
|
+
return true
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
override func view() -> UIView! {
|
|
10
|
+
return StripeCurrencySelectorElementContainerView(frame: .zero)
|
|
11
|
+
}
|
|
12
|
+
}
|