@stripe/stripe-react-native 0.66.0 → 0.68.0

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 (149) hide show
  1. package/android/build.gradle +3 -3
  2. package/android/gradle.properties +1 -1
  3. package/android/proguard-rules.txt +4 -0
  4. package/android/src/main/java/com/reactnativestripesdk/CurrencySelectorAppearance.kt +229 -0
  5. package/android/src/main/java/com/reactnativestripesdk/CurrencySelectorElementView.kt +8 -1
  6. package/android/src/main/java/com/reactnativestripesdk/CurrencySelectorElementViewManager.kt +11 -0
  7. package/android/src/main/java/com/reactnativestripesdk/EmbeddedPaymentElementView.kt +0 -22
  8. package/android/src/main/java/com/reactnativestripesdk/EmbeddedPaymentElementViewManager.kt +0 -22
  9. package/android/src/main/java/com/reactnativestripesdk/PaymentSheetManager.kt +11 -4
  10. package/android/src/main/java/com/reactnativestripesdk/StripeSdkModule.kt +12 -25
  11. package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/AddToWalletButtonManager.kt +8 -0
  12. package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/AddToWalletButtonView.kt +6 -0
  13. package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/PushProvisioningProxy.kt +6 -5
  14. package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/TapAndPayProxy.kt +91 -0
  15. package/android/src/main/java/com/reactnativestripesdk/utils/Errors.kt +11 -6
  16. package/android/src/oldarch/java/com/facebook/react/viewmanagers/AddToWalletButtonManagerDelegate.java +3 -0
  17. package/android/src/oldarch/java/com/facebook/react/viewmanagers/AddToWalletButtonManagerInterface.java +1 -0
  18. package/android/src/oldarch/java/com/facebook/react/viewmanagers/EmbeddedPaymentElementViewManagerDelegate.java +0 -3
  19. package/android/src/oldarch/java/com/facebook/react/viewmanagers/EmbeddedPaymentElementViewManagerInterface.java +0 -1
  20. package/android/src/oldarch/java/com/facebook/react/viewmanagers/StripeCurrencySelectorElementManagerDelegate.java +4 -0
  21. package/android/src/oldarch/java/com/facebook/react/viewmanagers/StripeCurrencySelectorElementManagerInterface.java +2 -0
  22. package/android/src/oldarch/java/com/reactnativestripesdk/NativeOnrampSdkModuleSpec.java +1 -1
  23. package/android/src/oldarch/java/com/reactnativestripesdk/NativeStripeSdkModuleSpec.java +0 -8
  24. package/android/src/onramp/java/com/reactnativestripesdk/OnrampErrors.kt +145 -0
  25. package/android/src/onramp/java/com/reactnativestripesdk/OnrampMappers.kt +10 -1
  26. package/android/src/onramp/java/com/reactnativestripesdk/OnrampSdkModule.kt +52 -38
  27. package/android/src/test/java/com/reactnativestripesdk/CurrencySelectorAppearanceTest.kt +137 -0
  28. package/android/src/test/java/com/reactnativestripesdk/OnrampErrorsTest.kt +168 -0
  29. package/ios/CurrencySelectorAppearance.swift +120 -0
  30. package/ios/CurrencySelectorElementManager.m +1 -0
  31. package/ios/CurrencySelectorElementView.swift +16 -1
  32. package/ios/Mappers.swift +8 -6
  33. package/ios/NewArch/EmbeddedPaymentElementViewComponentView.mm +0 -4
  34. package/ios/NewArch/StripeCurrencySelectorElementComponentView.mm +1 -0
  35. package/ios/OnrampErrors.swift +132 -0
  36. package/ios/StripeOnrampSdk.mm +3 -3
  37. package/ios/StripeSdk.mm +0 -20
  38. package/ios/StripeSdkImpl+Checkout.swift +0 -17
  39. package/ios/StripeSdkImpl+Embedded.swift +0 -24
  40. package/ios/StripeSdkImpl+PaymentSheet.swift +1 -2
  41. package/ios/StripeSdkImpl.swift +34 -22
  42. package/lib/commonjs/components/AddToWalletButton.js.map +1 -1
  43. package/lib/commonjs/components/CurrencySelectorElement.js +1 -1
  44. package/lib/commonjs/components/CurrencySelectorElement.js.map +1 -1
  45. package/lib/commonjs/components/StripeProvider.js +1 -1
  46. package/lib/commonjs/components/StripeProvider.js.map +1 -1
  47. package/lib/commonjs/connect/EmbeddedComponent.js +2 -2
  48. package/lib/commonjs/connect/EmbeddedComponent.js.map +1 -1
  49. package/lib/commonjs/hooks/useCheckout.js +1 -1
  50. package/lib/commonjs/hooks/useCheckout.js.map +1 -1
  51. package/lib/commonjs/hooks/useOnramp.js +1 -1
  52. package/lib/commonjs/hooks/useOnramp.js.map +1 -1
  53. package/lib/commonjs/internal/stripeConfig.js +2 -0
  54. package/lib/commonjs/internal/stripeConfig.js.map +1 -0
  55. package/lib/commonjs/specs/NativeAddToWalletButton.js +1 -1
  56. package/lib/commonjs/specs/NativeAddToWalletButton.js.map +1 -1
  57. package/lib/commonjs/specs/NativeCurrencySelectorElement.js +1 -1
  58. package/lib/commonjs/specs/NativeCurrencySelectorElement.js.map +1 -1
  59. package/lib/commonjs/specs/NativeEmbeddedPaymentElement.js +1 -1
  60. package/lib/commonjs/specs/NativeEmbeddedPaymentElement.js.map +1 -1
  61. package/lib/commonjs/specs/NativeStripeSdkModule.js.map +1 -1
  62. package/lib/commonjs/types/EmbeddedPaymentElement.js +1 -1
  63. package/lib/commonjs/types/EmbeddedPaymentElement.js.map +1 -1
  64. package/lib/commonjs/types/Errors.js +1 -1
  65. package/lib/commonjs/types/Errors.js.map +1 -1
  66. package/lib/commonjs/types/Onramp.js +1 -1
  67. package/lib/commonjs/types/Onramp.js.map +1 -1
  68. package/lib/commonjs/types/PushProvisioning.js.map +1 -1
  69. package/lib/module/components/AddToWalletButton.js.map +1 -1
  70. package/lib/module/components/CurrencySelectorElement.js +1 -1
  71. package/lib/module/components/CurrencySelectorElement.js.map +1 -1
  72. package/lib/module/components/StripeProvider.js +1 -1
  73. package/lib/module/components/StripeProvider.js.map +1 -1
  74. package/lib/module/connect/EmbeddedComponent.js +2 -2
  75. package/lib/module/connect/EmbeddedComponent.js.map +1 -1
  76. package/lib/module/hooks/useCheckout.js +1 -1
  77. package/lib/module/hooks/useCheckout.js.map +1 -1
  78. package/lib/module/hooks/useOnramp.js +1 -1
  79. package/lib/module/hooks/useOnramp.js.map +1 -1
  80. package/lib/module/internal/stripeConfig.js +2 -0
  81. package/lib/module/internal/stripeConfig.js.map +1 -0
  82. package/lib/module/specs/NativeAddToWalletButton.js +1 -1
  83. package/lib/module/specs/NativeAddToWalletButton.js.map +1 -1
  84. package/lib/module/specs/NativeCurrencySelectorElement.js +1 -1
  85. package/lib/module/specs/NativeCurrencySelectorElement.js.map +1 -1
  86. package/lib/module/specs/NativeEmbeddedPaymentElement.js +1 -1
  87. package/lib/module/specs/NativeEmbeddedPaymentElement.js.map +1 -1
  88. package/lib/module/specs/NativeStripeSdkModule.js.map +1 -1
  89. package/lib/module/types/EmbeddedPaymentElement.js +1 -1
  90. package/lib/module/types/EmbeddedPaymentElement.js.map +1 -1
  91. package/lib/module/types/Errors.js +1 -1
  92. package/lib/module/types/Errors.js.map +1 -1
  93. package/lib/module/types/Onramp.js +1 -1
  94. package/lib/module/types/Onramp.js.map +1 -1
  95. package/lib/module/types/PushProvisioning.js.map +1 -1
  96. package/lib/typescript/src/components/AddToWalletButton.d.ts +2 -0
  97. package/lib/typescript/src/components/AddToWalletButton.d.ts.map +1 -1
  98. package/lib/typescript/src/components/CurrencySelectorElement.d.ts +76 -1
  99. package/lib/typescript/src/components/CurrencySelectorElement.d.ts.map +1 -1
  100. package/lib/typescript/src/components/StripeProvider.d.ts.map +1 -1
  101. package/lib/typescript/src/connect/EmbeddedComponent.d.ts +23 -0
  102. package/lib/typescript/src/connect/EmbeddedComponent.d.ts.map +1 -1
  103. package/lib/typescript/src/hooks/useCheckout.d.ts.map +1 -1
  104. package/lib/typescript/src/hooks/useOnramp.d.ts +13 -13
  105. package/lib/typescript/src/hooks/useOnramp.d.ts.map +1 -1
  106. package/lib/typescript/src/internal/stripeConfig.d.ts +3 -0
  107. package/lib/typescript/src/internal/stripeConfig.d.ts.map +1 -0
  108. package/lib/typescript/src/specs/NativeAddToWalletButton.d.ts +1 -0
  109. package/lib/typescript/src/specs/NativeAddToWalletButton.d.ts.map +1 -1
  110. package/lib/typescript/src/specs/NativeCurrencySelectorElement.d.ts +4 -0
  111. package/lib/typescript/src/specs/NativeCurrencySelectorElement.d.ts.map +1 -1
  112. package/lib/typescript/src/specs/NativeEmbeddedPaymentElement.d.ts +0 -1
  113. package/lib/typescript/src/specs/NativeEmbeddedPaymentElement.d.ts.map +1 -1
  114. package/lib/typescript/src/specs/NativeOnrampSdkModule.d.ts +1 -1
  115. package/lib/typescript/src/specs/NativeOnrampSdkModule.d.ts.map +1 -1
  116. package/lib/typescript/src/specs/NativeStripeSdkModule.d.ts +0 -2
  117. package/lib/typescript/src/specs/NativeStripeSdkModule.d.ts.map +1 -1
  118. package/lib/typescript/src/types/Checkout.d.ts +0 -8
  119. package/lib/typescript/src/types/Checkout.d.ts.map +1 -1
  120. package/lib/typescript/src/types/EmbeddedPaymentElement.d.ts +1 -10
  121. package/lib/typescript/src/types/EmbeddedPaymentElement.d.ts.map +1 -1
  122. package/lib/typescript/src/types/Errors.d.ts +0 -5
  123. package/lib/typescript/src/types/Errors.d.ts.map +1 -1
  124. package/lib/typescript/src/types/Onramp.d.ts +84 -19
  125. package/lib/typescript/src/types/Onramp.d.ts.map +1 -1
  126. package/lib/typescript/src/types/PaymentMethod.d.ts +2 -0
  127. package/lib/typescript/src/types/PaymentMethod.d.ts.map +1 -1
  128. package/lib/typescript/src/types/PushProvisioning.d.ts +2 -0
  129. package/lib/typescript/src/types/PushProvisioning.d.ts.map +1 -1
  130. package/package.json +1 -1
  131. package/src/components/AddToWalletButton.tsx +2 -0
  132. package/src/components/CurrencySelectorElement.tsx +101 -1
  133. package/src/components/StripeProvider.tsx +2 -0
  134. package/src/connect/EmbeddedComponent.tsx +47 -10
  135. package/src/hooks/useCheckout.tsx +0 -9
  136. package/src/hooks/useOnramp.tsx +101 -18
  137. package/src/internal/stripeConfig.ts +9 -0
  138. package/src/specs/NativeAddToWalletButton.ts +1 -0
  139. package/src/specs/NativeCurrencySelectorElement.ts +5 -0
  140. package/src/specs/NativeEmbeddedPaymentElement.ts +1 -10
  141. package/src/specs/NativeOnrampSdkModule.ts +1 -1
  142. package/src/specs/NativeStripeSdkModule.ts +0 -9
  143. package/src/types/Checkout.ts +0 -9
  144. package/src/types/EmbeddedPaymentElement.tsx +4 -27
  145. package/src/types/Errors.ts +0 -6
  146. package/src/types/Onramp.ts +93 -19
  147. package/src/types/PaymentMethod.ts +2 -0
  148. package/src/types/PushProvisioning.ts +2 -0
  149. package/stripe-react-native.podspec +3 -3
