@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
package/ios/StripeSdk.mm CHANGED
@@ -92,7 +92,7 @@ RCT_EXPORT_METHOD(configureOrderTracking:(nonnull NSString *)orderTypeIdentifier
92
92
  }
93
93
 
94
94
  RCT_EXPORT_METHOD(confirmPayment:(nonnull NSString *)paymentIntentClientSecret
95
- params:(nonnull NSDictionary *)params
95
+ params:(nullable NSDictionary *)params
96
96
  options:(nonnull NSDictionary *)options
97
97
  resolve:(nonnull RCTPromiseResolveBlock)resolve
98
98
  reject:(nonnull RCTPromiseRejectBlock)reject)
@@ -263,6 +263,111 @@ RCT_EXPORT_METHOD(handleURLCallback:(nonnull NSString *)url
263
263
  [StripeSdkImpl.shared handleURLCallback:url resolver:resolve rejecter:reject];
264
264
  }
265
265
 
266
+ RCT_EXPORT_METHOD(initCheckoutSession:(nonnull NSString *)clientSecret
267
+ configuration:(nonnull NSDictionary *)configuration
268
+ resolve:(nonnull RCTPromiseResolveBlock)resolve
269
+ reject:(nonnull RCTPromiseRejectBlock)reject)
270
+ {
271
+ [StripeSdkImpl.shared initCheckoutSession:clientSecret
272
+ configuration:configuration
273
+ resolver:resolve
274
+ rejecter:reject];
275
+ }
276
+
277
+ RCT_EXPORT_METHOD(checkoutUpdateShippingAddress:(nonnull NSString *)sessionKey
278
+ address:(nonnull NSDictionary *)address
279
+ name:(NSString *_Nullable)name
280
+ phone:(NSString *_Nullable)phone
281
+ resolve:(nonnull RCTPromiseResolveBlock)resolve
282
+ reject:(nonnull RCTPromiseRejectBlock)reject)
283
+ {
284
+ [StripeSdkImpl.shared checkoutUpdateShippingAddress:sessionKey
285
+ address:address
286
+ name:name
287
+ phone:phone
288
+ resolver:resolve
289
+ rejecter:reject];
290
+ }
291
+
292
+ RCT_EXPORT_METHOD(checkoutUpdateBillingAddress:(nonnull NSString *)sessionKey
293
+ address:(nonnull NSDictionary *)address
294
+ name:(NSString *_Nullable)name
295
+ phone:(NSString *_Nullable)phone
296
+ resolve:(nonnull RCTPromiseResolveBlock)resolve
297
+ reject:(nonnull RCTPromiseRejectBlock)reject)
298
+ {
299
+ [StripeSdkImpl.shared checkoutUpdateBillingAddress:sessionKey
300
+ address:address
301
+ name:name
302
+ phone:phone
303
+ resolver:resolve
304
+ rejecter:reject];
305
+ }
306
+
307
+ RCT_EXPORT_METHOD(checkoutApplyPromotionCode:(nonnull NSString *)sessionKey
308
+ code:(nonnull NSString *)code
309
+ resolve:(nonnull RCTPromiseResolveBlock)resolve
310
+ reject:(nonnull RCTPromiseRejectBlock)reject)
311
+ {
312
+ [StripeSdkImpl.shared checkoutApplyPromotionCode:sessionKey
313
+ code:code
314
+ resolver:resolve
315
+ rejecter:reject];
316
+ }
317
+
318
+ RCT_EXPORT_METHOD(checkoutRemovePromotionCode:(nonnull NSString *)sessionKey
319
+ resolve:(nonnull RCTPromiseResolveBlock)resolve
320
+ reject:(nonnull RCTPromiseRejectBlock)reject)
321
+ {
322
+ [StripeSdkImpl.shared checkoutRemovePromotionCode:sessionKey
323
+ resolver:resolve
324
+ rejecter:reject];
325
+ }
326
+
327
+ RCT_EXPORT_METHOD(checkoutUpdateLineItemQuantity:(nonnull NSString *)sessionKey
328
+ lineItemId:(nonnull NSString *)lineItemId
329
+ quantity:(double)quantity
330
+ resolve:(nonnull RCTPromiseResolveBlock)resolve
331
+ reject:(nonnull RCTPromiseRejectBlock)reject)
332
+ {
333
+ [StripeSdkImpl.shared checkoutUpdateLineItemQuantity:sessionKey
334
+ lineItemId:lineItemId
335
+ quantity:quantity
336
+ resolver:resolve
337
+ rejecter:reject];
338
+ }
339
+
340
+ RCT_EXPORT_METHOD(checkoutSelectShippingOption:(nonnull NSString *)sessionKey
341
+ id:(nonnull NSString *)identifier
342
+ resolve:(nonnull RCTPromiseResolveBlock)resolve
343
+ reject:(nonnull RCTPromiseRejectBlock)reject)
344
+ {
345
+ [StripeSdkImpl.shared checkoutSelectShippingOption:sessionKey
346
+ id:identifier
347
+ resolver:resolve
348
+ rejecter:reject];
349
+ }
350
+
351
+ RCT_EXPORT_METHOD(checkoutUpdateTaxId:(nonnull NSString *)sessionKey
352
+ type:(nonnull NSString *)type
353
+ value:(nonnull NSString *)value
354
+ resolve:(nonnull RCTPromiseResolveBlock)resolve
355
+ reject:(nonnull RCTPromiseRejectBlock)reject)
356
+ {
357
+ [StripeSdkImpl.shared checkoutUpdateTaxId:sessionKey
358
+ type:type
359
+ value:value
360
+ resolver:resolve
361
+ rejecter:reject];
362
+ }
363
+
364
+ RCT_EXPORT_METHOD(checkoutRefresh:(nonnull NSString *)sessionKey
365
+ resolve:(nonnull RCTPromiseResolveBlock)resolve
366
+ reject:(nonnull RCTPromiseRejectBlock)reject)
367
+ {
368
+ [StripeSdkImpl.shared checkoutRefresh:sessionKey resolver:resolve rejecter:reject];
369
+ }
370
+
266
371
  RCT_EXPORT_METHOD(initCustomerSheet:(nonnull NSDictionary *)params
267
372
  customerAdapterOverrides:(nonnull NSDictionary *)customerAdapterOverrides
268
373
  resolve:(nonnull RCTPromiseResolveBlock)resolve
@@ -448,6 +553,17 @@ RCT_EXPORT_METHOD(createEmbeddedPaymentElement:(nonnull NSDictionary *)intentCon
448
553
  reject:reject];
449
554
  }
