diff --git a/android/src/main/java/com/stripeterminalreactnative/StripeTerminalReactNativeModule.kt b/android/src/main/java/com/stripeterminalreactnative/StripeTerminalReactNativeModule.kt index ac1723f1..af06b887 100644 --- a/android/src/main/java/com/stripeterminalreactnative/StripeTerminalReactNativeModule.kt +++ b/android/src/main/java/com/stripeterminalreactnative/StripeTerminalReactNativeModule.kt @@ -505,6 +505,11 @@ class StripeTerminalReactNativeModule(reactContext: ReactApplicationContext) : getBoolean(params, "enableCustomerCancellation") ) } + if (params.hasKey("requestDynamicCurrencyConversion")) { + configBuilder.setRequestDynamicCurrencyConversion( + getBoolean(params, "requestDynamicCurrencyConversion") + ) + } val config = configBuilder.build() collectPaymentMethodCancelable = terminal.collectPaymentMethod( diff --git a/dev-app/src/screens/CollectCardPaymentScreen.tsx b/dev-app/src/screens/CollectCardPaymentScreen.tsx index 8cbb0c81..04d964e1 100644 --- a/dev-app/src/screens/CollectCardPaymentScreen.tsx +++ b/dev-app/src/screens/CollectCardPaymentScreen.tsx @@ -82,6 +82,7 @@ export default function CollectCardPaymentScreen() { useState(false); const [enableCustomerCancellation, setEnableCustomerCancellation] = useState(false); + const [requestDcc, setRequestDcc] = useState(false); const [tipEligibleAmount, setTipEligibleAmount] = useState(''); const { params } = useRoute>(); @@ -330,6 +331,7 @@ export default function CollectCardPaymentScreen() { : undefined, updatePaymentIntent: enableUpdatePaymentIntent, enableCustomerCancellation: enableCustomerCancellation, + requestDynamicCurrencyConversion: requestDcc, }); if (error) { @@ -707,7 +709,12 @@ export default function CollectCardPaymentScreen() { setEnableUpdatePaymentIntent(value)} + onValueChange={(value) => { + setEnableUpdatePaymentIntent(value); + if (!value) { + setRequestDcc(false); + } + }} /> } /> @@ -725,6 +732,17 @@ export default function CollectCardPaymentScreen() { /> } /> + setRequestDcc(value)} + /> + } + /> )} diff --git a/ios/StripeTerminalReactNative.swift b/ios/StripeTerminalReactNative.swift index 9d457f6d..44b8317f 100644 --- a/ios/StripeTerminalReactNative.swift +++ b/ios/StripeTerminalReactNative.swift @@ -171,7 +171,7 @@ class StripeTerminalReactNative: RCTEventEmitter, DiscoveryDelegate, BluetoothRe let simulated = params["simulated"] as? Bool let discoveryMethod = params["discoveryMethod"] as? String let timeout = params["timeout"] as? UInt ?? 0 - + let config: DiscoveryConfiguration do { config = try Mappers.mapToDiscoveryConfiguration(discoveryMethod, simulated: simulated ?? false, timeout: timeout) @@ -517,11 +517,13 @@ class StripeTerminalReactNative: RCTEventEmitter, DiscoveryDelegate, BluetoothRe let skipTipping = params["skipTipping"] as? Bool ?? false let updatePaymentIntent = params["updatePaymentIntent"] as? Bool ?? false let enableCustomerCancellation = params["enableCustomerCancellation"] as? Bool ?? false + let requestDynamicCurrencyConversion = params["requestDynamicCurrencyConversion"] as? Bool ?? false let collectConfigBuilder = CollectConfigurationBuilder() .setSkipTipping(skipTipping) .setUpdatePaymentIntent(updatePaymentIntent) .setEnableCustomerCancellation(enableCustomerCancellation) + .setRequestDynamicCurrencyConversion(requestDynamicCurrencyConversion) if let eligibleAmount = params["tipEligibleAmount"] as? Int { do { @@ -949,7 +951,7 @@ class StripeTerminalReactNative: RCTEventEmitter, DiscoveryDelegate, BluetoothRe resolve(result) } - + @objc(collectInputs:resolver:rejecter:) func collectInputs(_ params: NSDictionary, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { let invalidParams = Errors.validateRequiredParameters(params: params, requiredParams: ["collectInputs"]) @@ -958,9 +960,9 @@ class StripeTerminalReactNative: RCTEventEmitter, DiscoveryDelegate, BluetoothRe resolve(Errors.createError(code: CommonErrorType.InvalidRequiredParameter, message: "You must provide \(invalidParams!) parameters.")) return } - + let collectInputsParameters: CollectInputsParameters - + var inputs: [Input] = [] let collectInputs = params["collectInputs"] as? [NSDictionary] if let collectInputs = collectInputs { @@ -1173,14 +1175,14 @@ class StripeTerminalReactNative: RCTEventEmitter, DiscoveryDelegate, BluetoothRe } } } - + do { collectInputsParameters = try CollectInputsParametersBuilder(inputs: inputs).build() } catch { resolve(Errors.createError(nsError: error as NSError)) return } - + DispatchQueue.main.async { self.collectInputsCancellable = Terminal.shared.collectInputs(collectInputsParameters) { collectInputResults, error in if let error = error as NSError? { @@ -1191,7 +1193,7 @@ class StripeTerminalReactNative: RCTEventEmitter, DiscoveryDelegate, BluetoothRe } } } - + @objc(cancelCollectInputs:rejecter:) func cancelCollectInputs(resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { guard let cancelable = collectInputsCancellable else { @@ -1241,7 +1243,7 @@ class StripeTerminalReactNative: RCTEventEmitter, DiscoveryDelegate, BluetoothRe } } } - + @objc(supportsReadersOfType:resolver:rejecter:) func supportsReadersOfType(params: NSDictionary, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { let invalidParams = Errors.validateRequiredParameters(params: params, requiredParams: ["deviceType", "discoveryMethod"]) diff --git a/src/types/index.ts b/src/types/index.ts index 1d16d237..a9706431 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -193,6 +193,7 @@ export type CollectPaymentMethodParams = { tipEligibleAmount?: number; updatePaymentIntent?: boolean; enableCustomerCancellation?: boolean; + requestDynamicCurrencyConversion?: boolean; }; export type CollectSetupIntentPaymentMethodParams = {