@@ -0,0 +1,120 @@
1
+ //
2
+ // CurrencySelectorAppearance.swift
3
+ // stripe-react-native
4
+ //
5
+ // Created by Nick Porter on 6/24/26.
6
+ //
7
+
8
+ @_spi(ReactNativeSDK) import StripePaymentSheet
9
+ import UIKit
10
+
11
+ internal class CurrencySelectorAppearance {
12
+ class func buildAppearanceFromParams(params: NSDictionary?) -> Checkout.CurrencySelectorView.Appearance {
13
+ var appearance = Checkout.CurrencySelectorView.Appearance()
14
+
15
+ guard let params = params else { return appearance }
16
+
17
+ if let background = parseThemedColor(params: params, key: CurrencySelectorAppearanceKeys.BACKGROUND) {
18
+ appearance.background = background
19
+ }
20
+ if let selectedBackground = parseThemedColor(params: params, key: CurrencySelectorAppearanceKeys.SELECTED_BACKGROUND) {
21
+ appearance.selectedBackground = selectedBackground
22
+ }
23
+ if let borderColor = parseThemedColor(params: params, key: CurrencySelectorAppearanceKeys.BORDER_COLOR) {
24
+ appearance.border = borderColor
25
+ }
26
+ if let textColor = parseThemedColor(params: params, key: CurrencySelectorAppearanceKeys.TEXT_COLOR) {
27
+ appearance.text = textColor
28
+ }
29
+ if let selectedTextColor = parseThemedColor(params: params, key: CurrencySelectorAppearanceKeys.SELECTED_TEXT_COLOR) {
30
+ appearance.selectedText = selectedTextColor
31
+ }
32
+ if let textSecondaryColor = parseThemedColor(params: params, key: CurrencySelectorAppearanceKeys.TEXT_SECONDARY_COLOR) {
33
+ appearance.textSecondary = textSecondaryColor
34
+ }
35
+ if let dangerColor = parseThemedColor(params: params, key: CurrencySelectorAppearanceKeys.DANGER_COLOR) {
36
+ appearance.danger = dangerColor
37
+ }
38
+
39
+ if let cornerRadius = params[CurrencySelectorAppearanceKeys.CORNER_RADIUS] as? CGFloat {
40
+ appearance.cornerRadius = cornerRadius
41
+ }
42
+ if let borderWidth = params[CurrencySelectorAppearanceKeys.BORDER_WIDTH] as? CGFloat {
43
+ appearance.borderWidth = borderWidth
44
+ }
45
+ if let contentVerticalPadding = params[CurrencySelectorAppearanceKeys.CONTENT_VERTICAL_PADDING] as? CGFloat {
46
+ appearance.contentVerticalPadding = contentVerticalPadding
47
+ }
48
+
49
+ if let fontParams = params[CurrencySelectorAppearanceKeys.FONT] as? NSDictionary {
50
+ if let family = fontParams[CurrencySelectorAppearanceKeys.FAMILY] as? String,
51
+ let customFont = UIFont(name: family, size: appearance.font.pointSize) {
52
+ appearance.font = customFont
53
+ }
54
+ if let scale = fontParams[CurrencySelectorAppearanceKeys.SCALE] as? CGFloat {
55
+ appearance.sizeScaleFactor = scale
56
+ }
57
+ }
58
+
59
+ if let labelContent = params[CurrencySelectorAppearanceKeys.LABEL_CONTENT] as? String {
60
+ switch labelContent {
61
+ case CurrencySelectorAppearanceKeys.CURRENCY_CODE:
62
+ appearance.labelContent = .currencyCode
63
+ case CurrencySelectorAppearanceKeys.AMOUNT:
64
+ appearance.labelContent = .amount
65
+ case CurrencySelectorAppearanceKeys.AUTOMATIC:
66
+ appearance.labelContent = .automatic
67
+ default:
68
+ break
69
+ }
70
+ }
71
+
72
+ return appearance
73
+ }
74
+
75
+ private class func parseThemedColor(params: NSDictionary, key: String) -> UIColor? {
76
+ if let colorDict = params[key] as? [String: String] {
77
+ let light = colorDict[CurrencySelectorAppearanceKeys.LIGHT]
78
+ let dark = colorDict[CurrencySelectorAppearanceKeys.DARK]
79
+ guard light != nil || dark != nil else { return nil }
80
+ return UIColor { traitCollection in
81
+ let hex = traitCollection.userInterfaceStyle == .dark
82
+ ? (dark ?? light!)
83
+ : (light ?? dark!)
84
+ return UIColor(hexString: hex)
85
+ }
86
+ }
87
+
88
+ if let colorString = params[key] as? String {
89
+ return UIColor(hexString: colorString)
90
+ }
91
+
92
+ return nil
93
+ }
94
+ }
95
+
96
+ private enum CurrencySelectorAppearanceKeys {
97
+ static let LIGHT = "light"
98
+ static let DARK = "dark"
99
+
100
+ static let BACKGROUND = "background"
101
+ static let SELECTED_BACKGROUND = "selectedBackground"
102
+ static let BORDER_COLOR = "borderColor"
103
+ static let TEXT_COLOR = "textColor"
104
+ static let SELECTED_TEXT_COLOR = "selectedTextColor"
105
+ static let TEXT_SECONDARY_COLOR = "textSecondaryColor"
106
+ static let DANGER_COLOR = "dangerColor"
107
+
108
+ static let CORNER_RADIUS = "cornerRadius"
109
+ static let BORDER_WIDTH = "borderWidth"
110
+ static let CONTENT_VERTICAL_PADDING = "contentVerticalPadding"
111
+
112
+ static let FONT = "font"
113
+ static let FAMILY = "family"
114
+ static let SCALE = "scale"
115
+
116
+ static let LABEL_CONTENT = "labelContent"
117
+ static let AUTOMATIC = "automatic"
118
+ static let CURRENCY_CODE = "currencyCode"
119
+ static let AMOUNT = "amount"
120
+ }
@@ -12,5 +12,6 @@
12
12
  @interface RCT_EXTERN_MODULE(StripeCurrencySelectorElementManager, RCTViewManager)