450
555
 
556
+ RCT_EXPORT_METHOD(createEmbeddedPaymentElementWithCheckout:(nonnull NSString *)sessionKey
557
+ configuration:(nonnull NSDictionary *)configuration
558
+ resolve:(nonnull RCTPromiseResolveBlock)resolve
559
+ reject:(nonnull RCTPromiseRejectBlock)reject)
560
+ {
561
+ [StripeSdkImpl.shared createEmbeddedPaymentElementWithCheckout:sessionKey
562
+ configuration:configuration
563
+ resolve:resolve
564
+ reject:reject];
565
+ }
566
+
451
567
  RCT_EXPORT_METHOD(confirmEmbeddedPaymentElement:(NSInteger)viewTag
452
568
  resolve:(nonnull RCTPromiseResolveBlock)resolve
453
569
  reject:(nonnull RCTPromiseRejectBlock)reject)
@@ -462,6 +578,13 @@ RCT_EXPORT_METHOD(updateEmbeddedPaymentElement:(NSDictionary *)intentConfig
462
578
  [StripeSdkImpl.shared updateEmbeddedPaymentElement:intentConfig resolve:resolve reject:reject];
463
579
  }
464
580
 
581
+ RCT_EXPORT_METHOD(updateEmbeddedPaymentElementWithCheckout:(nonnull NSString *)sessionKey
582
+ resolve:(nonnull RCTPromiseResolveBlock)resolve
583
+ reject:(nonnull RCTPromiseRejectBlock)reject)
584
+ {
585
+ [StripeSdkImpl.shared updateEmbeddedPaymentElementWithCheckout:sessionKey resolve:resolve reject:reject];
586
+ }
587
+
465
588
  RCT_EXPORT_METHOD(clearEmbeddedPaymentOption:(NSInteger)viewTag
466
589
  resolve:(nonnull RCTPromiseResolveBlock)resolve
467
590
  reject:(nonnull RCTPromiseRejectBlock)reject)
