@stripe/stripe-react-native 0.56.0 → 0.57.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 (328) hide show
  1. package/android/build.gradle +76 -118
  2. package/android/gradle.properties +1 -1
  3. package/android/settings.gradle +2 -0
  4. package/android/spotless.gradle +1 -1
  5. package/android/src/main/java/com/reactnativestripesdk/AuBECSDebitFormView.kt +24 -20
  6. package/android/src/main/java/com/reactnativestripesdk/CardFieldView.kt +20 -17
  7. package/android/src/main/java/com/reactnativestripesdk/CardFormView.kt +28 -32
  8. package/android/src/main/java/com/reactnativestripesdk/{CollectBankAccountLauncherFragment.kt → CollectBankAccountLauncherManager.kt} +23 -44
  9. package/android/src/main/java/com/reactnativestripesdk/CustomPaymentMethodActivity.kt +2 -0
  10. package/android/src/main/java/com/reactnativestripesdk/EmbeddedPaymentElementView.kt +4 -11
  11. package/android/src/main/java/com/reactnativestripesdk/EmbeddedPaymentElementViewManager.kt +52 -132
  12. package/android/src/main/java/com/reactnativestripesdk/EventEmitterCompat.kt +0 -8
  13. package/android/src/main/java/com/reactnativestripesdk/FakeOnrampSdkModule.kt +154 -0
  14. package/android/src/main/java/com/reactnativestripesdk/{FinancialConnectionsSheetFragment.kt → FinancialConnectionsSheetManager.kt} +43 -92
  15. package/android/src/main/java/com/reactnativestripesdk/GooglePayButtonView.kt +1 -1
  16. package/android/src/main/java/com/reactnativestripesdk/GooglePayLauncherManager.kt +107 -0
  17. package/android/src/main/java/com/reactnativestripesdk/GooglePayPaymentMethodLauncherManager.kt +37 -0
  18. package/android/src/main/java/com/reactnativestripesdk/GooglePayRequestHelper.kt +7 -5
  19. package/android/src/main/java/com/reactnativestripesdk/NavigationBarManager.kt +31 -0
  20. package/android/src/main/java/com/reactnativestripesdk/NavigationBarView.kt +120 -0
  21. package/android/src/main/java/com/reactnativestripesdk/PaymentElementConfig.kt +228 -0
  22. package/android/src/main/java/com/reactnativestripesdk/{PaymentLauncherFragment.kt → PaymentLauncherManager.kt} +40 -77
  23. package/android/src/main/java/com/reactnativestripesdk/PaymentMethodCreateParamsFactory.kt +11 -20
  24. package/android/src/main/java/com/reactnativestripesdk/PaymentOptionDisplayDataMapper.kt +4 -6
  25. package/android/src/main/java/com/reactnativestripesdk/PaymentSheetAppearance.kt +409 -483
  26. package/android/src/main/java/com/reactnativestripesdk/{PaymentSheetFragment.kt → PaymentSheetManager.kt} +65 -300
  27. package/android/src/main/java/com/reactnativestripesdk/StripeAbstractComposeView.kt +53 -17
  28. package/android/src/main/java/com/reactnativestripesdk/StripeSdkModule.kt +227 -232
  29. package/android/src/main/java/com/reactnativestripesdk/StripeSdkPackage.kt +21 -2
  30. package/android/src/main/java/com/reactnativestripesdk/addresssheet/AddressLauncherManager.kt +78 -0
  31. package/android/src/main/java/com/reactnativestripesdk/addresssheet/AddressSheetView.kt +52 -39
  32. package/android/src/main/java/com/reactnativestripesdk/addresssheet/AddressSheetViewManager.kt +2 -2
  33. package/android/src/main/java/com/reactnativestripesdk/customersheet/{CustomerSheetFragment.kt → CustomerSheetManager.kt} +64 -99
  34. package/android/src/main/java/com/reactnativestripesdk/customersheet/ReactNativeCustomerSessionProvider.kt +2 -3
  35. package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/AddToWalletButtonManager.kt +5 -10
  36. package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/AddToWalletButtonView.kt +90 -77
  37. package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/TapAndPayProxy.kt +6 -4
  38. package/android/src/main/java/com/reactnativestripesdk/utils/Errors.kt +13 -3
  39. package/android/src/main/java/com/reactnativestripesdk/utils/Extensions.kt +87 -11
  40. package/android/src/main/java/com/reactnativestripesdk/utils/KeepJsAwakeTask.kt +1 -1
  41. package/android/src/main/java/com/reactnativestripesdk/utils/Mappers.kt +178 -185
  42. package/android/src/main/java/com/reactnativestripesdk/utils/StripeUIManager.kt +62 -0
  43. package/android/src/oldarch/java/com/reactnativestripesdk/NativeOnrampSdkModuleSpec.java +118 -0
  44. package/android/src/oldarch/java/com/reactnativestripesdk/NativeStripeSdkModuleSpec.java +4 -0
  45. package/android/src/onramp/java/com/reactnativestripesdk/OnrampSdkModule.kt +922 -0
  46. package/android/src/test/java/com/facebook/testutils/shadows/ShadowArguments.kt +29 -0
  47. package/android/src/test/java/com/reactnativestripesdk/EmbeddedPaymentElementViewManagerTest.kt +163 -0
  48. package/android/src/test/java/com/reactnativestripesdk/PaymentElementConfigTest.kt +976 -0
  49. package/android/src/test/java/com/reactnativestripesdk/PaymentSheetAppearanceTest.kt +801 -0
  50. package/android/src/test/java/com/reactnativestripesdk/PaymentSheetManagerTest.kt +523 -0
  51. package/android/src/test/java/com/reactnativestripesdk/addresssheet/AddressSheetViewTest.kt +551 -0
  52. package/android/src/test/java/com/reactnativestripesdk/mappers/MappersTest.kt +567 -0
  53. package/android/src/test/java/com/reactnativestripesdk/mappers/PaymentOptionDisplayDataMapperTest.kt +456 -0
  54. package/android/src/test/java/com/reactnativestripesdk/pushprovisioning/PushProvisioningProxyTest.kt +43 -0
  55. package/android/src/test/resources/robolectric.properties +2 -0
  56. package/ios/AddressSheet/AddressSheetUtils.swift +3 -3
  57. package/ios/AddressSheet/AddressSheetView.swift +26 -26
  58. package/ios/AddressSheet/AddressSheetViewManager.swift +2 -2
  59. package/ios/ApplePayButtonManager.swift +1 -1
  60. package/ios/ApplePayButtonView.swift +9 -10
  61. package/ios/ApplePayUtils.swift +51 -51
  62. package/ios/ApplePayViewController.swift +25 -29
  63. package/ios/AuBECSDebitFormManager.swift +1 -1
  64. package/ios/AuBECSDebitFormView.swift +13 -15
  65. package/ios/CardFieldManager.swift +4 -4
  66. package/ios/CardFieldView.swift +9 -9
  67. package/ios/CardFormManager.swift +3 -3
  68. package/ios/CardFormView.swift +28 -28
  69. package/ios/ConnectAccountOnboarding/ConnectAccountOnboardingView.swift +97 -0
  70. package/ios/ConnectAccountOnboarding/ConnectAccountOnboardingViewController.swift +133 -0
  71. package/ios/ConnectAccountOnboarding/ConnectAccountOnboardingViewManager.m +16 -0
  72. package/ios/ConnectAccountOnboarding/ConnectAccountOnboardingViewManager.swift +17 -0
  73. package/ios/CustomerSheet/CustomerSheetUtils.swift +15 -16
  74. package/ios/CustomerSheet/ReactNativeCustomerAdapter.swift +19 -19
  75. package/ios/EmbeddedPaymentElementView.swift +2 -2
  76. package/ios/Errors.swift +22 -23
  77. package/ios/FinancialConnections.swift +37 -37
  78. package/ios/Mappers.swift +212 -75
  79. package/ios/NavigationBarManager.m +13 -0
  80. package/ios/NavigationBarManager.swift +17 -0
  81. package/ios/NavigationBarView.swift +65 -0
  82. package/ios/NewArch/NavigationBarComponentView.h +10 -0
  83. package/ios/NewArch/NavigationBarComponentView.mm +86 -0
  84. package/ios/OldArch/StripeSdkEventEmitterCompat.h +1 -0
  85. package/ios/OldArch/StripeSdkEventEmitterCompat.m +7 -1
  86. package/ios/PaymentMethodFactory.swift +24 -41
  87. package/ios/PaymentOptionDisplayData+ReactNative.swift +4 -4
  88. package/ios/PaymentPassFinder.swift +9 -10
  89. package/ios/PaymentSheetAppearance.swift +137 -138
  90. package/ios/PushProvisioning/AddToWalletButtonManager.swift +2 -2
  91. package/ios/PushProvisioning/AddToWalletButtonView.swift +16 -18
  92. package/ios/PushProvisioning/PushProvisioningUtils.swift +11 -11
  93. package/ios/StripeContainerManager.swift +1 -1
  94. package/ios/StripeContainerView.swift +3 -3
  95. package/ios/StripeOnrampSdk.h +17 -0
  96. package/ios/StripeOnrampSdk.mm +158 -0
  97. package/ios/StripeSdk.mm +8 -0
  98. package/ios/StripeSdkEmitter.swift +4 -0
  99. package/ios/StripeSdkImpl+CustomerSheet.swift +31 -26
  100. package/ios/StripeSdkImpl+Embedded.swift +11 -9
  101. package/ios/StripeSdkImpl+PaymentSheet.swift +51 -42
  102. package/ios/StripeSdkImpl.swift +919 -191
  103. package/ios/UIColorExtension.swift +72 -0
  104. package/lib/commonjs/components/AddToWalletButton.js +1 -1
  105. package/lib/commonjs/components/AddToWalletButton.js.map +1 -1
  106. package/lib/commonjs/components/AddressSheet.js +1 -1
  107. package/lib/commonjs/components/AddressSheet.js.map +1 -1
  108. package/lib/commonjs/components/AuBECSDebitForm.js +1 -1
  109. package/lib/commonjs/components/AuBECSDebitForm.js.map +1 -1
  110. package/lib/commonjs/components/CardField.js +1 -1
  111. package/lib/commonjs/components/CardField.js.map +1 -1
  112. package/lib/commonjs/components/CardForm.js +1 -1
  113. package/lib/commonjs/components/CardForm.js.map +1 -1
  114. package/lib/commonjs/components/PlatformPayButton.js +1 -1
  115. package/lib/commonjs/components/PlatformPayButton.js.map +1 -1
  116. package/lib/commonjs/components/StripeContainer.js +1 -1
  117. package/lib/commonjs/components/StripeContainer.js.map +1 -1
  118. package/lib/commonjs/components/StripeProvider.js +1 -1
  119. package/lib/commonjs/components/StripeProvider.js.map +1 -1
  120. package/lib/commonjs/connect/Components.js +2 -0
  121. package/lib/commonjs/connect/Components.js.map +1 -0
  122. package/lib/commonjs/connect/ConnectComponentsProvider.js +2 -0
  123. package/lib/commonjs/connect/ConnectComponentsProvider.js.map +1 -0
  124. package/lib/commonjs/connect/EmbeddedComponent.js +19 -0
  125. package/lib/commonjs/connect/EmbeddedComponent.js.map +1 -0
  126. package/lib/commonjs/connect/ModalCloseButton.js +2 -0
  127. package/lib/commonjs/connect/ModalCloseButton.js.map +1 -0
  128. package/lib/commonjs/connect/NavigationBar.js +2 -0
  129. package/lib/commonjs/connect/NavigationBar.js.map +1 -0
  130. package/lib/commonjs/connect/connectTypes.js +2 -0
  131. package/lib/commonjs/connect/connectTypes.js.map +1 -0
  132. package/lib/commonjs/events.js +1 -1
  133. package/lib/commonjs/events.js.map +1 -1
  134. package/lib/commonjs/helpers.js +1 -1
  135. package/lib/commonjs/helpers.js.map +1 -1
  136. package/lib/commonjs/hooks/useOnramp.js +2 -0
  137. package/lib/commonjs/hooks/useOnramp.js.map +1 -0
  138. package/lib/commonjs/index.js +1 -1
  139. package/lib/commonjs/index.js.map +1 -1
  140. package/lib/commonjs/plugin/withStripe.js +1 -1
  141. package/lib/commonjs/plugin/withStripe.js.map +1 -1
  142. package/lib/commonjs/specs/NativeAddToWalletButton.js +1 -1
  143. package/lib/commonjs/specs/NativeAddToWalletButton.js.map +1 -1
  144. package/lib/commonjs/specs/NativeAddressSheet.js +1 -1
  145. package/lib/commonjs/specs/NativeAddressSheet.js.map +1 -1
  146. package/lib/commonjs/specs/NativeApplePayButton.js +1 -1
  147. package/lib/commonjs/specs/NativeApplePayButton.js.map +1 -1
  148. package/lib/commonjs/specs/NativeAuBECSDebitForm.js +1 -1
  149. package/lib/commonjs/specs/NativeAuBECSDebitForm.js.map +1 -1
  150. package/lib/commonjs/specs/NativeCardField.js +1 -1
  151. package/lib/commonjs/specs/NativeCardField.js.map +1 -1
  152. package/lib/commonjs/specs/NativeCardForm.js +1 -1
  153. package/lib/commonjs/specs/NativeCardForm.js.map +1 -1
  154. package/lib/commonjs/specs/NativeConnectAccountOnboardingView.js +2 -0
  155. package/lib/commonjs/specs/NativeConnectAccountOnboardingView.js.map +1 -0
  156. package/lib/commonjs/specs/NativeEmbeddedPaymentElement.js +1 -1
  157. package/lib/commonjs/specs/NativeEmbeddedPaymentElement.js.map +1 -1
  158. package/lib/commonjs/specs/NativeGooglePayButton.js +1 -1
  159. package/lib/commonjs/specs/NativeGooglePayButton.js.map +1 -1
  160. package/lib/commonjs/specs/NativeNavigationBar.js +2 -0
  161. package/lib/commonjs/specs/NativeNavigationBar.js.map +1 -0
  162. package/lib/commonjs/specs/NativeOnrampSdkModule.js +2 -0
  163. package/lib/commonjs/specs/NativeOnrampSdkModule.js.map +1 -0
  164. package/lib/commonjs/specs/NativeStripeContainer.js +1 -1
  165. package/lib/commonjs/specs/NativeStripeContainer.js.map +1 -1
  166. package/lib/commonjs/specs/NativeStripeSdkModule.js.map +1 -1
  167. package/lib/commonjs/types/EmbeddedPaymentElement.js +1 -1
  168. package/lib/commonjs/types/EmbeddedPaymentElement.js.map +1 -1
  169. package/lib/commonjs/types/Errors.js +1 -1
  170. package/lib/commonjs/types/Errors.js.map +1 -1
  171. package/lib/commonjs/types/Onramp.js +2 -0
  172. package/lib/commonjs/types/Onramp.js.map +1 -0
  173. package/lib/commonjs/types/PaymentIntent.js.map +1 -1
  174. package/lib/commonjs/types/PaymentSheet.js.map +1 -1
  175. package/lib/commonjs/types/index.js +1 -1
  176. package/lib/commonjs/types/index.js.map +1 -1
  177. package/lib/module/components/AddToWalletButton.js +1 -1
  178. package/lib/module/components/AddToWalletButton.js.map +1 -1
  179. package/lib/module/components/AddressSheet.js +1 -1
  180. package/lib/module/components/AddressSheet.js.map +1 -1
  181. package/lib/module/components/AuBECSDebitForm.js +1 -1
  182. package/lib/module/components/AuBECSDebitForm.js.map +1 -1
  183. package/lib/module/components/CardField.js +1 -1
  184. package/lib/module/components/CardField.js.map +1 -1
  185. package/lib/module/components/CardForm.js +1 -1
  186. package/lib/module/components/CardForm.js.map +1 -1
  187. package/lib/module/components/PlatformPayButton.js +1 -1
  188. package/lib/module/components/PlatformPayButton.js.map +1 -1
  189. package/lib/module/components/StripeContainer.js +1 -1
  190. package/lib/module/components/StripeContainer.js.map +1 -1
  191. package/lib/module/components/StripeProvider.js +1 -1
  192. package/lib/module/components/StripeProvider.js.map +1 -1
  193. package/lib/module/connect/Components.js +2 -0
  194. package/lib/module/connect/Components.js.map +1 -0
  195. package/lib/module/connect/ConnectComponentsProvider.js +2 -0
  196. package/lib/module/connect/ConnectComponentsProvider.js.map +1 -0
  197. package/lib/module/connect/EmbeddedComponent.js +19 -0
  198. package/lib/module/connect/EmbeddedComponent.js.map +1 -0
  199. package/lib/module/connect/ModalCloseButton.js +2 -0
  200. package/lib/module/connect/ModalCloseButton.js.map +1 -0
  201. package/lib/module/connect/NavigationBar.js +2 -0
  202. package/lib/module/connect/NavigationBar.js.map +1 -0
  203. package/lib/module/connect/connectTypes.js +2 -0
  204. package/lib/module/connect/connectTypes.js.map +1 -0
  205. package/lib/module/events.js +1 -1
  206. package/lib/module/events.js.map +1 -1
  207. package/lib/module/helpers.js +1 -1
  208. package/lib/module/helpers.js.map +1 -1
  209. package/lib/module/hooks/useOnramp.js +2 -0
  210. package/lib/module/hooks/useOnramp.js.map +1 -0
  211. package/lib/module/index.js +1 -1
  212. package/lib/module/index.js.map +1 -1
  213. package/lib/module/plugin/withStripe.js +1 -1
  214. package/lib/module/plugin/withStripe.js.map +1 -1
  215. package/lib/module/specs/NativeAddToWalletButton.js +1 -1
  216. package/lib/module/specs/NativeAddToWalletButton.js.map +1 -1
  217. package/lib/module/specs/NativeAddressSheet.js +1 -1
  218. package/lib/module/specs/NativeAddressSheet.js.map +1 -1
  219. package/lib/module/specs/NativeApplePayButton.js +1 -1
  220. package/lib/module/specs/NativeApplePayButton.js.map +1 -1
  221. package/lib/module/specs/NativeAuBECSDebitForm.js +1 -1
  222. package/lib/module/specs/NativeAuBECSDebitForm.js.map +1 -1
  223. package/lib/module/specs/NativeCardField.js +1 -1
  224. package/lib/module/specs/NativeCardField.js.map +1 -1
  225. package/lib/module/specs/NativeCardForm.js +1 -1
  226. package/lib/module/specs/NativeCardForm.js.map +1 -1
  227. package/lib/module/specs/NativeConnectAccountOnboardingView.js +2 -0
  228. package/lib/module/specs/NativeConnectAccountOnboardingView.js.map +1 -0
  229. package/lib/module/specs/NativeEmbeddedPaymentElement.js +1 -1
  230. package/lib/module/specs/NativeEmbeddedPaymentElement.js.map +1 -1
  231. package/lib/module/specs/NativeGooglePayButton.js +1 -1
  232. package/lib/module/specs/NativeGooglePayButton.js.map +1 -1
  233. package/lib/module/specs/NativeNavigationBar.js +2 -0
  234. package/lib/module/specs/NativeNavigationBar.js.map +1 -0
  235. package/lib/module/specs/NativeOnrampSdkModule.js +2 -0
  236. package/lib/module/specs/NativeOnrampSdkModule.js.map +1 -0
  237. package/lib/module/specs/NativeStripeContainer.js +1 -1
  238. package/lib/module/specs/NativeStripeContainer.js.map +1 -1
  239. package/lib/module/specs/NativeStripeSdkModule.js.map +1 -1
  240. package/lib/module/types/EmbeddedPaymentElement.js +1 -1
  241. package/lib/module/types/EmbeddedPaymentElement.js.map +1 -1
  242. package/lib/module/types/Errors.js +1 -1
  243. package/lib/module/types/Errors.js.map +1 -1
  244. package/lib/module/types/Onramp.js +2 -0
  245. package/lib/module/types/Onramp.js.map +1 -0
  246. package/lib/module/types/PaymentIntent.js.map +1 -1
  247. package/lib/module/types/PaymentSheet.js.map +1 -1
  248. package/lib/module/types/index.js +1 -1
  249. package/lib/module/types/index.js.map +1 -1
  250. package/lib/typescript/src/components/StripeProvider.d.ts.map +1 -1
  251. package/lib/typescript/src/connect/Components.d.ts +23 -0
  252. package/lib/typescript/src/connect/Components.d.ts.map +1 -0
  253. package/lib/typescript/src/connect/ConnectComponentsProvider.d.ts +22 -0
  254. package/lib/typescript/src/connect/ConnectComponentsProvider.d.ts.map +1 -0
  255. package/lib/typescript/src/connect/EmbeddedComponent.d.ts +18 -0
  256. package/lib/typescript/src/connect/EmbeddedComponent.d.ts.map +1 -0
  257. package/lib/typescript/src/connect/ModalCloseButton.d.ts +7 -0
  258. package/lib/typescript/src/connect/ModalCloseButton.d.ts.map +1 -0
  259. package/lib/typescript/src/connect/NavigationBar.d.ts +8 -0
  260. package/lib/typescript/src/connect/NavigationBar.d.ts.map +1 -0
  261. package/lib/typescript/src/connect/connectTypes.d.ts +464 -0
  262. package/lib/typescript/src/connect/connectTypes.d.ts.map +1 -0
  263. package/lib/typescript/src/events.d.ts +3 -0
  264. package/lib/typescript/src/events.d.ts.map +1 -1
  265. package/lib/typescript/src/functions.d.ts.map +1 -1
  266. package/lib/typescript/src/helpers.d.ts.map +1 -1
  267. package/lib/typescript/src/hooks/useOnramp.d.ts +158 -0
  268. package/lib/typescript/src/hooks/useOnramp.d.ts.map +1 -0
  269. package/lib/typescript/src/index.d.ts +4 -0
  270. package/lib/typescript/src/index.d.ts.map +1 -1
  271. package/lib/typescript/src/plugin/withStripe.d.ts +15 -0
  272. package/lib/typescript/src/plugin/withStripe.d.ts.map +1 -1
  273. package/lib/typescript/src/specs/NativeConnectAccountOnboardingView.d.ts +14 -0
  274. package/lib/typescript/src/specs/NativeConnectAccountOnboardingView.d.ts.map +1 -0
  275. package/lib/typescript/src/specs/NativeNavigationBar.d.ts +11 -0
  276. package/lib/typescript/src/specs/NativeNavigationBar.d.ts.map +1 -0
  277. package/lib/typescript/src/specs/NativeOnrampSdkModule.d.ts +28 -0
  278. package/lib/typescript/src/specs/NativeOnrampSdkModule.d.ts.map +1 -0
  279. package/lib/typescript/src/specs/NativeStripeSdkModule.d.ts +3 -0
  280. package/lib/typescript/src/specs/NativeStripeSdkModule.d.ts.map +1 -1
  281. package/lib/typescript/src/types/Errors.d.ts +5 -0
  282. package/lib/typescript/src/types/Errors.d.ts.map +1 -1
  283. package/lib/typescript/src/types/Onramp.d.ts +275 -0
  284. package/lib/typescript/src/types/Onramp.d.ts.map +1 -0
  285. package/lib/typescript/src/types/PaymentIntent.d.ts +1 -9
  286. package/lib/typescript/src/types/PaymentIntent.d.ts.map +1 -1
  287. package/lib/typescript/src/types/PaymentMethod.d.ts +2 -8
  288. package/lib/typescript/src/types/PaymentMethod.d.ts.map +1 -1
  289. package/lib/typescript/src/types/PaymentSheet.d.ts +7 -0
  290. package/lib/typescript/src/types/PaymentSheet.d.ts.map +1 -1
  291. package/lib/typescript/src/types/index.d.ts +7 -1
  292. package/lib/typescript/src/types/index.d.ts.map +1 -1
  293. package/package.json +24 -12
  294. package/src/components/StripeProvider.tsx +5 -0
  295. package/src/connect/Components.tsx +279 -0
  296. package/src/connect/ConnectComponentsProvider.tsx +93 -0
  297. package/src/connect/EmbeddedComponent.tsx +407 -0
  298. package/src/connect/ModalCloseButton.tsx +44 -0
  299. package/src/connect/NavigationBar.tsx +29 -0
  300. package/src/connect/connectTypes.ts +626 -0
  301. package/src/events.ts +22 -0
  302. package/src/hooks/useOnramp.tsx +334 -0
  303. package/src/index.tsx +13 -0
  304. package/src/plugin/withStripe.ts +104 -7
  305. package/src/specs/NativeConnectAccountOnboardingView.ts +19 -0
  306. package/src/specs/NativeNavigationBar.ts +16 -0
  307. package/src/specs/NativeOnrampSdkModule.ts +47 -0
  308. package/src/specs/NativeStripeSdkModule.ts +5 -0
  309. package/src/types/Errors.ts +6 -0
  310. package/src/types/Onramp.ts +317 -0
  311. package/src/types/PaymentIntent.ts +0 -10
  312. package/src/types/PaymentMethod.ts +0 -9
  313. package/src/types/PaymentSheet.ts +7 -0
  314. package/src/types/index.ts +8 -0
  315. package/stripe-react-native.podspec +21 -8
  316. package/android/.idea/AndroidProjectSystem.xml +0 -6
  317. package/android/.idea/caches/deviceStreaming.xml +0 -703
  318. package/android/.idea/compiler.xml +0 -6
  319. package/android/.idea/gradle.xml +0 -18
  320. package/android/.idea/migrations.xml +0 -10
  321. package/android/.idea/misc.xml +0 -10
  322. package/android/.idea/runConfigurations.xml +0 -17
  323. package/android/.idea/vcs.xml +0 -6
  324. package/android/local.properties +0 -8
  325. package/android/src/main/java/com/reactnativestripesdk/GooglePayLauncherFragment.kt +0 -146
  326. package/android/src/main/java/com/reactnativestripesdk/GooglePayPaymentMethodLauncherFragment.kt +0 -68
  327. package/android/src/main/java/com/reactnativestripesdk/addresssheet/AddressLauncherFragment.kt +0 -102
  328. package/android/src/main/java/com/reactnativestripesdk/utils/StripeFragment.kt +0 -52