13
13
  RCT_EXPORT_VIEW_PROPERTY(sessionKey, NSString)
14
14
  RCT_EXPORT_VIEW_PROPERTY(disabled, BOOL)
15
+ RCT_EXPORT_VIEW_PROPERTY(appearance, NSDictionary)
15
16
  RCT_EXPORT_VIEW_PROPERTY(onHeightChange, RCTDirectEventBlock)
16
17
  @end
@@ -39,6 +39,15 @@ public class StripeCurrencySelectorElementContainerView: UIView {
39
39
  }
40
40
  }
41
41
 
42
+ @objc public var appearance: NSDictionary? {
43
+ didSet {
44
+ selectorAppearance = CurrencySelectorAppearance.buildAppearanceFromParams(params: appearance)
45
+ if let checkout = attachedCheckout {
46
+ installSelectorView(for: checkout)
47
+ }
48
+ }
49
+ }
50
+
42
51
  /// Fired whenever the inner selector's intrinsic height changes so RN
43
52
  /// can match it. Session-state changes flow through the central
44
53
  /// `checkoutSessionDidChangeState` event on `StripeSdk` (see
@@ -50,6 +59,8 @@ public class StripeCurrencySelectorElementContainerView: UIView {
50
59
  private var selectorView: Checkout.CurrencySelectorView?
51
60
  private var sessionCancellable: AnyCancellable?
52
61
  private var lastReportedHeight: CGFloat = -1
62
+ private var attachedCheckout: Checkout?
63
+ private var selectorAppearance = Checkout.CurrencySelectorView.Appearance()
53
64
 
54
65
  // MARK: - Init
55
66
 
@@ -88,6 +99,7 @@ public class StripeCurrencySelectorElementContainerView: UIView {
88
99
  return
89
100
  }
90
101
 
102
+ self.attachedCheckout = checkout
91
103
  self.installSelectorView(for: checkout)
92
104
  self.subscribeForLayoutUpdates(on: checkout)
93
105
  }