@@ -0,0 +1,308 @@
1
+ //
2
+ // StripeSdkImpl+Checkout.swift
3
+ // stripe-react-native
4
+ //
5
+ // Created by Nick Porter on 4/29/26.
6
+ //
7
+
8
+ import Foundation
9
+ @_spi(CheckoutSessionsPreview) import StripePaymentSheet
10
+
11
+ extension StripeSdkImpl {
12
+ internal func currentCheckoutStateResult(checkout: Checkout) -> NSDictionary {
13
+ Mappers.mapFromCheckoutState(checkout.state)
14
+ }
15
+
16
+ @objc(initCheckoutSession:configuration:resolver:rejecter:)
17
+ public func initCheckoutSession(
18
+ clientSecret: String,
19
+ configuration: NSDictionary,
20
+ resolver resolve: @escaping RCTPromiseResolveBlock,
21
+ rejecter reject: @escaping RCTPromiseRejectBlock
22
+ ) {
23
+ let checkoutConfiguration = buildCheckoutConfiguration(params: configuration)
24
+
25
+ Task { @MainActor [weak self] in
26
+ guard let self else {
27
+ reject(ErrorType.Failed, "Stripe SDK is unavailable", nil)
28
+ return
29
+ }
30
+
31
+ do {
32
+ let checkout = try await Checkout(
33
+ clientSecret: clientSecret,
34
+ configuration: checkoutConfiguration
35
+ )
36
+ let sessionKey = UUID().uuidString
37
+
38
+ self.checkoutInstances[sessionKey] = checkout
39
+
40
+ resolve([
41
+ "sessionKey": sessionKey,
42
+ "state": self.currentCheckoutStateResult(checkout: checkout),
43
+ ])
44
+ } catch {
45
+ reject(self.checkoutErrorCode(for: error), error.localizedDescription, error)
46
+ }
47
+ }
48
+ }
49
+
50
+ @objc(checkoutUpdateShippingAddress:address:name:phone:resolver:rejecter:)
51
+ public func checkoutUpdateShippingAddress(
52
+ sessionKey: String,
53
+ address: NSDictionary,
54
+ name: String?,
55
+ phone: String?,
56
+ resolver resolve: @escaping RCTPromiseResolveBlock,
57
+ rejecter reject: @escaping RCTPromiseRejectBlock
58
+ ) {
59
+ performCheckoutAddressMutation(
60
+ sessionKey: sessionKey,
61
+ address: address,
62
+ name: name,
63
+ phone: phone,
64
+ missingCountryMessage: "A shipping address country is required.",
65
+ resolver: resolve,
66
+ rejecter: reject
67
+ ) { checkout, addressUpdate in
68
+ try await checkout.updateShippingAddress(addressUpdate)
69
+ }
70
+ }
71
+
72
+ @objc(checkoutUpdateBillingAddress:address:name:phone:resolver:rejecter:)
73
+ public func checkoutUpdateBillingAddress(
74
+ sessionKey: String,
75
+ address: NSDictionary,
76
+ name: String?,
77
+ phone: String?,
78
+ resolver resolve: @escaping RCTPromiseResolveBlock,
79
+ rejecter reject: @escaping RCTPromiseRejectBlock
80
+ ) {
81
+ performCheckoutAddressMutation(
82
+ sessionKey: sessionKey,
83
+ address: address,
84
+ name: name,
85
+ phone: phone,
86
+ missingCountryMessage: "A billing address country is required.",
87
+ resolver: resolve,
88
+ rejecter: reject
89
+ ) { checkout, addressUpdate in
90
+ try await checkout.updateBillingAddress(addressUpdate)
91
+ }
92
+ }
93
+
94
+ @objc(checkoutApplyPromotionCode:code:resolver:rejecter:)
95
+ public func checkoutApplyPromotionCode(
96
+ sessionKey: String,
97
+ code: String,
98
+ resolver resolve: @escaping RCTPromiseResolveBlock,
99
+ rejecter reject: @escaping RCTPromiseRejectBlock
100
+ ) {
101
+ performCheckoutMutation(
102
+ sessionKey: sessionKey,
103
+ resolver: resolve,
104
+ rejecter: reject
105
+ ) { checkout in
106
+ try await checkout.applyPromotionCode(code)
107
+ }
108
+ }
109
+
110
+ @objc(checkoutRemovePromotionCode:resolver:rejecter:)
111
+ public func checkoutRemovePromotionCode(
112
+ sessionKey: String,
113
+ resolver resolve: @escaping RCTPromiseResolveBlock,
114
+ rejecter reject: @escaping RCTPromiseRejectBlock
115
+ ) {
116
+ performCheckoutMutation(
117
+ sessionKey: sessionKey,
118
+ resolver: resolve,
119
+ rejecter: reject
120
+ ) { checkout in
121
+ try await checkout.removePromotionCode()
122
+ }
123
+ }
124
+
125
+ @objc(checkoutUpdateLineItemQuantity:lineItemId:quantity:resolver:rejecter:)
126
+ public func checkoutUpdateLineItemQuantity(
127
+ sessionKey: String,
128
+ lineItemId: String,
129
+ quantity: Double,
130
+ resolver resolve: @escaping RCTPromiseResolveBlock,
131
+ rejecter reject: @escaping RCTPromiseRejectBlock
132
+ ) {
133
+ guard quantity.isFinite, let integerQuantity = Int(exactly: quantity) else {
134
+ reject(ErrorType.Failed, "Line item quantity must be an integer.", nil)
135
+ return
136
+ }
137
+
138
+ let lineItemUpdate = Checkout.LineItemUpdate(
139
+ lineItemId: lineItemId,
140
+ quantity: integerQuantity
141
+ )
142
+
143
+ performCheckoutMutation(
144
+ sessionKey: sessionKey,
145
+ resolver: resolve,
146
+ rejecter: reject
147
+ ) { checkout in
148
+ try await checkout.updateQuantity(with: lineItemUpdate)
149
+ }
150
+ }
151
+
152
+ @objc(checkoutSelectShippingOption:id:resolver:rejecter:)
153
+ public func checkoutSelectShippingOption(
154
+ sessionKey: String,
155
+ id: String,
156
+ resolver resolve: @escaping RCTPromiseResolveBlock,
157
+ rejecter reject: @escaping RCTPromiseRejectBlock
158
+ ) {
159
+ performCheckoutMutation(
160
+ sessionKey: sessionKey,
161
+ resolver: resolve,
162
+ rejecter: reject
163
+ ) { checkout in
164
+ try await checkout.selectShippingOption(id)
165
+ }
166
+ }
167
+
168
+ @objc(checkoutUpdateTaxId:type:value:resolver:rejecter:)
169
+ public func checkoutUpdateTaxId(
170
+ sessionKey: String,
171
+ type: String,
172
+ value: String,
173
+ resolver resolve: @escaping RCTPromiseResolveBlock,
174
+ rejecter reject: @escaping RCTPromiseRejectBlock
175
+ ) {
176
+ let taxIdUpdate = Checkout.TaxIdUpdate(type: type, value: value)
177
+
178
+ performCheckoutMutation(
179
+ sessionKey: sessionKey,
180
+ resolver: resolve,
181
+ rejecter: reject
182
+ ) { checkout in
183
+ try await checkout.updateTaxId(with: taxIdUpdate)
184
+ }
185
+ }
186
+
187
+ @objc(checkoutRefresh:resolver:rejecter:)
188
+ public func checkoutRefresh(
189
+ sessionKey: String,
190
+ resolver resolve: @escaping RCTPromiseResolveBlock,
191
+ rejecter reject: @escaping RCTPromiseRejectBlock
192
+ ) {
193
+ performCheckoutMutation(
194
+ sessionKey: sessionKey,
195
+ resolver: resolve,
196
+ rejecter: reject
197
+ ) { checkout in
198
+ try await checkout.refresh()
199
+ }
200
+ }
201
+
202
+ internal func buildCheckoutConfiguration(params: NSDictionary) -> Checkout.Configuration {
203
+ var configuration = Checkout.Configuration()
204
+
205
+ if let adaptivePricing = params["adaptivePricing"] as? NSDictionary,
206
+ let allowed = adaptivePricing["allowed"] as? Bool {
207
+ configuration.adaptivePricing.allowed = allowed
208
+ }
209
+
210
+ return configuration
211
+ }
212
+
213
+ private func performCheckoutMutation(
214
+ sessionKey: String,
215
+ resolver resolve: @escaping RCTPromiseResolveBlock,
216
+ rejecter reject: @escaping RCTPromiseRejectBlock,
217
+ operation: @escaping (Checkout) async throws -> Void
218
+ ) {
219
+ Task { @MainActor [weak self] in
220
+ guard let self else {
221
+ reject(ErrorType.Failed, "Stripe SDK is unavailable", nil)
222
+ return
223
+ }
224
+
225
+ guard let checkout = self.checkoutInstances[sessionKey] else {
226
+ reject(ErrorType.Failed, "Checkout session not found", nil)
227
+ return
228
+ }
229
+
230
+ do {
231
+ try await operation(checkout)
232
+ resolve(self.currentCheckoutStateResult(checkout: checkout))
233
+ } catch {
234
+ reject(self.checkoutErrorCode(for: error), error.localizedDescription, error)
235
+ }
236
+ }
237
+ }
238
+
239
+ private func performCheckoutAddressMutation(
240
+ sessionKey: String,
241
+ address: NSDictionary,
242
+ name: String?,
243
+ phone: String?,
244
+ missingCountryMessage: String,
245
+ resolver resolve: @escaping RCTPromiseResolveBlock,
246
+ rejecter reject: @escaping RCTPromiseRejectBlock,
247
+ operation: @escaping (Checkout, Checkout.AddressUpdate) async throws -> Void
248
+ ) {
249
+ guard let addressUpdate = buildCheckoutAddressUpdate(
250
+ address: address,
251
+ name: name,
252
+ phone: phone
253
+ ) else {
254
+ reject(ErrorType.Failed, missingCountryMessage, nil)
255
+ return
256
+ }
257
+
258
+ performCheckoutMutation(
259
+ sessionKey: sessionKey,
260
+ resolver: resolve,
261
+ rejecter: reject
262
+ ) { checkout in
263
+ try await operation(checkout, addressUpdate)
264
+ }
265
+ }
266
+
267
+ private func buildCheckoutAddressUpdate(
268
+ address: NSDictionary,
269
+ name: String?,
270
+ phone: String?
271
+ ) -> Checkout.AddressUpdate? {
272
+ guard let country = address["country"] as? String, !country.isEmpty else {
273
+ return nil
274
+ }
275
+
276
+ let checkoutAddress = Checkout.Address(
277
+ country: country,
278
+ line1: address["line1"] as? String,
279
+ line2: address["line2"] as? String,
280
+ city: address["city"] as? String,
281
+ state: address["state"] as? String,
282
+ postalCode: address["postalCode"] as? String
283
+ )
284
+
285
+ return Checkout.AddressUpdate(
286
+ name: name,
287
+ phone: phone,
288
+ address: checkoutAddress
289
+ )
290
+ }
291
+
292
+ private func checkoutErrorCode(for error: Error) -> String {
293
+ if let checkoutError = error as? CheckoutError {
294
+ switch checkoutError {
295
+ case .invalidClientSecret:
296
+ return "InvalidClientSecret"
297
+ case .sessionNotOpen:
298
+ return "SessionNotOpen"
299
+ case .sheetCurrentlyPresented:
300
+ return "SheetCurrentlyPresented"
301
+ default:
302
+ return ErrorType.Failed
303
+ }
304
+ }
305
+
306
+ return ErrorType.Failed
307
+ }
308
+ }
@@ -6,7 +6,7 @@
6
6
  //