@@ -0,0 +1,93 @@
1
+ import React, { JSX, useMemo, useState } from 'react';
2
+ import type {
3
+ StripeConnectInitParams,
4
+ StripeConnectUpdateParams,
5
+ LoadConnectAndInitialize,
6
+ StripeConnectInstance,
7
+ } from './connectTypes';
8
+
9
+ class ConnectInstance implements StripeConnectInstance {
10
+ initParams: StripeConnectInitParams;
11
+ onUpdate?: (options: StripeConnectUpdateParams) => void;
12
+
13
+ constructor(initParams: StripeConnectInitParams) {
14
+ this.initParams = initParams;
15
+ }
16
+
17
+ update(options: StripeConnectUpdateParams): void {
18
+ this.onUpdate?.(options);
19
+ }
20
+ }
21
+
22
+ export const loadConnectAndInitialize: LoadConnectAndInitialize = (
23
+ initParams: StripeConnectInitParams
24
+ ): StripeConnectInstance => {
25
+ return new ConnectInstance(initParams);
26
+ };
27
+
28
+ type ConnectComponentsProviderProps = {
29
+ connectInstance: StripeConnectInstance;
30
+ children: React.ReactNode;
31
+ };
32
+
33
+ export type ConnectComponentsPayload = {
34
+ appearance: StripeConnectInitParams['appearance'];
35
+ locale: StripeConnectInitParams['locale'];
36
+ connectInstance: ConnectInstance;
37
+ };
38
+
39
+ const ConnectComponentsContext =
40
+ React.createContext<ConnectComponentsPayload | null>(null);
41
+
42
+ ConnectComponentsContext.displayName = 'ConnectComponents';
43
+
44
+ export const ConnectComponentsProvider = ({
45
+ children,
46
+ connectInstance,
47
+ }: ConnectComponentsProviderProps): JSX.Element => {
48
+ if (!(connectInstance instanceof ConnectInstance)) {
49
+ throw new Error(
50
+ 'connectInstance must be an instance of ConnectInstance created via loadConnectAndInitialize'
51
+ );
52
+ }
53
+
54
+ const [appearance, setAppearance] = useState<
55
+ StripeConnectInitParams['appearance']
56
+ >(connectInstance.initParams.appearance);
57
+
58
+ const [locale, setLocale] = useState<StripeConnectInitParams['locale']>(
59
+ connectInstance.initParams.locale
60
+ );
61
+
62
+ if (!connectInstance.onUpdate) {
63
+ connectInstance.onUpdate = (options: StripeConnectUpdateParams) => {
64
+ if (options.appearance) {
65
+ setAppearance(options.appearance);
66
+ }
67
+ if (options.locale) {
68
+ setLocale(options.locale);
69
+ }
70
+ };
71
+ }
72
+
73
+ const value = useMemo(
74
+ () => ({ connectInstance, locale, appearance }),
75
+ [connectInstance, locale, appearance]
76
+ );
77
+
78
+ return (
79
+ <ConnectComponentsContext.Provider value={value}>
80
+ {children}
81
+ </ConnectComponentsContext.Provider>
82
+ );
83
+ };
84
+
85
+ export const useConnectComponents = (): ConnectComponentsPayload => {
86
+ const context = React.useContext(ConnectComponentsContext);
87
+ if (!context) {
88
+ throw new Error(
89
+ `Could not find a ConnectComponentsContext; You need to wrap your components in an <ConnectComponentsProvider> provider.`
90
+ );
91
+ }
92
+ return context;
93
+ };
@@ -0,0 +1,407 @@
1
+ import React, {
2
+ useCallback,
3
+ useEffect,
4
+ useMemo,
5
+ useRef,
6
+ useState,
7
+ } from 'react';
8
+ import {
9
+ AppState,
10
+ AppStateStatus,
11
+ Platform,
12
+ StyleProp,
13
+ ViewStyle,
14
+ } from 'react-native';
15
+ import type { WebView, WebViewMessageEvent } from 'react-native-webview';
16
+ import pjson from '../../package.json';
17
+ import NativeStripeSdk from '../specs/NativeStripeSdkModule';
18
+ import {
19
+ ConnectComponentsPayload,
20
+ useConnectComponents,
21
+ } from './ConnectComponentsProvider';
22
+ import type { LoadError, LoaderStart } from './connectTypes';
23
+
24
+ const DEVELOPMENT_MODE = false;
25
+ const DEVELOPMENT_URL =
26
+ Platform.OS === 'android' ? 'http://10.0.2.2:3001' : 'http://localhost:3001';
27
+ const PRODUCTION_URL = 'https://connect-js.stripe.com';
28
+ const BASE_URL = DEVELOPMENT_MODE ? DEVELOPMENT_URL : PRODUCTION_URL;
29
+
30
+ const sdkVersion = pjson.version;
31
+
32
+ // react-native-webview.html will only load versions in the format X.Y.Z
33
+ if (!/^\d+\.\d+\.\d+$/.test(sdkVersion)) {
34
+ throw new Error(
35
+ `Invalid SDK version: ${sdkVersion}. Must be in format X.Y.Z`
36
+ );
37
+ }
38
+
39
+ const userAgent = [
40
+ 'Mobile',
41
+ `Stripe ReactNative SDK ${Platform.OS}/${Platform.Version}`,
42
+ `stripe-react_native/${sdkVersion}`,
43
+ ].join(' - ');
44
+
45
+ export interface CommonComponentProps {
46
+ onLoaderStart?: ({ elementTagName }: LoaderStart) => void;
47
+ onLoadError?: ({ error, elementTagName }: LoadError) => void;
48
+
49
+ onPageDidLoad?: () => void;
50
+
51
+ style?: StyleProp<ViewStyle>;
52
+ }
53
+
54
+ type EmbeddedComponentType =
55
+ | 'invoice-history'
56
+ | 'transactions-list'
57
+ | 'payments'
58
+ | 'payment-details'
59
+ | 'payment-disputes'
60
+ | 'payouts'
61
+ | 'payouts-list'
62
+ | 'balances'
63
+ | 'account-management'
64
+ | 'account-management-form'
65
+ | 'account-onboarding'
66
+ | 'disputes-list'
67
+ | 'instant-payouts'
68
+ | 'instant-payouts-promotion'
69
+ | 'notification-banner'
70
+ | 'debug-utils'
71
+ | 'debug-ui-config'
72
+ | 'debug-ui-library'
73
+ | 'debug-ui-preview'
74
+ | 'debug-components-list'
75
+ | 'debug-hosted-dashboard-preview'
76
+ | 'app-onboarding'
77
+ | 'app-install'
78
+ | 'app-viewport'
79
+ | 'payment-method-settings'
80
+ | 'capital-financing'
81
+ | 'capital-financing-application'
82
+ | 'capital-financing-promotion'
83
+ | 'capital-overview'
84
+ | 'terminal-hardware-orders'
85
+ | 'terminal-hardware-shop'
86
+ | 'app-settings'
87
+ | 'instant-payouts-promotion'
88
+ | 'issuing-cards-list'
89
+ | 'issuing-card'
90
+ | 'financial-account'
91
+ | 'financial-account-transactions'
92
+ | 'recipients'
93
+ | 'product-tax-code-selector'
94
+ | 'check-scanning'
95
+ | 'tax-threshold-monitoring'
96
+ | 'export-tax-transactions'
97
+ | 'tax-settings'
98
+ | 'tax-registrations'
99
+ | 'documents'
100
+ | 'earnings-chart'
101
+ | 'reporting-chart'
102
+ | 'payout-details'
103
+ | 'balance-report'
104
+ | 'payout-reconciliation-report';
105
+
106
+ type EmbeddedComponentProps = CommonComponentProps & {
107
+ component: EmbeddedComponentType;
108
+ componentProps?: Record<string, unknown>;
109
+
110
+ callbacks?: Record<string, ((data: any) => void) | undefined>;
111
+ };
112
+
113
+ type ConnectComponentsPayloadInternal = ConnectComponentsPayload & {
114
+ overrides?: Record<string, string>;
115
+ };
116
+
117
+ export function EmbeddedComponent(props: EmbeddedComponentProps) {
118
+ const [dynamicWebview, setDynamicWebview] = useState<{
119
+ WebView: typeof WebView | null;
120
+ } | null>(null);
121
+
122
+ // Store pending authenticated webview promise (for Android Custom Tabs)
123
+ const pendingAuthWebViewPromise = useRef<{
124
+ id: string;
125
+ callback: (id: string, url: string | null) => void;
126
+ } | null>(null);
127
+
128
+ const loadWebViewComponent = useCallback(async () => {
129
+ if (dynamicWebview) return;
130
+
131
+ setDynamicWebview({ WebView: null });
132
+
133
+ try {
134
+ const mod = await import('react-native-webview');
135
+ setDynamicWebview({ WebView: mod.WebView });
136
+ } catch (err) {
137
+ console.error('Failed to import react-native-webview:', err);
138
+ }
139
+ }, [dynamicWebview]);
140
+
141
+ useEffect(() => {
142
+ loadWebViewComponent();
143
+ }, [loadWebViewComponent]);
144
+
145
+ const appState = useRef<AppStateStatus>(AppState.currentState);
146
+
147
+ useEffect(() => {
148
+ const subscription = AppState.addEventListener('change', (nextAppState) => {
149
+ if (
150
+ appState.current.match(/inactive|background/) &&
151
+ nextAppState === 'active'
152
+ ) {
153
+ if (pendingAuthWebViewPromise.current) {
154
+ const { id, callback } = pendingAuthWebViewPromise.current;
155
+ pendingAuthWebViewPromise.current = null;
156
+ callback(id, null);
157
+ }
158
+ }
159
+
160
+ appState.current = nextAppState;
161
+ });
162
+
163
+ return () => {
164
+ pendingAuthWebViewPromise.current = null;
165
+ subscription.remove();
166
+ };
167
+ }, []);
168
+
169
+ const { connectInstance, appearance, locale, overrides } =
170
+ useConnectComponents() as ConnectComponentsPayloadInternal;
171
+ const { fonts, publishableKey, fetchClientSecret } =
172
+ connectInstance.initParams;
173
+
174
+ const {
175
+ component,
176
+ componentProps,
177
+ onLoadError,
178
+ onLoaderStart,
179
+ onPageDidLoad,
180
+ callbacks,
181
+ style,
182
+ } = props;
183
+
184
+ const hashParams = {
185
+ component,
186
+ publicKey: publishableKey,
187
+ merchantIdOverride: overrides?.merchantId,
188
+ platformIdOverride: overrides?.platformId,
189
+ apiKeyOverride: overrides?.apiKey,
190
+ livemodeOverride: overrides?.livemode,
191
+ };
192
+
193
+ const hash = Object.entries(hashParams)
194
+ .filter(([_, value]) => value != null)
195
+ .map(
196
+ ([key, value]) =>
197
+ `${encodeURIComponent(key)}=${encodeURIComponent(value!)}`
198
+ )
199
+ .join('&');
200
+
201
+ const connectURL = `${BASE_URL}/v1.0/react_native_webview.html#${hash}`;
202
+ const source = useMemo(() => ({ uri: connectURL }), [connectURL]);
203
+
204
+ const ref = useRef<WebView>(null);
205
+
206
+ const [prevAppearance, setPrevAppearance] = useState(appearance);
207
+ const [prevLocale, setPrevLocale] = useState(locale);
208
+
209
+ if (prevAppearance !== appearance || prevLocale !== locale) {
210
+ setPrevAppearance(appearance);
211
+ setPrevLocale(locale);
212
+
213
+ const patchedAppearance = withDefaultFontFamily(appearance);
214
+
215
+ ref.current?.injectJavaScript(`
216
+ (function() {
217
+ window.updateConnectInstance(${JSON.stringify({ appearance: patchedAppearance, locale })});
218
+ true;
219
+ })();
220
+ `);
221
+ }
222
+
223
+ const [prevComponentProps, setPrevComponentProps] = useState(componentProps);
224
+ if (prevComponentProps !== componentProps) {
225
+ setPrevComponentProps(componentProps);
226
+
227
+ Object.entries(componentProps || {}).forEach(([key, value]) => {
228
+ ref.current?.injectJavaScript(`
229
+ (function() {
230
+ window.callSetterWithSerializableValue(${JSON.stringify({
231
+ setter: key,
232
+ value,
233
+ })});
234
+ true;
235
+ })();
236
+ `);
237
+ });
238
+ }
239
+
240
+ const handleUnexpectedError = useCallback((error: unknown) => {
241
+ const errorMessage = error instanceof Error ? error.message : String(error);
242
+ console.error(`Unexpected error: ${errorMessage}`);
243
+ }, []);
244
+
245
+ const WebViewComponent = dynamicWebview?.WebView;
246
+
247
+ const handleAuthWebViewResult = (id: string, resultUrl: string | null) => {
248
+ ref.current?.injectJavaScript(`
249
+ (function() {
250
+ window.returnedFromAuthenticatedWebView(${JSON.stringify({
251
+ id,
252
+ url: resultUrl,
253
+ })});
254
+ true;
255
+ })();
256
+ `);
257
+ };
258
+
259
+ const onMessageCallback = useCallback(
260
+ async (event: WebViewMessageEvent) => {
261
+ const message = JSON.parse(event.nativeEvent.data) as {
262
+ type: string;
263
+ data?: unknown;
264
+ };
265
+
266
+ if (message.type === 'fetchClientSecret') {
267
+ const clientSecret = await fetchClientSecret().catch((error) => {
268
+ handleUnexpectedError(error);
269
+ return null;
270
+ });
271
+ if (!clientSecret) return;
272
+
273
+ ref.current?.injectJavaScript(`
274
+ window.clientSecretDeferred.resolve(${JSON.stringify(
275
+ clientSecret
276
+ )});
277
+ `);
278
+ } else if (message.type === 'debug') {
279
+ // message.data is of type string
280
+ console.debug(`[EmbeddedComponent ${component}]: ${message.data}`);
281
+ } else if (message.type === 'pageDidLoad') {
282
+ onPageDidLoad?.();
283
+ } else if (message.type === 'accountSessionClaimed') {
284
+ // message.data is of type {elementTagName: string, merchantId: string}
285
+ } else if (message.type === 'openFinancialConnections') {
286
+ // message.data is of type {clientSecret: string; id: string; connectedAccountId: string;}
287
+ } else if (message.type === 'closeWebView') {
288
+ // message.data is empty
289
+ callbacks?.onCloseWebView?.({});
290
+ } else if (message.type === 'callSupplementalFunction') {
291
+ // message.data is of type {[key]: {functionName: string; args: unknown[]; invocationId: string;}}
292
+ } else if (message.type === 'onSetterFunctionCalled') {
293
+ const { setter, value } = message.data as {
294
+ setter: string;
295
+ value: unknown;
296
+ };
297
+
298
+ if (setter === 'setOnLoaderStart') {
299
+ onLoaderStart?.(value as LoaderStart);
300
+ } else if (setter === 'setOnLoadError') {
301
+ onLoadError?.(value as LoadError);
302
+ } else {
303
+ // remove the 'set' prefix and lowercase the first letter
304
+ const functionName =
305
+ setter.charAt(3).toLowerCase() + setter.substring(4);
306
+ callbacks?.[functionName]?.(value);
307
+ }
308
+ } else if (message.type === 'openAuthenticatedWebView') {
309
+ const { url, id } = message.data as { id: string; url: string };
310
+
311
+ // Validate URL before opening
312
+ if (!isValidUrl(url)) {
313
+ handleUnexpectedError(
314
+ new Error(`Invalid URL for authenticated webview: ${url}`)
315
+ );
316
+ return;
317
+ }
318
+
319
+ // On Android, we need to wait for the deep link callback
320
+ // On iOS, the promise resolves with the redirect URL
321
+ NativeStripeSdk.openAuthenticatedWebView(id, url)
322
+ .then((result) => {
323
+ if (Platform.OS === 'ios') {
324
+ // iOS returns the redirect URL directly
325
+ handleAuthWebViewResult(id, result?.url ?? null);
326
+ } else {
327
+ // Android: Store promise to be resolved by deep link listener
328
+ pendingAuthWebViewPromise.current = {
329
+ id,
330
+ callback: handleAuthWebViewResult,
331
+ };
332
+ }
333
+ })
334
+ .catch(handleUnexpectedError);
335
+ } else {
336
+ // unhandled message
337
+ }
338
+ },
339
+ [
340
+ callbacks,
341
+ component,
342
+ fetchClientSecret,
343
+ handleUnexpectedError,
344
+ onLoadError,
345
+ onLoaderStart,
346
+ onPageDidLoad,
347
+ ]
348
+ );
349
+
350
+ const backgroundColor = appearance?.variables?.colorBackground || '#FFFFFF';
351
+
352
+ const mergedStyle = useMemo(
353
+ () => [{ backgroundColor }, style],
354
+ [backgroundColor, style]
355
+ );
356
+
357
+ if (!WebViewComponent) return null;
358
+
359
+ return (
360
+ <WebViewComponent
361
+ ref={ref}
362
+ style={mergedStyle}
363
+ webviewDebuggingEnabled={DEVELOPMENT_MODE}
364
+ source={source}
365
+ userAgent={userAgent}
366
+ injectedJavaScriptObject={{
367
+ initParams: {
368
+ appearance: withDefaultFontFamily(appearance),
369
+ locale,
370
+ fonts,
371
+ },
372
+ initComponentProps: componentProps,
373
+ appInfo: { applicationId: overrides?.applicationId },
374
+ }}
375
+ // Fixes injectedJavaScriptObject in Android https://github.com/react-native-webview/react-native-webview/issues/3326#issuecomment-3048111789
376
+ injectedJavaScriptBeforeContentLoaded={'(function() {})();'}
377
+ onMessage={onMessageCallback}
378
+ />
379
+ );
380
+ }
381
+
382
+ const DEFAULT_FONT =
383
+ "-apple-system, 'system-ui', 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'";
384
+
385
+ // Returns appearance with fontFamily set if not defined
386
+ function withDefaultFontFamily(appearance: any) {
387
+ if (appearance?.variables?.fontFamily) {
388
+ return appearance;
389
+ }
390
+ return {
391
+ ...appearance,
392
+ variables: {
393
+ ...appearance?.variables,
394
+ fontFamily: DEFAULT_FONT,
395
+ },
396
+ };
397
+ }
398
+
399
+ // Validates that a URL is well-formed and uses http or https protocol
400
+ function isValidUrl(url: string): boolean {
401
+ try {
402
+ const parsedUrl = new URL(url);
403
+ return parsedUrl.protocol === 'http:' || parsedUrl.protocol === 'https:';
404
+ } catch {
405
+ return false;
406
+ }
407
+ }
@@ -0,0 +1,44 @@
1
+ import React from 'react';
2
+ import { TouchableOpacity, Text, StyleSheet } from 'react-native';
3
+
4
+ const size = 36;
5
+ const hitSlop = { top: 10, bottom: 10, left: 10, right: 10 };
6
+
7
+ interface ModalCloseButtonProps {
8
+ onPress: () => void;
9
+ }
10
+
11
+ export default function ModalCloseButton({ onPress }: ModalCloseButtonProps) {
12
+ return (
13
+ <TouchableOpacity
14
+ onPress={onPress}
15
+ accessibilityRole="button"
16
+ hitSlop={hitSlop}
17
+ style={[
18
+ styles.button,
19
+ {
20
+ width: size,
21
+ height: size,
22
+ borderRadius: size / 2,
23
+ },
24
+ ]}
25
+ activeOpacity={0.7}
26
+ >
27
+ <Text style={[styles.cross, { fontSize: Math.round(size * 0.6) }]}>
28
+ ×
29
+ </Text>
30
+ </TouchableOpacity>
31
+ );
32
+ }
33
+
34
+ const styles = StyleSheet.create({
35
+ button: {
36
+ alignItems: 'center',
37
+ justifyContent: 'center',
38
+ },
39
+ cross: {
40
+ lineHeight: undefined,
41
+ includeFontPadding: false,
42
+ textAlign: 'center',
43
+ },
44
+ });
@@ -0,0 +1,29 @@
1
+ import React, { forwardRef } from 'react';
2
+ import type { ViewProps } from 'react-native';
3
+ import NativeNavigationBar from '../specs/NativeNavigationBar';
4
+
5
+ export interface NavigationBarProps extends ViewProps {
6
+ title?: string;
7
+ onCloseButtonPress?: () => void;
8
+ }
9
+
10
+ export const NavigationBar = forwardRef<any, NavigationBarProps>(
11
+ ({ title, onCloseButtonPress, ...rest }, ref) => {
12
+ return (
13
+ <NativeNavigationBar
14
+ ref={ref}
15
+ title={title}
16
+ onCloseButtonPress={
17
+ onCloseButtonPress
18
+ ? (_event) => {
19
+ onCloseButtonPress();
20
+ }
21
+ : undefined
22
+ }
23
+ {...rest}
24
+ />
25
+ );
26
+ }
27
+ );
28
+
29
+ NavigationBar.displayName = 'NavigationBar';