@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.
- package/android/build.gradle +3 -3
- package/android/gradle.properties +1 -1
- package/android/proguard-rules.txt +4 -0
- package/android/src/main/java/com/reactnativestripesdk/CurrencySelectorAppearance.kt +229 -0
- package/android/src/main/java/com/reactnativestripesdk/CurrencySelectorElementView.kt +8 -1
- package/android/src/main/java/com/reactnativestripesdk/CurrencySelectorElementViewManager.kt +11 -0
- package/android/src/main/java/com/reactnativestripesdk/EmbeddedPaymentElementView.kt +0 -22
- package/android/src/main/java/com/reactnativestripesdk/EmbeddedPaymentElementViewManager.kt +0 -22
- package/android/src/main/java/com/reactnativestripesdk/PaymentSheetManager.kt +11 -4
- package/android/src/main/java/com/reactnativestripesdk/StripeSdkModule.kt +12 -25
- package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/AddToWalletButtonManager.kt +8 -0
- package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/AddToWalletButtonView.kt +6 -0
- package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/PushProvisioningProxy.kt +6 -5
- package/android/src/main/java/com/reactnativestripesdk/pushprovisioning/TapAndPayProxy.kt +91 -0
- package/android/src/main/java/com/reactnativestripesdk/utils/Errors.kt +11 -6
- package/android/src/oldarch/java/com/facebook/react/viewmanagers/AddToWalletButtonManagerDelegate.java +3 -0
- package/android/src/oldarch/java/com/facebook/react/viewmanagers/AddToWalletButtonManagerInterface.java +1 -0
- package/android/src/oldarch/java/com/facebook/react/viewmanagers/EmbeddedPaymentElementViewManagerDelegate.java +0 -3
- package/android/src/oldarch/java/com/facebook/react/viewmanagers/EmbeddedPaymentElementViewManagerInterface.java +0 -1
- package/android/src/oldarch/java/com/facebook/react/viewmanagers/StripeCurrencySelectorElementManagerDelegate.java +4 -0
- package/android/src/oldarch/java/com/facebook/react/viewmanagers/StripeCurrencySelectorElementManagerInterface.java +2 -0
- package/android/src/oldarch/java/com/reactnativestripesdk/NativeOnrampSdkModuleSpec.java +1 -1
- package/android/src/oldarch/java/com/reactnativestripesdk/NativeStripeSdkModuleSpec.java +0 -8
- package/android/src/onramp/java/com/reactnativestripesdk/OnrampErrors.kt +145 -0
- package/android/src/onramp/java/com/reactnativestripesdk/OnrampMappers.kt +10 -1
- package/android/src/onramp/java/com/reactnativestripesdk/OnrampSdkModule.kt +52 -38
- package/android/src/test/java/com/reactnativestripesdk/CurrencySelectorAppearanceTest.kt +137 -0
- package/android/src/test/java/com/reactnativestripesdk/OnrampErrorsTest.kt +168 -0
- package/ios/CurrencySelectorAppearance.swift +120 -0
- package/ios/CurrencySelectorElementManager.m +1 -0
- package/ios/CurrencySelectorElementView.swift +16 -1
- package/ios/Mappers.swift +8 -6
- package/ios/NewArch/EmbeddedPaymentElementViewComponentView.mm +0 -4
- package/ios/NewArch/StripeCurrencySelectorElementComponentView.mm +1 -0
- package/ios/OnrampErrors.swift +132 -0
- package/ios/StripeOnrampSdk.mm +3 -3
- package/ios/StripeSdk.mm +0 -20
- package/ios/StripeSdkImpl+Checkout.swift +0 -17
- package/ios/StripeSdkImpl+Embedded.swift +0 -24
- package/ios/StripeSdkImpl+PaymentSheet.swift +1 -2
- package/ios/StripeSdkImpl.swift +34 -22
- package/lib/commonjs/components/AddToWalletButton.js.map +1 -1
- package/lib/commonjs/components/CurrencySelectorElement.js +1 -1
- package/lib/commonjs/components/CurrencySelectorElement.js.map +1 -1
- package/lib/commonjs/components/StripeProvider.js +1 -1
- package/lib/commonjs/components/StripeProvider.js.map +1 -1
- package/lib/commonjs/connect/EmbeddedComponent.js +2 -2
- package/lib/commonjs/connect/EmbeddedComponent.js.map +1 -1
- package/lib/commonjs/hooks/useCheckout.js +1 -1
- package/lib/commonjs/hooks/useCheckout.js.map +1 -1
- package/lib/commonjs/hooks/useOnramp.js +1 -1
- package/lib/commonjs/hooks/useOnramp.js.map +1 -1
- package/lib/commonjs/internal/stripeConfig.js +2 -0
- package/lib/commonjs/internal/stripeConfig.js.map +1 -0
- package/lib/commonjs/specs/NativeAddToWalletButton.js +1 -1
- package/lib/commonjs/specs/NativeAddToWalletButton.js.map +1 -1
- package/lib/commonjs/specs/NativeCurrencySelectorElement.js +1 -1
- package/lib/commonjs/specs/NativeCurrencySelectorElement.js.map +1 -1
- package/lib/commonjs/specs/NativeEmbeddedPaymentElement.js +1 -1
- package/lib/commonjs/specs/NativeEmbeddedPaymentElement.js.map +1 -1
- package/lib/commonjs/specs/NativeStripeSdkModule.js.map +1 -1
- package/lib/commonjs/types/EmbeddedPaymentElement.js +1 -1
- package/lib/commonjs/types/EmbeddedPaymentElement.js.map +1 -1
- package/lib/commonjs/types/Errors.js +1 -1
- package/lib/commonjs/types/Errors.js.map +1 -1
- package/lib/commonjs/types/Onramp.js +1 -1
- package/lib/commonjs/types/Onramp.js.map +1 -1
- package/lib/commonjs/types/PushProvisioning.js.map +1 -1
- package/lib/module/components/AddToWalletButton.js.map +1 -1
- package/lib/module/components/CurrencySelectorElement.js +1 -1
- package/lib/module/components/CurrencySelectorElement.js.map +1 -1
- package/lib/module/components/StripeProvider.js +1 -1
- package/lib/module/components/StripeProvider.js.map +1 -1
- package/lib/module/connect/EmbeddedComponent.js +2 -2
- package/lib/module/connect/EmbeddedComponent.js.map +1 -1
- package/lib/module/hooks/useCheckout.js +1 -1
- package/lib/module/hooks/useCheckout.js.map +1 -1
- package/lib/module/hooks/useOnramp.js +1 -1
- package/lib/module/hooks/useOnramp.js.map +1 -1
- package/lib/module/internal/stripeConfig.js +2 -0
- package/lib/module/internal/stripeConfig.js.map +1 -0
- package/lib/module/specs/NativeAddToWalletButton.js +1 -1
- package/lib/module/specs/NativeAddToWalletButton.js.map +1 -1
- package/lib/module/specs/NativeCurrencySelectorElement.js +1 -1
- package/lib/module/specs/NativeCurrencySelectorElement.js.map +1 -1
- package/lib/module/specs/NativeEmbeddedPaymentElement.js +1 -1
- package/lib/module/specs/NativeEmbeddedPaymentElement.js.map +1 -1
- package/lib/module/specs/NativeStripeSdkModule.js.map +1 -1
- package/lib/module/types/EmbeddedPaymentElement.js +1 -1
- package/lib/module/types/EmbeddedPaymentElement.js.map +1 -1
- package/lib/module/types/Errors.js +1 -1
- package/lib/module/types/Errors.js.map +1 -1
- package/lib/module/types/Onramp.js +1 -1
- package/lib/module/types/Onramp.js.map +1 -1
- package/lib/module/types/PushProvisioning.js.map +1 -1
- package/lib/typescript/src/components/AddToWalletButton.d.ts +2 -0
- package/lib/typescript/src/components/AddToWalletButton.d.ts.map +1 -1
- package/lib/typescript/src/components/CurrencySelectorElement.d.ts +76 -1
- package/lib/typescript/src/components/CurrencySelectorElement.d.ts.map +1 -1
- package/lib/typescript/src/components/StripeProvider.d.ts.map +1 -1
- package/lib/typescript/src/connect/EmbeddedComponent.d.ts +23 -0
- package/lib/typescript/src/connect/EmbeddedComponent.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useCheckout.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useOnramp.d.ts +13 -13
- package/lib/typescript/src/hooks/useOnramp.d.ts.map +1 -1
- package/lib/typescript/src/internal/stripeConfig.d.ts +3 -0
- package/lib/typescript/src/internal/stripeConfig.d.ts.map +1 -0
- package/lib/typescript/src/specs/NativeAddToWalletButton.d.ts +1 -0
- package/lib/typescript/src/specs/NativeAddToWalletButton.d.ts.map +1 -1
- package/lib/typescript/src/specs/NativeCurrencySelectorElement.d.ts +4 -0
- package/lib/typescript/src/specs/NativeCurrencySelectorElement.d.ts.map +1 -1
- package/lib/typescript/src/specs/NativeEmbeddedPaymentElement.d.ts +0 -1
- package/lib/typescript/src/specs/NativeEmbeddedPaymentElement.d.ts.map +1 -1
- package/lib/typescript/src/specs/NativeOnrampSdkModule.d.ts +1 -1
- package/lib/typescript/src/specs/NativeOnrampSdkModule.d.ts.map +1 -1
- package/lib/typescript/src/specs/NativeStripeSdkModule.d.ts +0 -2
- package/lib/typescript/src/specs/NativeStripeSdkModule.d.ts.map +1 -1
- package/lib/typescript/src/types/Checkout.d.ts +0 -8
- package/lib/typescript/src/types/Checkout.d.ts.map +1 -1
- package/lib/typescript/src/types/EmbeddedPaymentElement.d.ts +1 -10
- package/lib/typescript/src/types/EmbeddedPaymentElement.d.ts.map +1 -1
- package/lib/typescript/src/types/Errors.d.ts +0 -5
- package/lib/typescript/src/types/Errors.d.ts.map +1 -1
- package/lib/typescript/src/types/Onramp.d.ts +84 -19
- package/lib/typescript/src/types/Onramp.d.ts.map +1 -1
- package/lib/typescript/src/types/PaymentMethod.d.ts +2 -0
- package/lib/typescript/src/types/PaymentMethod.d.ts.map +1 -1
- package/lib/typescript/src/types/PushProvisioning.d.ts +2 -0
- package/lib/typescript/src/types/PushProvisioning.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/AddToWalletButton.tsx +2 -0
- package/src/components/CurrencySelectorElement.tsx +101 -1
- package/src/components/StripeProvider.tsx +2 -0
- package/src/connect/EmbeddedComponent.tsx +47 -10
- package/src/hooks/useCheckout.tsx +0 -9
- package/src/hooks/useOnramp.tsx +101 -18
- package/src/internal/stripeConfig.ts +9 -0
- package/src/specs/NativeAddToWalletButton.ts +1 -0
- package/src/specs/NativeCurrencySelectorElement.ts +5 -0
- package/src/specs/NativeEmbeddedPaymentElement.ts +1 -10
- package/src/specs/NativeOnrampSdkModule.ts +1 -1
- package/src/specs/NativeStripeSdkModule.ts +0 -9
- package/src/types/Checkout.ts +0 -9
- package/src/types/EmbeddedPaymentElement.tsx +4 -27
- package/src/types/Errors.ts +0 -6
- package/src/types/Onramp.ts +93 -19
- package/src/types/PaymentMethod.ts +2 -0
- package/src/types/PushProvisioning.ts +2 -0
- 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
|
-
|
|
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
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
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
|
-
"
|
|
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
|
}
|
|
@@ -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
|
package/ios/StripeOnrampSdk.mm
CHANGED
|
@@ -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(
|
|
82
|
-
|
|
81
|
+
RCT_EXPORT_METHOD(presentUserAttestation:(nonnull RCTPromiseResolveBlock)resolve
|
|
82
|
+
reject:(nonnull RCTPromiseRejectBlock)reject)
|
|
83
83
|
{
|
|
84
|
-
[StripeSdkImpl.shared
|
|
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
|
-
|
|
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) {
|