7
7
 
8
8
  import Foundation
9
- @_spi(EmbeddedPaymentElementPrivateBeta) @_spi(ExperimentalAllowsRemovalOfLastSavedPaymentMethodAPI) @_spi(CustomerSessionBetaAccess) @_spi(STP) @_spi(CustomPaymentMethodsBeta) @_spi(CardFundingFilteringPrivatePreview) import StripePaymentSheet
9
+ @_spi(EmbeddedPaymentElementPrivateBeta) @_spi(ExperimentalAllowsRemovalOfLastSavedPaymentMethodAPI) @_spi(CustomerSessionBetaAccess) @_spi(STP) @_spi(CustomPaymentMethodsBeta) @_spi(CardFundingFilteringPrivatePreview) @_spi(CheckoutSessionsPreview) import StripePaymentSheet
10
10
 
11
11
  @objc(StripeSdkImpl)
12
12
  extension StripeSdkImpl {
@@ -19,19 +19,22 @@ extension StripeSdkImpl {
19
19
  resolve: @escaping RCTPromiseResolveBlock,
20
20
  reject: @escaping RCTPromiseRejectBlock) {
21
21
  guard let modeParams = intentConfig["mode"] as? NSDictionary else {
22
- resolve(Errors.createError(ErrorType.Failed, "One of `paymentIntentClientSecret`, `setupIntentClientSecret`, or `intentConfiguration.mode` is required"))
22
+ emitLoadingFailed(message: "One of `paymentIntentClientSecret`, `setupIntentClientSecret`, or `intentConfiguration.mode` is required")
23
+ resolve(nil)
23
24
  return
24
25
  }
25
26
  let hasConfirmHandler = intentConfig.object(forKey: "confirmHandler") != nil
26
27
  let hasConfirmationTokenHandler = intentConfig.object(forKey: "confirmationTokenConfirmHandler") != nil
27
28
 
28
29
  if !hasConfirmHandler && !hasConfirmationTokenHandler {
29
- resolve(Errors.createError(ErrorType.Failed, "You must provide either `intentConfiguration.confirmHandler` or `intentConfiguration.confirmationTokenConfirmHandler` if you are not passing an intent client secret"))
30
+ emitLoadingFailed(message: "You must provide either `intentConfiguration.confirmHandler` or `intentConfiguration.confirmationTokenConfirmHandler` if you are not passing an intent client secret")
31
+ resolve(nil)
30
32
  return
31
33
  }
32
34
 
33
35
  if hasConfirmHandler && hasConfirmationTokenHandler {
34
- resolve(Errors.createError(ErrorType.Failed, "You must provide either `confirmHandler` or `confirmationTokenConfirmHandler`, but not both"))
36
+ emitLoadingFailed(message: "You must provide either `confirmHandler` or `confirmationTokenConfirmHandler`, but not both")
37
+ resolve(nil)
35
38
  return
36
39
  }
37
40
  let captureMethodString = intentConfig["captureMethod"] as? String
@@ -44,7 +47,8 @@ extension StripeSdkImpl {
44
47
  )
45
48
 
46
49
  guard let configuration = buildEmbeddedPaymentElementConfiguration(params: configuration).configuration else {
47
- resolve(Errors.createError(ErrorType.Failed, "Invalid configuration"))
50
+ emitLoadingFailed(message: "Invalid configuration")
51
+ resolve(nil)
48
52
  return
49
53
  }
50
54
 
@@ -54,26 +58,88 @@ extension StripeSdkImpl {
54
58
  intentConfiguration: intentConfig,
55
59
  configuration: configuration
56
60
  )
57
- embeddedPaymentElement.delegate = embeddedInstanceDelegate
58
- embeddedPaymentElement.presentingViewController = RCTPresentedViewController()
59
- self.embeddedInstance = embeddedPaymentElement
60
-
61
- // success: resolve promise
61
+ attachEmbedded(embeddedPaymentElement)
62
62
  resolve(nil)
63
-
64
- // publish initial state
65
- embeddedInstanceDelegate.embeddedPaymentElementDidUpdateHeight(embeddedPaymentElement: embeddedPaymentElement)
66
- embeddedInstanceDelegate.embeddedPaymentElementDidUpdatePaymentOption(embeddedPaymentElement: embeddedPaymentElement)
67
63
  } catch {
68
- // 1) still resolve the promise so JS hook can finish loading
64
+ emitLoadingFailed(error: error)
65
+ // Resolve so the JS hook can finish loading; loading errors are
66
+ // surfaced through the embeddedPaymentElementLoadingFailed event.
69
67
  resolve(nil)
68
+ }
69
+ }
70
+ }
71
+
72
+ @objc(createEmbeddedPaymentElementWithCheckout:configuration:resolve:reject:)
73
+ public func createEmbeddedPaymentElementWithCheckout(
74
+ sessionKey: String,
75
+ configuration: NSDictionary,
76
+ resolve: @escaping RCTPromiseResolveBlock,
77
+ reject: @escaping RCTPromiseRejectBlock
78
+ ) {
79
+ guard let checkout = checkoutInstances[sessionKey] else {
80
+ emitLoadingFailed(message: "Checkout session not found")
81
+ resolve(nil)
82
+ return
83
+ }
84
+
85
+ guard let configuration = buildEmbeddedPaymentElementConfiguration(params: configuration).configuration else {
86
+ emitLoadingFailed(message: "Invalid configuration")
87
+ resolve(nil)
88
+ return
89
+ }
70
90
 
71
- // 2) emit a loading‐failed event with the error message
72
- let msg = error.localizedDescription
73
- self.emitter?.emitEmbeddedPaymentElementLoadingFailed(["message": msg])
91
+ Task {
92
+ do {
93
+ let embeddedPaymentElement = try await EmbeddedPaymentElement.create(
94
+ checkout: checkout,
95
+ configuration: configuration
96
+ )
97
+ attachEmbedded(embeddedPaymentElement)
98
+ resolve(nil)
99
+ } catch {
100
+ emitLoadingFailed(error: error)
101
+ resolve(nil)
74
102
  }
75
103
  }
104
+ }
105
+
106
+ /// Wires up a freshly created element and emits its initial height /
107
+ /// payment-option state to JS.
108
+ @nonobjc
109
+ private func attachEmbedded(_ element: EmbeddedPaymentElement) {
110
+ element.delegate = embeddedInstanceDelegate
111
+ element.presentingViewController = RCTPresentedViewController()
112
+ self.embeddedInstance = element
76
113
 
114
+ embeddedInstanceDelegate.embeddedPaymentElementDidUpdateHeight(embeddedPaymentElement: element)
115
+ embeddedInstanceDelegate.embeddedPaymentElementDidUpdatePaymentOption(embeddedPaymentElement: element)
116
+ }
117
+
118
+ @nonobjc
119
+ private func emitLoadingFailed(message: String) {
120
+ self.emitter?.emitEmbeddedPaymentElementLoadingFailed(["message": message])
121
+ }
122
+
123
+ @nonobjc
124
+ private func emitLoadingFailed(error: Error) {
125
+ emitLoadingFailed(message: error.localizedDescription)
126
+ }
127
+
128
+ @nonobjc
129
+ private func resolveEmbeddedUpdateResult(
130
+ _ updateResult: EmbeddedPaymentElement.UpdateResult,
131
+ resolve: @escaping RCTPromiseResolveBlock
132
+ ) {
133
+ switch updateResult {
134
+ case .succeeded:
135
+ resolve(["status": "succeeded"])
136
+ case .canceled:
137
+ resolve(["status": "canceled"])
138
+ case .failed(let error):
139
+ self.emitter?.emitEmbeddedPaymentElementLoadingFailed(["message": error.localizedDescription])
140
+ // We don't resolve with an error b/c loading errors are handled via the embeddedPaymentElementLoadingFailed event
141
+ resolve(nil)
142
+ }
77
143
  }
