@stripe/stripe-react-native 0.64.0 → 0.64.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) 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 +2 -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 +250 -12
  28. package/android/src/main/java/com/reactnativestripesdk/StripeSdkPackage.kt +1 -0
  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 +29 -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/test/java/com/reactnativestripesdk/PaymentMethodMessagingElementConfigTest.kt +3 -3
  47. package/android/src/test/java/com/reactnativestripesdk/mappers/MappersTest.kt +60 -0
  48. package/android/src/test/java/com/reactnativestripesdk/mappers/OnrampMappersTest.kt +38 -0
  49. package/android/src/test/java/com/reactnativestripesdk/mappers/PaymentOptionDisplayDataMapperTest.kt +9 -4
  50. package/android/src/test/java/com/reactnativestripesdk/utils/CheckoutMappersTest.kt +89 -0
  51. package/android/src/test/java/com/reactnativestripesdk/utils/CheckoutTestFixtures.java +49 -0
  52. package/ios/ConnectAccountOnboarding/ConnectAccountOnboardingViewController.swift +6 -8
  53. package/ios/CurrencySelectorElementManager.m +9 -0
  54. package/ios/CurrencySelectorElementManager.swift +12 -0
  55. package/ios/CurrencySelectorElementView.swift +24 -0
  56. package/ios/Mappers+Checkout.swift +193 -0
  57. package/ios/Mappers.swift +0 -5
  58. package/ios/NewArch/EmbeddedPaymentElementViewComponentView.mm +16 -2
  59. package/ios/NewArch/StripeCurrencySelectorElementComponentView.h +10 -0
  60. package/ios/NewArch/StripeCurrencySelectorElementComponentView.mm +75 -0
  61. package/ios/PaymentMethodMessagingElementConfig.swift +6 -3
  62. package/ios/PaymentMethodMessagingElementView.swift +19 -0
  63. package/ios/StripeSdk.mm +123 -0
  64. package/ios/StripeSdkImpl+Checkout.swift +308 -0
  65. package/ios/StripeSdkImpl+Embedded.swift +108 -27
  66. package/ios/StripeSdkImpl+PaymentSheet.swift +18 -2
  67. package/ios/StripeSdkImpl.swift +3 -93
  68. package/jest/mock.js +14 -1
  69. package/lib/commonjs/components/AddToWalletButton.js +1 -1
  70. package/lib/commonjs/components/AddToWalletButton.js.map +1 -1
  71. package/lib/commonjs/components/AddressSheet.js +1 -1
  72. package/lib/commonjs/components/AddressSheet.js.map +1 -1
  73. package/lib/commonjs/components/AuBECSDebitForm.js +1 -1
  74. package/lib/commonjs/components/AuBECSDebitForm.js.map +1 -1
  75. package/lib/commonjs/components/CardField.js +1 -1
  76. package/lib/commonjs/components/CardField.js.map +1 -1
  77. package/lib/commonjs/components/CardForm.js +1 -1
  78. package/lib/commonjs/components/CardForm.js.map +1 -1
  79. package/lib/commonjs/components/CurrencySelectorElement.js +2 -0
  80. package/lib/commonjs/components/CurrencySelectorElement.js.map +1 -0
  81. package/lib/commonjs/components/PaymentMethodMessagingElement.js +2 -0
  82. package/lib/commonjs/components/PaymentMethodMessagingElement.js.map +1 -0
  83. package/lib/commonjs/components/PlatformPayButton.js +1 -1
  84. package/lib/commonjs/components/PlatformPayButton.js.map +1 -1
  85. package/lib/commonjs/components/StripeContainer.js +1 -1
  86. package/lib/commonjs/components/StripeContainer.js.map +1 -1
  87. package/lib/commonjs/connect/Components.js +1 -1
  88. package/lib/commonjs/connect/Components.js.map +1 -1
  89. package/lib/commonjs/connect/ConnectComponentsProvider.js +1 -1
  90. package/lib/commonjs/connect/ConnectComponentsProvider.js.map +1 -1
  91. package/lib/commonjs/connect/EmbeddedComponent.js +1 -1
  92. package/lib/commonjs/connect/EmbeddedComponent.js.map +1 -1
  93. package/lib/commonjs/connect/ModalCloseButton.js +1 -1
  94. package/lib/commonjs/connect/ModalCloseButton.js.map +1 -1
  95. package/lib/commonjs/connect/NavigationBar.js +1 -1
  96. package/lib/commonjs/connect/NavigationBar.js.map +1 -1
  97. package/lib/commonjs/events.js.map +1 -1
  98. package/lib/commonjs/functions.js +1 -1
  99. package/lib/commonjs/functions.js.map +1 -1
  100. package/lib/commonjs/helpers.js +1 -1
  101. package/lib/commonjs/hooks/useCheckout.js +2 -0
  102. package/lib/commonjs/hooks/useCheckout.js.map +1 -0
  103. package/lib/commonjs/hooks/useOnramp.js +1 -1
  104. package/lib/commonjs/hooks/useOnramp.js.map +1 -1
  105. package/lib/commonjs/index.js +1 -1
  106. package/lib/commonjs/index.js.map +1 -1
  107. package/lib/commonjs/specs/NativeAddToWalletButton.js +1 -1
  108. package/lib/commonjs/specs/NativeAddressSheet.js +1 -1
  109. package/lib/commonjs/specs/NativeApplePayButton.js +1 -1
  110. package/lib/commonjs/specs/NativeAuBECSDebitForm.js +1 -1
  111. package/lib/commonjs/specs/NativeCardField.js +1 -1
  112. package/lib/commonjs/specs/NativeCardField.js.map +1 -1
  113. package/lib/commonjs/specs/NativeCardForm.js +1 -1
  114. package/lib/commonjs/specs/NativeCardForm.js.map +1 -1
  115. package/lib/commonjs/specs/NativeConnectAccountOnboardingView.js +1 -1
  116. package/lib/commonjs/specs/NativeCurrencySelectorElement.js +2 -0
  117. package/lib/commonjs/specs/NativeCurrencySelectorElement.js.map +1 -0
  118. package/lib/commonjs/specs/NativeEmbeddedPaymentElement.js +1 -1
  119. package/lib/commonjs/specs/NativeEmbeddedPaymentElement.js.map +1 -1
  120. package/lib/commonjs/specs/NativeGooglePayButton.js +1 -1
  121. package/lib/commonjs/specs/NativeNavigationBar.js +1 -1
  122. package/lib/commonjs/specs/NativePaymentMethodMessagingElement.js +1 -1
  123. package/lib/commonjs/specs/NativePaymentMethodMessagingElement.js.map +1 -1
  124. package/lib/commonjs/specs/NativeStripeContainer.js +1 -1
  125. package/lib/commonjs/specs/NativeStripeSdkModule.js.map +1 -1
  126. package/lib/commonjs/types/Checkout.js +2 -0
  127. package/lib/commonjs/types/Checkout.js.map +1 -0
  128. package/lib/commonjs/types/EmbeddedPaymentElement.js +1 -1
  129. package/lib/commonjs/types/EmbeddedPaymentElement.js.map +1 -1
  130. package/lib/commonjs/types/PaymentSheet.js.map +1 -1
  131. package/lib/module/components/AddToWalletButton.js +1 -1
  132. package/lib/module/components/AddToWalletButton.js.map +1 -1
  133. package/lib/module/components/AddressSheet.js +1 -1
  134. package/lib/module/components/AddressSheet.js.map +1 -1
  135. package/lib/module/components/AuBECSDebitForm.js +1 -1
  136. package/lib/module/components/AuBECSDebitForm.js.map +1 -1
  137. package/lib/module/components/CardField.js +1 -1
  138. package/lib/module/components/CardField.js.map +1 -1
  139. package/lib/module/components/CardForm.js +1 -1
  140. package/lib/module/components/CardForm.js.map +1 -1
  141. package/lib/module/components/CurrencySelectorElement.js +2 -0
  142. package/lib/module/components/CurrencySelectorElement.js.map +1 -0
  143. package/lib/module/components/PaymentMethodMessagingElement.js +2 -0
  144. package/lib/module/components/PaymentMethodMessagingElement.js.map +1 -0
  145. package/lib/module/components/PlatformPayButton.js +1 -1
  146. package/lib/module/components/PlatformPayButton.js.map +1 -1
  147. package/lib/module/components/StripeContainer.js +1 -1
  148. package/lib/module/components/StripeContainer.js.map +1 -1
  149. package/lib/module/connect/Components.js +1 -1
  150. package/lib/module/connect/Components.js.map +1 -1
  151. package/lib/module/connect/ConnectComponentsProvider.js +1 -1
  152. package/lib/module/connect/ConnectComponentsProvider.js.map +1 -1
  153. package/lib/module/connect/EmbeddedComponent.js +1 -1
  154. package/lib/module/connect/EmbeddedComponent.js.map +1 -1
  155. package/lib/module/connect/ModalCloseButton.js +1 -1
  156. package/lib/module/connect/ModalCloseButton.js.map +1 -1
  157. package/lib/module/connect/NavigationBar.js +1 -1
  158. package/lib/module/connect/NavigationBar.js.map +1 -1
  159. package/lib/module/events.js.map +1 -1
  160. package/lib/module/functions.js +1 -1
  161. package/lib/module/functions.js.map +1 -1
  162. package/lib/module/helpers.js +1 -1
  163. package/lib/module/hooks/useCheckout.js +2 -0
  164. package/lib/module/hooks/useCheckout.js.map +1 -0
  165. package/lib/module/hooks/useOnramp.js +1 -1
  166. package/lib/module/hooks/useOnramp.js.map +1 -1
  167. package/lib/module/index.js +1 -1
  168. package/lib/module/index.js.map +1 -1
  169. package/lib/module/specs/NativeAddToWalletButton.js +1 -1
  170. package/lib/module/specs/NativeAddressSheet.js +1 -1
  171. package/lib/module/specs/NativeApplePayButton.js +1 -1
  172. package/lib/module/specs/NativeAuBECSDebitForm.js +1 -1
  173. package/lib/module/specs/NativeCardField.js +1 -1
  174. package/lib/module/specs/NativeCardField.js.map +1 -1
  175. package/lib/module/specs/NativeCardForm.js +1 -1
  176. package/lib/module/specs/NativeCardForm.js.map +1 -1
  177. package/lib/module/specs/NativeConnectAccountOnboardingView.js +1 -1
  178. package/lib/module/specs/NativeCurrencySelectorElement.js +2 -0
  179. package/lib/module/specs/NativeCurrencySelectorElement.js.map +1 -0
  180. package/lib/module/specs/NativeEmbeddedPaymentElement.js +1 -1
  181. package/lib/module/specs/NativeEmbeddedPaymentElement.js.map +1 -1
  182. package/lib/module/specs/NativeGooglePayButton.js +1 -1
  183. package/lib/module/specs/NativeNavigationBar.js +1 -1
  184. package/lib/module/specs/NativePaymentMethodMessagingElement.js +1 -1
  185. package/lib/module/specs/NativePaymentMethodMessagingElement.js.map +1 -1
  186. package/lib/module/specs/NativeStripeContainer.js +1 -1
  187. package/lib/module/specs/NativeStripeSdkModule.js.map +1 -1
  188. package/lib/module/types/Checkout.js +2 -0
  189. package/lib/module/types/Checkout.js.map +1 -0
  190. package/lib/module/types/EmbeddedPaymentElement.js +1 -1
  191. package/lib/module/types/EmbeddedPaymentElement.js.map +1 -1
  192. package/lib/module/types/PaymentSheet.js.map +1 -1
  193. package/lib/typescript/src/components/CurrencySelectorElement.d.ts +62 -0
  194. package/lib/typescript/src/components/CurrencySelectorElement.d.ts.map +1 -0
  195. package/lib/typescript/src/components/PaymentMethodMessagingElement.d.ts +41 -0
  196. package/lib/typescript/src/components/PaymentMethodMessagingElement.d.ts.map +1 -0
  197. package/lib/typescript/src/events.d.ts +11 -0
  198. package/lib/typescript/src/events.d.ts.map +1 -1
  199. package/lib/typescript/src/functions.d.ts.map +1 -1
  200. package/lib/typescript/src/hooks/useCheckout.d.ts +21 -0
  201. package/lib/typescript/src/hooks/useCheckout.d.ts.map +1 -0
  202. package/lib/typescript/src/hooks/useOnramp.d.ts +1 -0
  203. package/lib/typescript/src/hooks/useOnramp.d.ts.map +1 -1
  204. package/lib/typescript/src/index.d.ts +3 -0
  205. package/lib/typescript/src/index.d.ts.map +1 -1
  206. package/lib/typescript/src/specs/NativeCurrencySelectorElement.d.ts +25 -0
  207. package/lib/typescript/src/specs/NativeCurrencySelectorElement.d.ts.map +1 -0
  208. package/lib/typescript/src/specs/NativeEmbeddedPaymentElement.d.ts +5 -1
  209. package/lib/typescript/src/specs/NativeEmbeddedPaymentElement.d.ts.map +1 -1
  210. package/lib/typescript/src/specs/NativePaymentMethodMessagingElement.d.ts +1 -6
  211. package/lib/typescript/src/specs/NativePaymentMethodMessagingElement.d.ts.map +1 -1
  212. package/lib/typescript/src/specs/NativeStripeSdkModule.d.ts +16 -1
  213. package/lib/typescript/src/specs/NativeStripeSdkModule.d.ts.map +1 -1
  214. package/lib/typescript/src/types/Checkout.d.ts +336 -0
  215. package/lib/typescript/src/types/Checkout.d.ts.map +1 -0
  216. package/lib/typescript/src/types/EmbeddedPaymentElement.d.ts +36 -1
  217. package/lib/typescript/src/types/EmbeddedPaymentElement.d.ts.map +1 -1
  218. package/lib/typescript/src/types/PaymentMethod.d.ts +1 -5
  219. package/lib/typescript/src/types/PaymentMethod.d.ts.map +1 -1
  220. package/lib/typescript/src/types/PaymentSheet.d.ts +22 -6
  221. package/lib/typescript/src/types/PaymentSheet.d.ts.map +1 -1
  222. package/lib/typescript/src/types/components/PaymentMethodMessagingElementComponent.d.ts +16 -1
  223. package/lib/typescript/src/types/components/PaymentMethodMessagingElementComponent.d.ts.map +1 -1
  224. package/package.json +21 -7
  225. package/src/components/CurrencySelectorElement.tsx +95 -0
  226. package/src/components/PaymentMethodMessagingElement.tsx +109 -0
  227. package/src/events.ts +11 -0
  228. package/src/functions.ts +30 -1
  229. package/src/hooks/useCheckout.tsx +207 -0
  230. package/src/hooks/useOnramp.tsx +9 -3
  231. package/src/index.tsx +4 -0
  232. package/src/specs/NativeCurrencySelectorElement.ts +35 -0
  233. package/src/specs/NativeEmbeddedPaymentElement.ts +12 -2
  234. package/src/specs/NativePaymentMethodMessagingElement.ts +0 -7
  235. package/src/specs/NativeStripeSdkModule.ts +58 -1
  236. package/src/types/Checkout.ts +377 -0
  237. package/src/types/EmbeddedPaymentElement.tsx +117 -26
  238. package/src/types/PaymentMethod.ts +0 -6
  239. package/src/types/PaymentSheet.ts +29 -6
  240. package/src/types/components/PaymentMethodMessagingElementComponent.tsx +17 -1
  241. package/stripe-react-native.podspec +8 -8
  242. package/android/spotless.gradle +0 -19
