@stripe/stripe-react-native 0.63.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.
Files changed (285) hide show
  1. package/README.md +2 -2
  2. package/android/build.gradle +2 -2
  3. package/android/detekt/detekt-baseline.xml +81 -0
  4. package/android/detekt/detekt.gradle +45 -0
  5. package/android/detekt/detekt.yml +722 -0
  6. package/android/gradle.properties +4 -4
  7. package/android/src/main/java/com/reactnativestripesdk/AuBECSDebitFormView.kt +3 -1
  8. package/android/src/main/java/com/reactnativestripesdk/AuBECSDebitFormViewManager.kt +2 -1
  9. package/android/src/main/java/com/reactnativestripesdk/CardFieldView.kt +5 -1
  10. package/android/src/main/java/com/reactnativestripesdk/CurrencySelectorElementView.kt +26 -0
  11. package/android/src/main/java/com/reactnativestripesdk/CurrencySelectorElementViewManager.kt +42 -0
  12. package/android/src/main/java/com/reactnativestripesdk/EmbeddedPaymentElementView.kt +105 -49
  13. package/android/src/main/java/com/reactnativestripesdk/EmbeddedPaymentElementViewManager.kt +72 -12
  14. package/android/src/main/java/com/reactnativestripesdk/FinancialConnectionsSheetManager.kt +8 -4
  15. package/android/src/main/java/com/reactnativestripesdk/GooglePayButtonManager.kt +2 -1
  16. package/android/src/main/java/com/reactnativestripesdk/GooglePayButtonView.kt +26 -11
  17. package/android/src/main/java/com/reactnativestripesdk/GooglePayLauncherManager.kt +2 -1
  18. package/android/src/main/java/com/reactnativestripesdk/NavigationBarView.kt +14 -5
  19. package/android/src/main/java/com/reactnativestripesdk/PaymentElementConfig.kt +6 -2
  20. package/android/src/main/java/com/reactnativestripesdk/PaymentLauncherManager.kt +2 -2
  21. package/android/src/main/java/com/reactnativestripesdk/PaymentMethodCreateParamsFactory.kt +24 -1
  22. package/android/src/main/java/com/reactnativestripesdk/PaymentMethodMessagingElementConfig.kt +7 -4
  23. package/android/src/main/java/com/reactnativestripesdk/PaymentMethodMessagingElementViewManager.kt +2 -1
  24. package/android/src/main/java/com/reactnativestripesdk/PaymentOptionDisplayDataMapper.kt +8 -4
  25. package/android/src/main/java/com/reactnativestripesdk/PaymentSheetAppearance.kt +9 -3
  26. package/android/src/main/java/com/reactnativestripesdk/PaymentSheetManager.kt +110 -29
  27. package/android/src/main/java/com/reactnativestripesdk/StripeSdkModule.kt +256 -12
  28. package/android/src/main/java/com/reactnativestripesdk/StripeSdkPackage.kt +6 -5
  29. package/android/src/main/java/com/reactnativestripesdk/addresssheet/AddressLauncherManager.kt +2 -1
  30. package/android/src/main/java/com/reactnativestripesdk/addresssheet/AddressSheetView.kt +3 -1
  31. package/android/src/main/java/com/reactnativestripesdk/customersheet/CustomerSheetManager.kt +6 -2
  32. package/android/src/main/java/com/reactnativestripesdk/customersheet/ReactNativeCustomerAdapter.kt +3 -1
  33. package/android/src/main/java/com/reactnativestripesdk/customersheet/ReactNativeCustomerSessionProvider.kt +2 -1
  34. package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/AddToWalletButtonManager.kt +2 -1
  35. package/android/src/main/java/com/reactnativestripesdk/utils/CheckoutAddressUpdate.kt +45 -0
  36. package/android/src/main/java/com/reactnativestripesdk/utils/CheckoutMappers.kt +101 -0
  37. package/android/src/main/java/com/reactnativestripesdk/utils/Errors.kt +4 -2
  38. package/android/src/main/java/com/reactnativestripesdk/utils/Extensions.kt +5 -1
  39. package/android/src/main/java/com/reactnativestripesdk/utils/Mappers.kt +31 -17
  40. package/android/src/main/java/com/reactnativestripesdk/utils/PostalCodeUtilities.kt +2 -1
  41. package/android/src/oldarch/java/com/facebook/react/viewmanagers/EmbeddedPaymentElementViewManagerDelegate.java +6 -0
  42. package/android/src/oldarch/java/com/facebook/react/viewmanagers/EmbeddedPaymentElementViewManagerInterface.java +2 -0
  43. package/android/src/oldarch/java/com/facebook/react/viewmanagers/StripeCurrencySelectorElementManagerDelegate.java +35 -0
  44. package/android/src/oldarch/java/com/facebook/react/viewmanagers/StripeCurrencySelectorElementManagerInterface.java +18 -0
  45. package/android/src/oldarch/java/com/reactnativestripesdk/NativeStripeSdkModuleSpec.java +44 -0
  46. package/android/src/onramp/java/com/reactnativestripesdk/OnrampMappers.kt +43 -0
  47. package/android/src/onramp/java/com/reactnativestripesdk/OnrampSdkModule.kt +5 -1
  48. package/android/src/test/java/com/reactnativestripesdk/PaymentMethodMessagingElementConfigTest.kt +3 -3
  49. package/android/src/test/java/com/reactnativestripesdk/mappers/MappersTest.kt +93 -0
  50. package/android/src/test/java/com/reactnativestripesdk/mappers/OnrampMappersTest.kt +336 -0
  51. package/android/src/test/java/com/reactnativestripesdk/mappers/PaymentOptionDisplayDataMapperTest.kt +9 -4
  52. package/android/src/test/java/com/reactnativestripesdk/utils/CheckoutMappersTest.kt +89 -0
  53. package/android/src/test/java/com/reactnativestripesdk/utils/CheckoutTestFixtures.java +49 -0
  54. package/ios/AddressSheet/AddressSheetUtils.swift +23 -0
  55. package/ios/AddressSheet/AddressSheetView.swift +9 -14
  56. package/ios/ConnectAccountOnboarding/ConnectAccountOnboardingViewController.swift +6 -8
  57. package/ios/CurrencySelectorElementManager.m +9 -0
  58. package/ios/CurrencySelectorElementManager.swift +12 -0
  59. package/ios/CurrencySelectorElementView.swift +24 -0
  60. package/ios/Mappers+Checkout.swift +193 -0
  61. package/ios/Mappers.swift +74 -5
  62. package/ios/NewArch/EmbeddedPaymentElementViewComponentView.mm +16 -2
  63. package/ios/NewArch/StripeCurrencySelectorElementComponentView.h +10 -0
  64. package/ios/NewArch/StripeCurrencySelectorElementComponentView.mm +75 -0
  65. package/ios/PaymentMethodFactory.swift +19 -0
  66. package/ios/PaymentMethodMessagingElementConfig.swift +6 -3
  67. package/ios/PaymentMethodMessagingElementView.swift +19 -0
  68. package/ios/StripeSdk-Bridging-Header.h +1 -0
  69. package/ios/StripeSdk.mm +124 -1
  70. package/ios/StripeSdkImpl+Checkout.swift +308 -0
  71. package/ios/StripeSdkImpl+Embedded.swift +108 -27
  72. package/ios/StripeSdkImpl+PaymentSheet.swift +18 -2
  73. package/ios/StripeSdkImpl.swift +41 -103
  74. package/ios/StripeSwiftInterop.h +1 -0
  75. package/jest/mock.js +16 -1
  76. package/lib/commonjs/components/AddToWalletButton.js +1 -1
  77. package/lib/commonjs/components/AddToWalletButton.js.map +1 -1
  78. package/lib/commonjs/components/AddressSheet.js +1 -1
  79. package/lib/commonjs/components/AddressSheet.js.map +1 -1
  80. package/lib/commonjs/components/AuBECSDebitForm.js +1 -1
  81. package/lib/commonjs/components/AuBECSDebitForm.js.map +1 -1
  82. package/lib/commonjs/components/CardField.js +1 -1
  83. package/lib/commonjs/components/CardField.js.map +1 -1
  84. package/lib/commonjs/components/CardForm.js +1 -1
  85. package/lib/commonjs/components/CardForm.js.map +1 -1
  86. package/lib/commonjs/components/CurrencySelectorElement.js +2 -0
  87. package/lib/commonjs/components/CurrencySelectorElement.js.map +1 -0
  88. package/lib/commonjs/components/PaymentMethodMessagingElement.js +2 -0
  89. package/lib/commonjs/components/PaymentMethodMessagingElement.js.map +1 -0
  90. package/lib/commonjs/components/PlatformPayButton.js +1 -1
  91. package/lib/commonjs/components/PlatformPayButton.js.map +1 -1
  92. package/lib/commonjs/components/StripeContainer.js +1 -1
  93. package/lib/commonjs/components/StripeContainer.js.map +1 -1
  94. package/lib/commonjs/components/StripeProvider.js +1 -1
  95. package/lib/commonjs/components/StripeProvider.js.map +1 -1
  96. package/lib/commonjs/connect/Components.js +1 -1
  97. package/lib/commonjs/connect/Components.js.map +1 -1
  98. package/lib/commonjs/connect/ConnectComponentsProvider.js +1 -1
  99. package/lib/commonjs/connect/ConnectComponentsProvider.js.map +1 -1
  100. package/lib/commonjs/connect/EmbeddedComponent.js +1 -1
  101. package/lib/commonjs/connect/EmbeddedComponent.js.map +1 -1
  102. package/lib/commonjs/connect/ModalCloseButton.js +1 -1
  103. package/lib/commonjs/connect/ModalCloseButton.js.map +1 -1
  104. package/lib/commonjs/connect/NavigationBar.js +1 -1
  105. package/lib/commonjs/connect/NavigationBar.js.map +1 -1
  106. package/lib/commonjs/connect/testUtils.js +1 -1
  107. package/lib/commonjs/connect/testUtils.js.map +1 -1
  108. package/lib/commonjs/events.js +1 -1
  109. package/lib/commonjs/events.js.map +1 -1
  110. package/lib/commonjs/functions.js +1 -1
  111. package/lib/commonjs/functions.js.map +1 -1
  112. package/lib/commonjs/helpers.js +1 -1
  113. package/lib/commonjs/hooks/useCheckout.js +2 -0
  114. package/lib/commonjs/hooks/useCheckout.js.map +1 -0
  115. package/lib/commonjs/hooks/useOnramp.js +1 -1
  116. package/lib/commonjs/hooks/useOnramp.js.map +1 -1
  117. package/lib/commonjs/index.js +1 -1
  118. package/lib/commonjs/index.js.map +1 -1
  119. package/lib/commonjs/specs/NativeAddToWalletButton.js +1 -1
  120. package/lib/commonjs/specs/NativeAddressSheet.js +1 -1
  121. package/lib/commonjs/specs/NativeApplePayButton.js +1 -1
  122. package/lib/commonjs/specs/NativeAuBECSDebitForm.js +1 -1
  123. package/lib/commonjs/specs/NativeCardField.js +1 -1
  124. package/lib/commonjs/specs/NativeCardField.js.map +1 -1
  125. package/lib/commonjs/specs/NativeCardForm.js +1 -1
  126. package/lib/commonjs/specs/NativeCardForm.js.map +1 -1
  127. package/lib/commonjs/specs/NativeConnectAccountOnboardingView.js +1 -1
  128. package/lib/commonjs/specs/NativeCurrencySelectorElement.js +2 -0
  129. package/lib/commonjs/specs/NativeCurrencySelectorElement.js.map +1 -0
  130. package/lib/commonjs/specs/NativeEmbeddedPaymentElement.js +1 -1
  131. package/lib/commonjs/specs/NativeEmbeddedPaymentElement.js.map +1 -1
  132. package/lib/commonjs/specs/NativeGooglePayButton.js +1 -1
  133. package/lib/commonjs/specs/NativeNavigationBar.js +1 -1
  134. package/lib/commonjs/specs/NativeOnrampSdkModule.js +1 -1
  135. package/lib/commonjs/specs/NativeOnrampSdkModule.js.map +1 -1
  136. package/lib/commonjs/specs/NativePaymentMethodMessagingElement.js +1 -1
  137. package/lib/commonjs/specs/NativePaymentMethodMessagingElement.js.map +1 -1
  138. package/lib/commonjs/specs/NativeStripeContainer.js +1 -1
  139. package/lib/commonjs/specs/NativeStripeSdkModule.js.map +1 -1
  140. package/lib/commonjs/types/Checkout.js +2 -0
  141. package/lib/commonjs/types/Checkout.js.map +1 -0
  142. package/lib/commonjs/types/EmbeddedPaymentElement.js +1 -1
  143. package/lib/commonjs/types/EmbeddedPaymentElement.js.map +1 -1
  144. package/lib/commonjs/types/Onramp.js.map +1 -1
  145. package/lib/commonjs/types/PaymentIntent.js.map +1 -1
  146. package/lib/commonjs/types/PaymentSheet.js.map +1 -1
  147. package/lib/module/components/AddToWalletButton.js +1 -1
  148. package/lib/module/components/AddToWalletButton.js.map +1 -1
  149. package/lib/module/components/AddressSheet.js +1 -1
  150. package/lib/module/components/AddressSheet.js.map +1 -1
  151. package/lib/module/components/AuBECSDebitForm.js +1 -1
  152. package/lib/module/components/AuBECSDebitForm.js.map +1 -1
  153. package/lib/module/components/CardField.js +1 -1
  154. package/lib/module/components/CardField.js.map +1 -1
  155. package/lib/module/components/CardForm.js +1 -1
  156. package/lib/module/components/CardForm.js.map +1 -1
  157. package/lib/module/components/CurrencySelectorElement.js +2 -0
  158. package/lib/module/components/CurrencySelectorElement.js.map +1 -0
  159. package/lib/module/components/PaymentMethodMessagingElement.js +2 -0
  160. package/lib/module/components/PaymentMethodMessagingElement.js.map +1 -0
  161. package/lib/module/components/PlatformPayButton.js +1 -1
  162. package/lib/module/components/PlatformPayButton.js.map +1 -1
  163. package/lib/module/components/StripeContainer.js +1 -1
  164. package/lib/module/components/StripeContainer.js.map +1 -1
  165. package/lib/module/components/StripeProvider.js +1 -1
  166. package/lib/module/components/StripeProvider.js.map +1 -1
  167. package/lib/module/connect/Components.js +1 -1
  168. package/lib/module/connect/Components.js.map +1 -1
  169. package/lib/module/connect/ConnectComponentsProvider.js +1 -1
  170. package/lib/module/connect/ConnectComponentsProvider.js.map +1 -1
  171. package/lib/module/connect/EmbeddedComponent.js +1 -1
  172. package/lib/module/connect/EmbeddedComponent.js.map +1 -1
  173. package/lib/module/connect/ModalCloseButton.js +1 -1
  174. package/lib/module/connect/ModalCloseButton.js.map +1 -1
  175. package/lib/module/connect/NavigationBar.js +1 -1
  176. package/lib/module/connect/NavigationBar.js.map +1 -1
  177. package/lib/module/connect/testUtils.js +1 -1
  178. package/lib/module/connect/testUtils.js.map +1 -1
  179. package/lib/module/events.js +1 -1
  180. package/lib/module/events.js.map +1 -1
  181. package/lib/module/functions.js +1 -1
  182. package/lib/module/functions.js.map +1 -1
  183. package/lib/module/helpers.js +1 -1
  184. package/lib/module/hooks/useCheckout.js +2 -0
  185. package/lib/module/hooks/useCheckout.js.map +1 -0
  186. package/lib/module/hooks/useOnramp.js +1 -1
  187. package/lib/module/hooks/useOnramp.js.map +1 -1
  188. package/lib/module/index.js +1 -1
  189. package/lib/module/index.js.map +1 -1
  190. package/lib/module/specs/NativeAddToWalletButton.js +1 -1
  191. package/lib/module/specs/NativeAddressSheet.js +1 -1
  192. package/lib/module/specs/NativeApplePayButton.js +1 -1
  193. package/lib/module/specs/NativeAuBECSDebitForm.js +1 -1
  194. package/lib/module/specs/NativeCardField.js +1 -1
  195. package/lib/module/specs/NativeCardField.js.map +1 -1
  196. package/lib/module/specs/NativeCardForm.js +1 -1
  197. package/lib/module/specs/NativeCardForm.js.map +1 -1
  198. package/lib/module/specs/NativeConnectAccountOnboardingView.js +1 -1
  199. package/lib/module/specs/NativeCurrencySelectorElement.js +2 -0
  200. package/lib/module/specs/NativeCurrencySelectorElement.js.map +1 -0
  201. package/lib/module/specs/NativeEmbeddedPaymentElement.js +1 -1
  202. package/lib/module/specs/NativeEmbeddedPaymentElement.js.map +1 -1
  203. package/lib/module/specs/NativeGooglePayButton.js +1 -1
  204. package/lib/module/specs/NativeNavigationBar.js +1 -1
  205. package/lib/module/specs/NativeOnrampSdkModule.js +1 -1
  206. package/lib/module/specs/NativeOnrampSdkModule.js.map +1 -1
  207. package/lib/module/specs/NativePaymentMethodMessagingElement.js +1 -1
  208. package/lib/module/specs/NativePaymentMethodMessagingElement.js.map +1 -1
  209. package/lib/module/specs/NativeStripeContainer.js +1 -1
  210. package/lib/module/specs/NativeStripeSdkModule.js.map +1 -1
  211. package/lib/module/types/Checkout.js +2 -0
  212. package/lib/module/types/Checkout.js.map +1 -0
  213. package/lib/module/types/EmbeddedPaymentElement.js +1 -1
  214. package/lib/module/types/EmbeddedPaymentElement.js.map +1 -1
  215. package/lib/module/types/Onramp.js.map +1 -1
  216. package/lib/module/types/PaymentIntent.js.map +1 -1
  217. package/lib/module/types/PaymentSheet.js.map +1 -1
  218. package/lib/typescript/src/components/CurrencySelectorElement.d.ts +62 -0
  219. package/lib/typescript/src/components/CurrencySelectorElement.d.ts.map +1 -0
  220. package/lib/typescript/src/components/PaymentMethodMessagingElement.d.ts +41 -0
  221. package/lib/typescript/src/components/PaymentMethodMessagingElement.d.ts.map +1 -0
  222. package/lib/typescript/src/connect/testUtils.d.ts +4 -0
  223. package/lib/typescript/src/connect/testUtils.d.ts.map +1 -1
  224. package/lib/typescript/src/events.d.ts +11 -0
  225. package/lib/typescript/src/events.d.ts.map +1 -1
  226. package/lib/typescript/src/functions.d.ts +2 -0
  227. package/lib/typescript/src/functions.d.ts.map +1 -1
  228. package/lib/typescript/src/hooks/useCheckout.d.ts +21 -0
  229. package/lib/typescript/src/hooks/useCheckout.d.ts.map +1 -0
  230. package/lib/typescript/src/hooks/useOnramp.d.ts +9 -3
  231. package/lib/typescript/src/hooks/useOnramp.d.ts.map +1 -1
  232. package/lib/typescript/src/index.d.ts +3 -0
  233. package/lib/typescript/src/index.d.ts.map +1 -1
  234. package/lib/typescript/src/specs/NativeCurrencySelectorElement.d.ts +25 -0
  235. package/lib/typescript/src/specs/NativeCurrencySelectorElement.d.ts.map +1 -0
  236. package/lib/typescript/src/specs/NativeEmbeddedPaymentElement.d.ts +5 -1
  237. package/lib/typescript/src/specs/NativeEmbeddedPaymentElement.d.ts.map +1 -1
  238. package/lib/typescript/src/specs/NativeOnrampSdkModule.d.ts +1 -1
  239. package/lib/typescript/src/specs/NativeOnrampSdkModule.d.ts.map +1 -1
  240. package/lib/typescript/src/specs/NativePaymentMethodMessagingElement.d.ts +1 -6
  241. package/lib/typescript/src/specs/NativePaymentMethodMessagingElement.d.ts.map +1 -1
  242. package/lib/typescript/src/specs/NativeStripeSdkModule.d.ts +19 -2
  243. package/lib/typescript/src/specs/NativeStripeSdkModule.d.ts.map +1 -1
  244. package/lib/typescript/src/types/Checkout.d.ts +336 -0
  245. package/lib/typescript/src/types/Checkout.d.ts.map +1 -0
  246. package/lib/typescript/src/types/EmbeddedPaymentElement.d.ts +36 -1
  247. package/lib/typescript/src/types/EmbeddedPaymentElement.d.ts.map +1 -1
  248. package/lib/typescript/src/types/NextAction.d.ts +8 -1
  249. package/lib/typescript/src/types/NextAction.d.ts.map +1 -1
  250. package/lib/typescript/src/types/Onramp.d.ts +40 -1
  251. package/lib/typescript/src/types/Onramp.d.ts.map +1 -1
  252. package/lib/typescript/src/types/PaymentIntent.d.ts +11 -1
  253. package/lib/typescript/src/types/PaymentIntent.d.ts.map +1 -1
  254. package/lib/typescript/src/types/PaymentMethod.d.ts +10 -6
  255. package/lib/typescript/src/types/PaymentMethod.d.ts.map +1 -1
  256. package/lib/typescript/src/types/PaymentSheet.d.ts +22 -6
  257. package/lib/typescript/src/types/PaymentSheet.d.ts.map +1 -1
  258. package/lib/typescript/src/types/components/PaymentMethodMessagingElementComponent.d.ts +16 -1
  259. package/lib/typescript/src/types/components/PaymentMethodMessagingElementComponent.d.ts.map +1 -1
  260. package/package.json +21 -7
  261. package/src/components/CurrencySelectorElement.tsx +95 -0
  262. package/src/components/PaymentMethodMessagingElement.tsx +109 -0
  263. package/src/components/StripeProvider.tsx +1 -1
  264. package/src/connect/testUtils.ts +2 -0
  265. package/src/events.ts +20 -3
  266. package/src/functions.ts +31 -2
  267. package/src/hooks/useCheckout.tsx +207 -0
  268. package/src/hooks/useOnramp.tsx +45 -24
  269. package/src/index.tsx +4 -0
  270. package/src/specs/NativeCurrencySelectorElement.ts +35 -0
  271. package/src/specs/NativeEmbeddedPaymentElement.ts +12 -2
  272. package/src/specs/NativeOnrampSdkModule.ts +1 -1
  273. package/src/specs/NativePaymentMethodMessagingElement.ts +0 -7
  274. package/src/specs/NativeStripeSdkModule.ts +61 -2
  275. package/src/types/Checkout.ts +377 -0
  276. package/src/types/EmbeddedPaymentElement.tsx +117 -26
  277. package/src/types/NextAction.ts +9 -0
  278. package/src/types/Onramp.ts +45 -1
  279. package/src/types/PaymentIntent.ts +10 -0
  280. package/src/types/PaymentMethod.ts +9 -6
  281. package/src/types/PaymentSheet.ts +29 -6
  282. package/src/types/components/PaymentMethodMessagingElementComponent.tsx +17 -1
  283. package/stripe-react-native.podspec +8 -8
  284. package/android/spotless.gradle +0 -19
  285. package/android/src/main/java/com/reactnativestripesdk/FakeOnrampSdkModule.kt +0 -155