@@ -110,7 +122,9 @@ public class StripeCurrencySelectorElementContainerView: UIView {
110
122
  }
111
123
 
112
124
  private func installSelectorView(for checkout: Checkout) {
113
- let view = Checkout.CurrencySelectorView(checkout: checkout)
125
+ selectorView?.removeFromSuperview()
126
+
127
+ let view = Checkout.CurrencySelectorView(checkout: checkout, appearance: selectorAppearance)
114
128
  view.translatesAutoresizingMaskIntoConstraints = false
115
129
  view.isEnabled = !disabled
116
130
  addSubview(view)
@@ -135,6 +149,7 @@ public class StripeCurrencySelectorElementContainerView: UIView {
135
149
  sessionCancellable = nil
136
150
  selectorView?.removeFromSuperview()
137
151
  selectorView = nil
152
+ attachedCheckout = nil
138
153
  lastReportedHeight = -1
139
154
  }
140
155
 
package/ios/Mappers.swift CHANGED
@@ -1225,11 +1225,11 @@ class Mappers {
1225
1225
  nil
1226
1226
  }
1227
1227
 
1228
- let primaryButtonConfiguration: LinkAppearance.PrimaryButtonConfiguration? =
1229
- if let primaryButton = params["primaryButton"] as? [String: CGFloat],
1230
- let cornerRadius = primaryButton["cornerRadius"],
1231
- let height = primaryButton["height"] {
1232
- .init(cornerRadius: cornerRadius, height: height)
1228
+ let primaryButtonConfiguration: LinkAppearance.PrimaryButtonConfiguration? = if let primaryButton = params["primaryButton"] as? [String: CGFloat] {
1229
+ .init(
1230
+ cornerRadius: primaryButton["cornerRadius"],
1231
+ height: primaryButton["height"]
1232
+ )
1233
1233
  } else {
1234
1234
  nil
1235
1235
  }
@@ -1371,14 +1371,16 @@ class Mappers {
1371
1371
  [
1372
1372
  "identifiers": requirements.identifiers.map(mapFromComplianceIdentifierRequirement),
1373
1373
  "alternatives": requirements.alternatives.map(mapFromComplianceIdentifierAlternativeGroup),
1374
+ "carfTinRequired": requirements.carfTinRequired,
1374
1375
  ]
1375
1376
  }
1376
1377
 
1377
1378
  class func mapFromSubmitIdentifiersResult(_ result: SubmitIdentifiersResult) -> [String: Any] {
1378
1379
  [
1379
- "valid": result.valid,
1380
+ "completed": result.completed,
1380
1381
  "identifiers": result.identifiers.map(mapFromComplianceIdentifierRequirement),
1381
1382
  "alternatives": result.alternatives.map(mapFromComplianceIdentifierAlternativeGroup),
1383
+ "carfTinRequired": result.carfTinRequired,
1382
1384
  "invalidIdentifiers": result.invalidIdentifiers.map(\.rawValue),
1383
1385
  ]
1384
1386
  }
@@ -68,10 +68,6 @@ using namespace facebook::react;
68
68
  {
69
69
  }
70
70
 
71
- - (void)updateWithCheckout:(NSString *)sessionKey
72
- {
73
- }
74
-
75
71
  #pragma mark - RCTComponentViewProtocol
76
72
 
77
73
  + (ComponentDescriptorProvider)componentDescriptorProvider
@@ -64,6 +64,7 @@ using namespace facebook::react;
64
64
 
65
65
  _view.sessionKey = RCTNSStringFromStringNilIfEmpty(newViewProps.sessionKey);
66
66
  _view.disabled = newViewProps.disabled;
67
+ _view.appearance = stripe::react::convertFollyDynamicToNSDictionaryOrNil(newViewProps.appearance);
67
68
 
68
69
  [super updateProps:props oldProps:oldProps];
69
70
  }
@@ -0,0 +1,132 @@
1
+ //
2
+ // OnrampErrors.swift
3
+ // stripe-react-native
4
+ //
5
+ // Created by Michael Liberatore on 5/28/26.
6
+ //
7
+
8
+ #if canImport(StripeCryptoOnramp)
9
+ import Foundation
10
+ @_spi(CryptoOnrampAlpha) import StripeCryptoOnramp
11
+
12
+ enum OnrampErrors {
13
+
14
+ /// Creates a React Native error envelope for a failed Crypto Onramp operation.
15
+ ///
16
+ /// Typed Crypto Onramp errors include onramp-specific diagnostics in addition to the standard error fields.
17
+ static func createFailedError(_ error: Swift.Error) -> NSDictionary {
18
+ return createOnrampError(code: ErrorType.Failed, error: error)
19
+ }
20
+
21
+ /// Creates a React Native error envelope for calls made before Crypto Onramp has been configured.
22
+ static func createNotConfiguredError() -> NSDictionary {
23
+ return createOnrampErrorMap(
24
+ code: ErrorType.Failed,
25
+ message: "Onramp is not configured."
26
+ )
27
+ }
28
+
29
+ private static func createOnrampError(code: String, error: Swift.Error) -> NSDictionary {
30
+ if let apiError = error as? StripeCryptoOnrampAPIError {
31
+ return createOnrampAPIErrorMap(
32
+ code: code,
33
+ onrampErrorType: onrampErrorType(for: apiError),
34
+ error: apiError
35
+ )
36
+ }
37
+
38
+ if let onrampError = error as? StripeCryptoOnrampError {
39
+ return createOnrampErrorMap(
40
+ code: code,
41
+ message: onrampError.userMessage,
42
+ localizedMessage: onrampError.localizedDescription,
43
+ stripeErrorCode: onrampError.code,
44
+ additionalFields: commonOnrampFields(error: onrampError)
45
+ )
46
+ }
47
+
48
+ return Errors.createError(code, error)
49
+ }
50
+
51
+ private static func createOnrampAPIErrorMap(
52
+ code: String,
53
+ onrampErrorType: String,
54
+ error: StripeCryptoOnrampAPIError
55
+ ) -> NSDictionary {
56
+ return createOnrampErrorMap(
57
+ code: code,
58
+ message: error.userMessage,
59
+ localizedMessage: error.localizedDescription,
60
+ type: error.type,
61
+ stripeErrorCode: error.code,
62
+ additionalFields: commonOnrampFields(error: error, onrampErrorType: onrampErrorType).merging([
63
+ "reason": error.reason,
64
+ "operation": error.operation,
65
+ "appPackageName": error.appIdentifier,
66
+ "mode": error.mode,
67
+ "sdkVersions": mapSDKVersions(error.sdkVersions),
68
+ "requestId": error.requestID,
69
+ "apiErrorCode": error.code,
70
+ "apiErrorType": error.type,
71
+ "apiErrorMessage": error.apiMessage,
72
+ "apiUserMessage": error.apiUserMessage,
73
+ "docUrl": error.docURL?.absoluteString,
74
+ ]) { _, new in new }
75
+ )
76
+ }
77
+
78
+ private static func commonOnrampFields(
79
+ error: StripeCryptoOnrampError,
80
+ onrampErrorType: String? = nil
81
+ ) -> [String: Any?] {
82
+ return [
83
+ "onrampErrorType": onrampErrorType,
84
+ "developerMessage": error.developerMessage,
85
+ "userMessage": error.userMessage,
86
+ ]
87
+ }
88
+
89
+ private static func mapSDKVersions(_ sdkVersions: [SDKVersion]) -> [[String: String]] {
90
+ return sdkVersions.map { sdkVersion in
91
+ [
92
+ "name": sdkVersion.name,
93
+ "version": sdkVersion.version,
94
+ ]
95
+ }
96
+ }
97
+
98
+ private static func onrampErrorType(for error: StripeCryptoOnrampAPIError) -> String {
99
+ switch error {
100
+ case is AppAttestationAPIError:
101
+ return "AppAttestationError"
102
+ default:
103
+ return "UncategorizedApiError"
104
+ }
105
+ }
106
+
107
+ private static func createOnrampErrorMap(
108
+ code: String,
109
+ message: String?,
110
+ localizedMessage: String? = nil,
111
+ declineCode: String? = nil,
112
+ type: String? = nil,
113
+ stripeErrorCode: String? = nil,
114
+ additionalFields: [String: Any?] = [:]
115
+ ) -> NSDictionary {
116
+ let fields: [String: Any?] = [
117
+ "code": code,
118
+ "message": message,
119
+ "localizedMessage": localizedMessage ?? message,
120
+ "declineCode": declineCode,
121
+ "stripeErrorCode": stripeErrorCode,
122
+ "type": type,
123
+ ].merging(additionalFields) { _, new in new }
124
+
125
+ return ["error": fields.mapValues(nullIfNil)]
126
+ }
127
+
128
+ private static func nullIfNil(_ value: Any?) -> Any {
129
+ return value ?? NSNull()
130
+ }
131
+ }
132
+ #endif
@@ -78,10 +78,10 @@ RCT_EXPORT_METHOD(submitIdentifiers:(nonnull NSArray *)identifiers
78
78
  [StripeSdkImpl.shared submitIdentifiers:identifiers resolver:resolve rejecter:reject];
79
79
  }
80
80
 
81
- RCT_EXPORT_METHOD(presentCRSCARFDeclaration:(nonnull RCTPromiseResolveBlock)resolve
82
- reject:(nonnull RCTPromiseRejectBlock)reject)
81
+ RCT_EXPORT_METHOD(presentUserAttestation:(nonnull RCTPromiseResolveBlock)resolve
82
+ reject:(nonnull RCTPromiseRejectBlock)reject)
83
83
  {
84
- [StripeSdkImpl.shared presentCRSCARFDeclaration:resolve rejecter:reject];
84
+ [StripeSdkImpl.shared presentUserAttestation:resolve rejecter:reject];
85
85
  }
86
86
 
87
87
  RCT_EXPORT_METHOD(presentKycInfoVerification:(NSDictionary *)updatedAddress
package/ios/StripeSdk.mm CHANGED
@@ -348,19 +348,6 @@ RCT_EXPORT_METHOD(checkoutSelectShippingOption:(nonnull NSString *)sessionKey
348
348
  rejecter:reject];
349
349
  }
350
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
351
  RCT_EXPORT_METHOD(checkoutRunServerUpdateStart:(nonnull NSString *)sessionKey
365
352
  resolve:(nonnull RCTPromiseResolveBlock)resolve
366
353
  reject:(nonnull RCTPromiseRejectBlock)reject)
@@ -591,13 +578,6 @@ RCT_EXPORT_METHOD(updateEmbeddedPaymentElement:(NSDictionary *)intentConfig
591
578
  [StripeSdkImpl.shared updateEmbeddedPaymentElement:intentConfig resolve:resolve reject:reject];
592
579
  }
593
580
 
594
- RCT_EXPORT_METHOD(updateEmbeddedPaymentElementWithCheckout:(nonnull NSString *)sessionKey
595
- resolve:(nonnull RCTPromiseResolveBlock)resolve
596
- reject:(nonnull RCTPromiseRejectBlock)reject)
597
- {
598
- [StripeSdkImpl.shared updateEmbeddedPaymentElementWithCheckout:sessionKey resolve:resolve reject:reject];
599
- }
600
-
601
581
  RCT_EXPORT_METHOD(clearEmbeddedPaymentOption:(NSInteger)viewTag
602
582
  resolve:(nonnull RCTPromiseResolveBlock)resolve
603
583
  reject:(nonnull RCTPromiseRejectBlock)reject)
@@ -179,23 +179,6 @@ extension StripeSdkImpl {
179
179
  }
180
180
  }