78
144
 
79
145
  @objc(confirmEmbeddedPaymentElement:reject:)
@@ -143,16 +209,31 @@ extension StripeSdkImpl {
143
209
  return
144
210
  }
145
211
 
146
- switch updateResult {
147
- case .succeeded:
148
- resolve(["status": "succeeded"])
149
- case .canceled:
150
- resolve(["status": "canceled"])
151
- case .failed(let error):
152
- self.emitter?.emitEmbeddedPaymentElementLoadingFailed(["message": error.localizedDescription])
153
- // We don't resolve with an error b/c loading errors are handled via the embeddedPaymentElementLoadingFailed event
154
- resolve(nil)
212
+ self.resolveEmbeddedUpdateResult(updateResult, resolve: resolve)
213
+ }
214
+ }
215
+
216
+ @objc(updateEmbeddedPaymentElementWithCheckout:resolve:reject:)
217
+ public func updateEmbeddedPaymentElementWithCheckout(
218
+ sessionKey: String,
219
+ resolve: @escaping RCTPromiseResolveBlock,
220
+ reject: @escaping RCTPromiseRejectBlock
221
+ ) {
222
+ guard let checkout = checkoutInstances[sessionKey] else {
223
+ resolve(Errors.createError(ErrorType.Failed, "Checkout session not found"))
224
+ return
225
+ }
226
+
227
+ Task {
228
+ guard let updateResult = await self.embeddedInstance?.update(checkout: checkout) else {
229
+ resolve(Errors.createError(
230
+ ErrorType.Failed,
231
+ "No EmbeddedPaymentElement instance — did you call create first?"
232
+ ))
233
+ return
155
234
  }
235
+
236
+ self.resolveEmbeddedUpdateResult(updateResult, resolve: resolve)
156
237
  }
157
238
  }