@@ -0,0 +1,101 @@
1
+ package com.reactnativestripesdk.utils
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableArray
5
+ import com.facebook.react.bridge.WritableMap
6
+ import com.stripe.android.checkout.Checkout
7
+ import com.stripe.android.checkout.CheckoutSession
8
+ import com.stripe.android.paymentelement.CheckoutSessionPreview
9
+
10
+ @OptIn(CheckoutSessionPreview::class)
11
+ internal fun mapFromCheckoutState(checkout: Checkout): WritableMap =
12
+ mapFromCheckoutState(
13
+ isLoading = checkout.isLoading.value,
14
+ session = checkout.checkoutSession.value,
15
+ )
16
+
17
+ @OptIn(CheckoutSessionPreview::class)
18
+ internal fun mapFromCheckoutState(
19
+ isLoading: Boolean,
20
+ session: CheckoutSession,
21
+ ): WritableMap =
22
+ Arguments.createMap().apply {
23
+ putString("status", if (isLoading) "loading" else "loaded")
24
+ putMap("session", mapFromCheckoutSession(session))
25
+ }
26
+
27
+ @OptIn(CheckoutSessionPreview::class)
28
+ private fun mapFromCheckoutSession(
29
+ session: CheckoutSession,
30
+ ): WritableMap =
31
+ Arguments.createMap().apply {
32
+ putString("id", session.id)
33
+ // TODO(CheckoutSessionsPreview): Populate from public Android checkout fields once
34
+ // stripe-android exposes status, paymentStatus, and livemode on CheckoutSession.
35
+ putString("status", "unknown")
36
+ putString("paymentStatus", "unknown")
37
+ putBoolean("livemode", false)
38
+
39
+ if (session.currency.isNotBlank()) {
40
+ putString("currency", session.currency)
41
+ }
42
+
43
+ session.totalSummary?.let { putMap("totals", mapFromCheckoutTotals(it)) }
44
+ putArray("lineItems", mapFromCheckoutLineItems(session))
45
+ putArray("shippingOptions", mapFromCheckoutShippingOptions(session))
46
+
47
+ // TODO(CheckoutSessionsPreview): Populate top-level discounts once stripe-android
48
+ // exposes them directly instead of only exposing TotalSummary.discountAmounts.
49
+ putArray("discounts", Arguments.createArray())
50
+
51
+ // TODO(CheckoutSessionsPreview): Populate customerId, customerEmail, billingAddress,
52
+ // and shippingAddress once stripe-android exposes them on public checkout models.
53
+ }
54
+
55
+ @OptIn(CheckoutSessionPreview::class)
56
+ private fun mapFromCheckoutTotals(totals: CheckoutSession.TotalSummary): WritableMap {
57
+ val taxTotal = totals.taxAmounts.sumOf { it.amount }
58
+
59
+ return Arguments.createMap().apply {
60
+ putDouble("subtotal", totals.subtotal.toDouble())
61
+ putDouble("total", totals.totalAmountDue.toDouble())
62
+ putDouble("due", totals.totalDueToday.toDouble())
63
+ // TODO(CheckoutSessionsPreview): Populate the top-level discount total once the
64
+ // Android TotalSummary model exposes it directly.
65
+ putDouble("discount", 0.0)
66
+ putDouble("shipping", (totals.shippingRate?.amount ?: 0L).toDouble())
67
+ putDouble("tax", taxTotal.toDouble())
68
+ }
69
+ }
70
+
71
+ @OptIn(CheckoutSessionPreview::class)
72
+ private fun mapFromCheckoutLineItems(session: CheckoutSession): WritableArray =
73
+ Arguments.createArray().apply {
74
+ session.lineItems.forEach { item ->
75
+ pushMap(
76
+ Arguments.createMap().apply {
77
+ putString("id", item.id)
78
+ putString("name", item.name)
79
+ putInt("quantity", item.quantity)
80
+ putDouble("unitAmount", (item.unitAmount ?: 0L).toDouble())
81
+ putString("currency", session.currency)
82
+ },
83
+ )
84
+ }
85
+ }
86
+
87
+ @OptIn(CheckoutSessionPreview::class)
88
+ private fun mapFromCheckoutShippingOptions(session: CheckoutSession): WritableArray =
89
+ Arguments.createArray().apply {
90
+ session.shippingOptions.forEach { option ->
91
+ pushMap(
92
+ Arguments.createMap().apply {
93
+ putString("id", option.id)
94
+ putString("displayName", option.displayName)
95
+ putDouble("amount", option.amount.toDouble())
96
+ putString("currency", session.currency)
97
+ option.deliveryEstimate?.let { putString("deliveryEstimate", it) }
98
+ },
99
+ )
100
+ }
101
+ }
@@ -186,14 +186,16 @@ internal fun createError(
186
186
  return mapError(code, error.message, error.localizedMessage, null, null, null)
187
187
  }