@@ -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
@@ -14,9 +14,10 @@ import UIKit
14
14
  @_spi(EmbeddedPaymentElementPrivateBeta)
15
15
  @_spi(CustomerSessionBetaAccess)
16
16
  @_spi(AppearanceAPIAdditionsPreview)
17
+ @_spi(CheckoutSessionsPreview)
17
18
  import StripePaymentSheet
18
19
  #else
19
- @_spi(EmbeddedPaymentElementPrivateBeta) @_spi(CustomerSessionBetaAccess) import StripePaymentSheet
20
+ @_spi(EmbeddedPaymentElementPrivateBeta) @_spi(CustomerSessionBetaAccess) @_spi(CheckoutSessionsPreview) import StripePaymentSheet
20
21
  #endif
21
22
 
22
23
  @available(iOS 13.0, *)
@@ -67,6 +68,7 @@ public class StripeSdkImpl: NSObject, UIAdaptivePresentationControllerDelegate {
67
68
 
68
69
  internal var paymentSheet: PaymentSheet?
69
70
  internal var paymentSheetFlowController: PaymentSheet.FlowController?
71
+ internal var checkoutInstances: [String: Checkout] = [:]
70
72
  var paymentSheetIntentCreationCallback: ((Result<String, Error>) -> Void)?
71
73
  var paymentSheetConfirmationTokenIntentCreationCallback: ((Result<String, Error>) -> Void)?
72
74
 
@@ -1793,98 +1795,6 @@ public class StripeSdkImpl: NSObject, UIAdaptivePresentationControllerDelegate {
1793
1795
 
1794
1796
  return coordinator
1795
1797
  }
1796
- #else
1797
- @objc(configureOnramp:resolver:rejecter:)
1798
- public func configureOnramp(config: NSDictionary, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
1799
- resolveWithCryptoOnrampNotAvailableError(resolve)
1800
- }
1801
-
1802
- @objc(hasLinkAccount:resolver:rejecter:)
1803
- public func hasLinkAccount(email: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
1804
- resolveWithCryptoOnrampNotAvailableError(resolve)
1805
- }
1806
-
1807
- @objc(registerLinkUser:resolver:rejecter:)
1808
- public func registerLinkUser(info: NSDictionary, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
1809
- resolveWithCryptoOnrampNotAvailableError(resolve)
1810
- }
1811
-
1812
- @objc(authenticateUserWithToken:resolver:rejecter:)
1813
- public func authenticateUserWithToken(
1814
- _ linkAuthTokenClientSecret: String,
1815
- resolver resolve: @escaping RCTPromiseResolveBlock,
1816
- rejecter reject: @escaping RCTPromiseRejectBlock
1817
- ) {
1818
- resolveWithCryptoOnrampNotAvailableError(resolve)
1819
- }
1820
-
1821
- @objc(registerWalletAddress:network:resolver:rejecter:)
1822
- public func registerWalletAddress(address: String, network: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
1823
- resolveWithCryptoOnrampNotAvailableError(resolve)
1824
- }
1825
-
1826
- @objc(attachKycInfo:resolver:rejecter:)
1827
- public func attachKycInfo(info: NSDictionary, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
1828
- resolveWithCryptoOnrampNotAvailableError(resolve)
1829
- }
1830
-
1831
- @objc(presentKycInfoVerification:resolver:rejecter:)
1832
- public func presentKycInfoVerification(
1833
- updatedAddressDictionary: NSDictionary?,
1834
- resolver resolve: @escaping RCTPromiseResolveBlock,
1835
- rejecter reject: @escaping RCTPromiseRejectBlock
1836
- ) {
1837
- resolveWithCryptoOnrampNotAvailableError(resolve)
1838
- }
1839
-
1840
- @objc(updatePhoneNumber:resolver:rejecter:)
1841
- public func updatePhoneNumber(phone: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
1842
- resolveWithCryptoOnrampNotAvailableError(resolve)
1843
- }
1844
-
1845
- @objc(logout:rejecter:)
1846
- public func logout(resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
1847
- resolveWithCryptoOnrampNotAvailableError(resolve)
1848
- }
1849
-
1850
- @objc(verifyIdentity:rejecter:)
1851
- public func verifyIdentity(resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
1852
- resolveWithCryptoOnrampNotAvailableError(resolve)
1853
- }
1854
-
1855
- @objc(collectPaymentMethod:platformPayParams:resolver:rejecter:)
1856
- public func collectPaymentMethod(paymentMethod: String, platformPayParams: NSDictionary, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
1857
- resolveWithCryptoOnrampNotAvailableError(resolve)
1858
- }
1859
-
1860
- @objc(createCryptoPaymentToken:rejecter:)
1861
- public func createCryptoPaymentToken(resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
1862
- resolveWithCryptoOnrampNotAvailableError(resolve)
1863
- }
1864
-
1865
- @objc(performCheckout:resolver:rejecter:)
1866
- public func performCheckout(onrampSessionId: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
1867
- resolveWithCryptoOnrampNotAvailableError(resolve)
1868
- }
1869
-
1870
- @objc(provideCheckoutClientSecret:)
1871
- public func provideCheckoutClientSecret(clientSecret: String?) {
1872
- // no-op when Onramp is unavailable
1873
- }
1874
-
1875
- @objc(onrampAuthorize:resolver:rejecter:)
1876
- public func onrampAuthorize(linkAuthIntentId: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
1877
- resolveWithCryptoOnrampNotAvailableError(resolve)
1878
- }
1879
-
1880
- @objc(getCryptoTokenDisplayData:resolver:rejecter:)
1881
- public func getCryptoTokenDisplayData(token: NSDictionary, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
1882
- resolveWithCryptoOnrampNotAvailableError(resolve)
1883
- }
1884
-
1885
- private func resolveWithCryptoOnrampNotAvailableError(_ resolver: @escaping RCTPromiseResolveBlock) {
1886
- resolver(Errors.createError(ErrorType.Failed, "StripeCryptoOnramp is not available. To enable, add the 'stripe-react-native/Onramp' subspec to your Podfile."))
1887
- }
1888
1798
  #endif
1889
1799
 
1890
1800
  @objc(setFinancialConnectionsForceNativeFlow:resolver:rejecter:)
package/jest/mock.js CHANGED
@@ -197,7 +197,7 @@ const mockHooks = {
197
197
  confirm: jest.fn(async () => ({
198
198
  status: 'completed',
199
199
  })),
200
- update: jest.fn(async () => ({ status: 'completed', error: null })),
200
+ update: jest.fn(() => {}),
201
201
  clearPaymentOption: jest.fn(() => {}),
202
202
  loadingError: null,
203
203
  })),