181
181
 
182
- @objc(checkoutUpdateTaxId:type:value:resolver:rejecter:)
183
- public func checkoutUpdateTaxId(
184
- sessionKey: String,
185
- type: String,
186
- value: String,
187
- resolver resolve: @escaping RCTPromiseResolveBlock,
188
- rejecter reject: @escaping RCTPromiseRejectBlock
189
- ) {
190
- performCheckoutMutation(
191
- sessionKey: sessionKey,
192
- resolver: resolve,
193
- rejecter: reject
194
- ) { checkout in
195
- try await checkout.updateTaxId(type: type, value: value)
196
- }
197
- }
198
-
199
182
  @objc(checkoutRunServerUpdateStart:resolver:rejecter:)
200
183
  public func checkoutRunServerUpdateStart(
201
184
  sessionKey: String,
@@ -213,30 +213,6 @@ extension StripeSdkImpl {
213
213
  }
214
214
  }
215
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
234
- }
235
-
236
- self.resolveEmbeddedUpdateResult(updateResult, resolve: resolve)
237
- }
238
- }
239
-
240
216
  @objc(clearEmbeddedPaymentOption)
241
217
  public func clearEmbeddedPaymentOption() {
242
218
  DispatchQueue.main.async {
@@ -196,8 +196,7 @@ extension StripeSdkImpl {
196
196
  handlePaymentSheetFlowControllerResult(result: result, stripeSdk: self)
197
197
  }
198
198
  } else {
199
- self.paymentSheet = PaymentSheet(checkout: checkout, configuration: configuration)
200
- resolve([])
199
+ resolve(Errors.createError(ErrorType.Failed, "PaymentSheet with checkout is not supported. Use customFlow: true instead."))
201
200
  }
202
201
  } else if let paymentIntentClientSecret = params["paymentIntentClientSecret"] as? String {
203
202
  if !Errors.isPIClientSecretValid(clientSecret: paymentIntentClientSecret) {