188
188
 
189
- internal fun createCanceledError(message: String? = null): WritableMap = createError(ErrorType.Canceled.toString(), message)
189
+ internal fun createCanceledError(message: String? = null): WritableMap =
190
+ createError(ErrorType.Canceled.toString(), message)
190
191
 
191
192
  internal fun createFailedError(error: Throwable): WritableMap = createError(ErrorType.Failed.toString(), error)
192
193
 
193
194
  internal fun createMissingInitError(): WritableMap =
194
195
  createError(
195
196
  ErrorType.Failed.toString(),
196
- "Stripe has not been initialized. Initialize Stripe in your app with the StripeProvider component or the initStripe method.",
197
+ "Stripe has not been initialized. Initialize Stripe in your app with the StripeProvider component " +
198
+ "or the initStripe method.",
197
199
  )
198
200
 
199
201
  internal fun createOnrampNotConfiguredError(): WritableMap =
@@ -27,7 +27,11 @@ fun View.hideSoftKeyboard() {
27
27
  fun ReadableMap?.getBooleanOr(
28
28
  key: String,
29
29
  default: Boolean,
30
- ): Boolean = if (this?.hasKey(key) == true && this.getType(key) == ReadableType.Boolean) this.getBoolean(key) else default
30
+ ): Boolean = if (this?.hasKey(key) == true && this.getType(key) == ReadableType.Boolean) {
31
+ this.getBoolean(key)
32
+ } else {
33
+ default
34
+ }
31
35
 