@@ -374,6 +374,7 @@ module.exports = {
374
374
  GooglePayButton: () => 'GooglePayButton',
375
375
  AddToWalletButton: () => 'AddToWalletButton',
376
376
  PlatformPayButton: () => 'PlatformPayButton',
377
+ PaymentMethodMessagingElement: () => 'PaymentMethodMessagingElementView',
377
378
  useStripe: jest.fn(() => mockFunctions),
378
379
  };
379
380
 
@@ -396,5 +397,17 @@ jest.mock('../src/specs/NativeStripeSdkModule', () => ({
396
397
  },
397
398
  })),
398
399
  openAuthenticatedWebView: jest.fn(),
400
+ createEmbeddedPaymentElement: jest.fn(async () => undefined),
401
+ createEmbeddedPaymentElementWithCheckout: jest.fn(async () => undefined),
402
+ confirmEmbeddedPaymentElement: jest.fn(async () => ({
403
+ status: 'completed',
404
+ })),
405
+ updateEmbeddedPaymentElement: jest.fn(async () => ({
406
+ status: 'succeeded',
407
+ })),
408
+ updateEmbeddedPaymentElementWithCheckout: jest.fn(async () => ({
409
+ status: 'succeeded',
410
+ })),
411
+ clearEmbeddedPaymentOption: jest.fn(async () => undefined),
399
412
  },