158
239
 
@@ -6,7 +6,7 @@
6
6
  //
7
7
 
8
8
  import Foundation
9
- @_spi(ExperimentalAllowsRemovalOfLastSavedPaymentMethodAPI) @_spi(CustomerSessionBetaAccess) @_spi(EmbeddedPaymentElementPrivateBeta) @_spi(STP) @_spi(PaymentMethodOptionsSetupFutureUsagePreview) @_spi(CustomPaymentMethodsBeta) @_spi(ConfirmationTokensPublicPreview) @_spi(CardFundingFilteringPrivatePreview) import StripePaymentSheet
9
+ @_spi(ExperimentalAllowsRemovalOfLastSavedPaymentMethodAPI) @_spi(CustomerSessionBetaAccess) @_spi(EmbeddedPaymentElementPrivateBeta) @_spi(STP) @_spi(PaymentMethodOptionsSetupFutureUsagePreview) @_spi(CustomPaymentMethodsBeta) @_spi(ConfirmationTokensPublicPreview) @_spi(CardFundingFilteringPrivatePreview) @_spi(CheckoutSessionsPreview) import StripePaymentSheet
10
10
 
11
11
  extension StripeSdkImpl {
12
12
  internal func buildPaymentSheetConfiguration(
@@ -183,7 +183,23 @@ extension StripeSdkImpl {
183
183
  }
184
184
  }
185
185
 
186
- if let paymentIntentClientSecret = params["paymentIntentClientSecret"] as? String {
186
+ if let checkout = params["checkout"] as? NSDictionary,
187
+ let sessionKey = checkout["sessionKey"] as? String {
188
+ guard let checkout = checkoutInstances[sessionKey] else {
189
+ resolve(Errors.createError(ErrorType.Failed, "Checkout session not found"))
190
+ return
191
+ }
192
+
193
+ if params["customFlow"] as? Bool == true {
194
+ PaymentSheet.FlowController.create(checkout: checkout,
195
+ configuration: configuration) { [weak self] result in
196
+ handlePaymentSheetFlowControllerResult(result: result, stripeSdk: self)
197
+ }
198
+ } else {
199
+ self.paymentSheet = PaymentSheet(checkout: checkout, configuration: configuration)
200
+ resolve([])
201
+ }
202
+ } else if let paymentIntentClientSecret = params["paymentIntentClientSecret"] as? String {
187
203
  if !Errors.isPIClientSecretValid(clientSecret: paymentIntentClientSecret) {
188
204
  resolve(Errors.createError(ErrorType.Failed, "`secret` format does not match expected client secret formatting."))
189
205
  return