32
36
  fun ReadableMap?.getIntOrNull(key: String): Int? =
33
37
  if (this?.hasKey(key) == true && this.getType(key) == ReadableType.Number) this.getInt(key) else null
@@ -140,10 +140,10 @@ internal fun mapPaymentMethodType(type: PaymentMethod.Type?): String =
140
140
  PaymentMethod.Type.GrabPay -> "GrabPay"
141
141
  PaymentMethod.Type.Ideal -> "Ideal"
142
142
  PaymentMethod.Type.Netbanking -> "Netbanking"
143
+ PaymentMethod.Type.Multibanco -> "Multibanco"
143
144
  PaymentMethod.Type.Oxxo -> "Oxxo"
144
145
  PaymentMethod.Type.P24 -> "P24"
145
146
  PaymentMethod.Type.SepaDebit -> "SepaDebit"
146
- PaymentMethod.Type.Upi -> "Upi"
147
147
  PaymentMethod.Type.WeChatPay -> "WeChatPay"
148
148
  PaymentMethod.Type.Klarna -> "Klarna"
149
149
  PaymentMethod.Type.USBankAccount -> "USBankAccount"
@@ -171,10 +171,10 @@ internal fun mapToPaymentMethodType(type: String?): PaymentMethod.Type? =
171
171
  "Fpx" -> PaymentMethod.Type.Fpx