400
413
  }));
@@ -1,2 +1,2 @@
1
- var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.AddToWalletButton=AddToWalletButton;var _objectWithoutProperties2=_interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));var _react=_interopRequireDefault(require("react"));var _NativeAddToWalletButton=_interopRequireDefault(require("../specs/NativeAddToWalletButton"));var _jsxRuntime=require("react/jsx-runtime");var _jsxFileName="/Users/wooj/stripe/stripe-react-native/src/components/AddToWalletButton.tsx";var _excluded=["onComplete"];function AddToWalletButton(_ref){var onComplete=_ref.onComplete,props=(0,_objectWithoutProperties2.default)(_ref,_excluded);return(0,_jsxRuntime.jsx)(_NativeAddToWalletButton.default,Object.assign({},props,{onCompleteAction:function onCompleteAction(value){return onComplete(value.nativeEvent);}}));}
1
+ var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.AddToWalletButton=AddToWalletButton;var _objectWithoutProperties2=_interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));var _react=_interopRequireDefault(require("react"));var _NativeAddToWalletButton=_interopRequireDefault(require("../specs/NativeAddToWalletButton"));var _jsxRuntime=require("react/jsx-runtime");var _jsxFileName="/Users/tjclawson/stripe/stripe-react-native/src/components/AddToWalletButton.tsx";var _excluded=["onComplete"];function AddToWalletButton(_ref){var onComplete=_ref.onComplete,props=(0,_objectWithoutProperties2.default)(_ref,_excluded);return(0,_jsxRuntime.jsx)(_NativeAddToWalletButton.default,Object.assign({},props,{onCompleteAction:function onCompleteAction(value){return onComplete(value.nativeEvent);}}));}
2
2
  //# sourceMappingURL=AddToWalletButton.js.map