172
172
  "GrabPay" -> PaymentMethod.Type.GrabPay
173
173
  "Netbanking" -> PaymentMethod.Type.Netbanking
174
+ "Multibanco" -> PaymentMethod.Type.Multibanco
174
175
  "Oxxo" -> PaymentMethod.Type.Oxxo
175
176
  "P24" -> PaymentMethod.Type.P24
176
177
  "SepaDebit" -> PaymentMethod.Type.SepaDebit
177
- "Upi" -> PaymentMethod.Type.Upi
178
178
  "WeChatPay" -> PaymentMethod.Type.WeChatPay
179
179
  "Klarna" -> PaymentMethod.Type.Klarna
180
180
  "USBankAccount" -> PaymentMethod.Type.USBankAccount
@@ -205,7 +205,9 @@ internal fun mapFromBillingDetails(billingDatails: PaymentMethod.BillingDetails?
205
205
  return details
206
206
  }
207
207
 
208
- internal fun mapFromPaymentSheetBillingDetails(billing: com.stripe.android.paymentsheet.PaymentSheet.BillingDetails?): WritableMap {
208
+ internal fun mapFromPaymentSheetBillingDetails(
209
+ billing: com.stripe.android.paymentsheet.PaymentSheet.BillingDetails?
210
+ ): WritableMap {
209
211
  val details = Arguments.createMap()
210
212
  details.putString("name", billing?.name)
211
213
  details.putString("email", billing?.email)
@@ -434,7 +436,6 @@ internal fun mapFromPaymentMethod(paymentMethod: PaymentMethod): WritableMap {
434
436
  it.putString("bank", paymentMethod.fpx?.bank)
435
437
  },
436
438
  )
437
- pm.putMap("Upi", Arguments.createMap().also { it.putString("vpa", paymentMethod.upi?.vpa) })
438
439
  pm.putMap(
439
440
  "USBankAccount",
440
441
  Arguments.createMap().also {
@@ -558,7 +559,6 @@ internal fun mapNextAction(
558
559
  NextActionType.CashAppRedirect,
559
560
  NextActionType.BlikAuthorize,
560
561
  NextActionType.UseStripeSdk,
561
- NextActionType.UpiAwaitNotification,
562
562
  NextActionType.DisplayPayNowDetails,
563
563
  NextActionType.DisplayPromptPayDetails,
564
564
  null,
@@ -714,7 +714,7 @@ internal fun mapToShippingDetails(shippingDetails: ReadableMap?): ConfirmPayment
714
714
  )
715
715
  }
716
716
 
717
- private fun convertToUnixTimestamp(timestamp: Long): String = (timestamp * 1000).toString()
717
+ private fun convertToUnixTimestamp(timestamp: Long): String = (timestamp * SECONDS_TO_MILLIS).toString()
718
718
 
719
719
  fun mapToUICustomization(params: ReadableMap): PaymentAuthConfig.Stripe3ds2UiCustomization {
720
720
  val labelCustomization = params.getMap("label")
@@ -966,15 +966,15 @@ internal fun mapToPreferredNetworks(networksAsInts: List<Int>?): List<CardBrand>
966
966
 
967
967
  val intToCardBrand =
968
968
  mapOf(
969
- 0 to CardBrand.JCB,
970
- 1 to CardBrand.AmericanExpress,
971
- 2 to CardBrand.CartesBancaires,
972
- 3 to CardBrand.DinersClub,
973
- 4 to CardBrand.Discover,
974
- 5 to CardBrand.MasterCard,
975
- 6 to CardBrand.UnionPay,
976
- 7 to CardBrand.Visa,
977
- 8 to CardBrand.Unknown,
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,
978
978
  )
979
979
 
980
980
  return networksAsInts.mapNotNull { intToCardBrand[it] }
@@ -1036,7 +1036,9 @@ private fun Map<String, Any?>.toReadableMap(): ReadableMap {
1036
1036
  }
1037
1037
 
1038
1038
  @SuppressLint("RestrictedApi")
1039
- internal fun parseCustomPaymentMethods(customPaymentMethodConfig: ReadableMap?): List<PaymentSheet.CustomPaymentMethod> {
1039
+ internal fun parseCustomPaymentMethods(
1040
+ customPaymentMethodConfig: ReadableMap?
1041
+ ): List<PaymentSheet.CustomPaymentMethod> {
1040
1042
  if (customPaymentMethodConfig == null) {
1041
1043
  return emptyList()
1042
1044
  }
@@ -1049,7 +1051,8 @@ internal fun parseCustomPaymentMethods(customPaymentMethodConfig: ReadableMap?):
1049
1051
  val id = customPaymentMethodMap.getString("id")
1050
1052
  if (id != null) {
1051
1053
  val subtitle = customPaymentMethodMap.getString("subtitle")
1052
- val disableBillingDetailCollection = customPaymentMethodMap.getBooleanOr("disableBillingDetailCollection", false)
1054
+ val disableBillingDetailCollection = customPaymentMethodMap
1055
+ .getBooleanOr("disableBillingDetailCollection", false)
1053
1056
  result.add(
1054
1057
  PaymentSheet.CustomPaymentMethod(
1055
1058
  id = id,
@@ -1192,3 +1195,14 @@ fun readableArrayOf(vararg elements: Any?): ReadableArray =
1192
1195
  }
1193
1196
  }
1194
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 = Character.isLetterOrDigit(c) || c.isWhitespace() || c == '-'
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);
@@ -4,8 +4,10 @@ package com.reactnativestripesdk
4
4
 
5
5
  import android.annotation.SuppressLint
6
6
  import androidx.compose.ui.graphics.Color
7
+ import com.facebook.react.bridge.Arguments
7
8
  import com.facebook.react.bridge.ReadableMap
8
9
  import com.stripe.android.crypto.onramp.ExperimentalCryptoOnramp
10
+ import com.stripe.android.crypto.onramp.model.KycInfo
9
11
  import com.stripe.android.crypto.onramp.model.OnrampConfiguration
10
12
  import com.stripe.android.crypto.onramp.model.PaymentMethodDisplayData
11
13
  import com.stripe.android.googlepaylauncher.GooglePayEnvironment
@@ -14,6 +16,8 @@ import com.stripe.android.link.LinkAppearance
14
16
  import com.stripe.android.link.LinkAppearance.Colors
15
17
  import com.stripe.android.link.LinkAppearance.PrimaryButton
16
18
  import com.stripe.android.link.LinkAppearance.Style
19
+ import com.stripe.android.model.DateOfBirth
20
+ import com.stripe.android.paymentsheet.PaymentSheet
17
21
 
18
22
  @SuppressLint("RestrictedApi")
19
23
  internal fun mapConfig(
@@ -50,6 +54,8 @@ internal fun mapGooglePayConfig(params: ReadableMap?): GooglePayPaymentMethodLau
50
54
  val merchantName = params.getString("merchantName") ?: return null
51
55
  val existingPaymentMethodRequired =
52
56
  params.hasKey("existingPaymentMethodRequired") && params.getBoolean("existingPaymentMethodRequired")
57
+ val isEmailRequired = if (params.hasKey("isEmailRequired")) params.getBoolean("isEmailRequired") else false
58
+ val allowCreditCards = if (params.hasKey("allowCreditCards")) params.getBoolean("allowCreditCards") else true
53
59
 
54
60
  val billingAddressConfig =
55
61
  mapGooglePayBillingAddressConfig(params.getMap("billingAddressConfig"))
@@ -58,6 +64,8 @@ internal fun mapGooglePayConfig(params: ReadableMap?): GooglePayPaymentMethodLau
58
64
  environment = if (testEnv) GooglePayEnvironment.Test else GooglePayEnvironment.Production,
59
65
  merchantCountryCode = merchantCountryCode,
60
66
  merchantName = merchantName,
67
+ isEmailRequired = isEmailRequired,
68
+ allowCreditCards = allowCreditCards,
61
69
  billingAddressConfig = billingAddressConfig,
62
70
  existingPaymentMethodRequired = existingPaymentMethodRequired,
63
71
  )
@@ -159,3 +167,38 @@ internal fun mapPaymentDetailsType(type: PaymentMethodDisplayData.Type): String
159
167
  PaymentMethodDisplayData.Type.BankAccount -> "BankAccount"
160
168
  PaymentMethodDisplayData.Type.GooglePay -> "GooglePay"
161
169
  }
170
+
171
+ @OptIn(ExperimentalCryptoOnramp::class)
172
+ @SuppressLint("RestrictedApi")
173
+ internal fun mapFromKycInfo(kycInfo: KycInfo): ReadableMap {
174
+ val result = Arguments.createMap()
175
+
176
+ kycInfo.firstName?.let { result.putString("firstName", it) }
177
+ kycInfo.lastName?.let { result.putString("lastName", it) }
178
+ kycInfo.idNumber?.let { result.putString("idNumber", it) }
179
+ kycInfo.address?.let { result.putMap("address", mapFromKycAddress(it)) }
180
+ kycInfo.dateOfBirth?.let { result.putMap("dateOfBirth", mapFromDateOfBirth(it)) }
181
+
182
+ return result
183
+ }
184
+
185
+ private fun mapFromKycAddress(address: PaymentSheet.Address): ReadableMap {
186
+ val result = Arguments.createMap()
187
+
188
+ address.city?.let { result.putString("city", it) }
189
+ address.country?.let { result.putString("country", it) }
190
+ address.line1?.let { result.putString("line1", it) }
191
+ address.line2?.let { result.putString("line2", it) }
192
+ address.postalCode?.let { result.putString("postalCode", it) }
193
+ address.state?.let { result.putString("state", it) }
194
+
195
+ return result
196
+ }
197
+
198
+ private fun mapFromDateOfBirth(dateOfBirth: DateOfBirth): ReadableMap {
199
+ val result = Arguments.createMap()
200
+ result.putInt("day", dateOfBirth.day)
201
+ result.putInt("month", dateOfBirth.month)
202
+ result.putInt("year", dateOfBirth.year)
203
+ return result
204
+ }
@@ -418,6 +418,7 @@ class OnrampSdkModule(
418
418
  }
419
419
  val currencyCode = googlePayParams.getString("currencyCode") ?: ""
420
420
  val amount = googlePayParams.getDouble("amount").toLong()
421
+
421
422
  val transactionId = googlePayParams.getString("transactionId")
422
423
  val label = googlePayParams.getString("label")
423
424
 
@@ -722,7 +723,10 @@ class OnrampSdkModule(
722
723
  result.displayData.sublabel?.let { displayData.putString("sublabel", it) }
723
724
  displayData.putString("type", mapPaymentDetailsType(result.displayData.type))
724
725
 
725
- promise.resolve(createResult("displayData", displayData))
726
+ val map = Arguments.createMap()
727
+ map.putMap("displayData", displayData)
728
+ result.kycInfo?.let { map.putMap("kycInfo", mapFromKycInfo(it)) }
729
+ promise.resolve(map)
726
730
  }
727
731
  }
728
732
 
@@ -404,7 +404,7 @@ class PaymentMethodMessagingElementConfigTest {
404
404
  readableMapOf(
405
405
  "font" to
406
406
  readableMapOf(
407
- "scale" to 1.5,
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((16 * 1.5).toFloat())
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
- "scale" to 1.2,
436
+ "size" to 20,
437
437
  ),
438
438
  )
439
439
 
@@ -2,14 +2,20 @@ 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
7
+ import com.reactnativestripesdk.utils.mapNextAction
8
+ import com.reactnativestripesdk.utils.mapPaymentMethodType
6
9
  import com.reactnativestripesdk.utils.mapToAddress
7
10
  import com.reactnativestripesdk.utils.mapToBillingDetails
11
+ import com.reactnativestripesdk.utils.mapToPaymentMethodType
8
12
  import com.reactnativestripesdk.utils.mapToPreferredNetworks
9
13
  import com.reactnativestripesdk.utils.parseCustomPaymentMethods
10
14
  import com.reactnativestripesdk.utils.readableArrayOf
11
15
  import com.reactnativestripesdk.utils.readableMapOf
12
16
  import com.stripe.android.model.CardBrand
17
+ import com.stripe.android.model.PaymentMethod
18
+ import com.stripe.android.model.StripeIntent
13
19
  import org.junit.Assert
14
20
  import org.junit.Assert.assertEquals
15
21
  import org.junit.Assert.assertFalse
@@ -80,6 +86,34 @@ class MappersTest {
80
86
  Assert.assertNull(details?.getMap("token"))
81
87
  }
82
88
 
89
+ @Test
90
+ fun mapPaymentMethodType_Multibanco_ReturnsString() {
91
+ assertEquals("Multibanco", mapPaymentMethodType(PaymentMethod.Type.Multibanco))
92
+ }
93
+
94
+ @Test
95
+ fun mapToPaymentMethodType_Multibanco_ReturnsType() {
96
+ assertEquals(PaymentMethod.Type.Multibanco, mapToPaymentMethodType("Multibanco"))
97
+ }
98
+
99
+ @Test
100
+ fun mapNextAction_DisplayMultibancoDetails_ReturnsVoucherUrl() {
101
+ val result =
102
+ mapNextAction(
103
+ StripeIntent.NextActionType.DisplayMultibancoDetails,
104
+ StripeIntent.NextActionData.DisplayMultibancoDetails(
105
+ hostedVoucherUrl = "https://payments.stripe.com/multibanco/voucher",
106
+ ),
107
+ )
108
+
109
+ assertNotNull(result)
110
+ assertEquals("multibanco", result?.getString("type"))
111
+ assertEquals(
112
+ "https://payments.stripe.com/multibanco/voucher",
113
+ result?.getString("voucherURL"),
114
+ )
115
+ }
116
+
83
117
  // ============================================
84
118
  // mapToPreferredNetworks Tests
85
119
  // ============================================
@@ -315,6 +349,65 @@ class MappersTest {
315
349
  assertEquals("cpmt_valid", result[0].id)
316
350
  }
317
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
+
318
411
  // ============================================
319
412
  // mapToAddress Tests
320
413
  // ============================================