From 7f1d6ec67da99467a11976afe6a5e0708e377bb3 Mon Sep 17 00:00:00 2001 From: Mina W Alphonce Date: Sat, 4 May 2024 12:59:14 +0200 Subject: [PATCH] feat: :zap: Update payment details after calling initPaymentSheet --- .../PaymentSheetFragment.kt | 23 ++ .../reactnativestripesdk/StripeSdkModule.kt | 10 + example/server/index.ts | 5 +- example/src/App.tsx | 6 + example/src/screens/HomeScreen.tsx | 10 + ...ferredIntentMultiStepScreenWithUpdates.tsx | 311 ++++++++++++++++++ ios/StripeSdk+PaymentSheet.swift | 36 ++ ios/StripeSdk.m | 7 + ios/StripeSdk.swift | 10 +- src/NativeStripeSdk.tsx | 3 + src/functions.ts | 43 +++ src/hooks/useStripe.tsx | 11 + 12 files changed, 472 insertions(+), 3 deletions(-) create mode 100644 example/src/screens/PaymentSheetDeferredIntentMultiStepScreenWithUpdates.tsx diff --git a/android/src/main/java/com/reactnativestripesdk/PaymentSheetFragment.kt b/android/src/main/java/com/reactnativestripesdk/PaymentSheetFragment.kt index 75fabe128..8950bd9a6 100644 --- a/android/src/main/java/com/reactnativestripesdk/PaymentSheetFragment.kt +++ b/android/src/main/java/com/reactnativestripesdk/PaymentSheetFragment.kt @@ -292,6 +292,29 @@ class PaymentSheetFragment( flowController?.confirm() } + fun updateIntentConfiguration(bundle: Bundle, promise: Promise){ + val onFlowControllerConfigure = PaymentSheet.FlowController.ConfigCallback { _, _ -> + val result = flowController?.getPaymentOption()?.let { + val bitmap = getBitmapFromVectorDrawable(context, it.drawableResourceId) + val imageString = getBase64FromBitmap(bitmap) + val option: WritableMap = WritableNativeMap() + option.putString("label", it.label) + option.putString("image", imageString) + createResult("paymentOption", option) + } ?: run { + WritableNativeMap() + } + promise.resolve(result) + } + + this.intentConfiguration = buildIntentConfiguration(bundle); + this.flowController?.configureWithIntentConfiguration( + intentConfiguration = this.intentConfiguration!!, + configuration = paymentSheetConfiguration, + callback = onFlowControllerConfigure + ); + } + private fun configureFlowController() { val onFlowControllerConfigure = PaymentSheet.FlowController.ConfigCallback { _, _ -> val result = flowController?.getPaymentOption()?.let { diff --git a/android/src/main/java/com/reactnativestripesdk/StripeSdkModule.kt b/android/src/main/java/com/reactnativestripesdk/StripeSdkModule.kt index 1a85a6cf2..0f0a8cfd2 100644 --- a/android/src/main/java/com/reactnativestripesdk/StripeSdkModule.kt +++ b/android/src/main/java/com/reactnativestripesdk/StripeSdkModule.kt @@ -176,6 +176,16 @@ class StripeSdkModule(reactContext: ReactApplicationContext) : ReactContextBaseJ } } + @ReactMethod + fun updatePaymentSheet(params: ReadableMap, promise: Promise){ + if (paymentSheetFragment == null) { + promise.resolve(PaymentSheetFragment.createMissingInitError()) + return + } + val bundle = toBundleObject(params); + paymentSheetFragment?.updateIntentConfiguration(bundle,promise); + } + @ReactMethod fun presentPaymentSheet(options: ReadableMap, promise: Promise) { if (paymentSheetFragment == null) { diff --git a/example/server/index.ts b/example/server/index.ts index 33c06e01b..463f25e3b 100644 --- a/example/server/index.ts +++ b/example/server/index.ts @@ -710,14 +710,15 @@ app.post('/payment-intent-for-payment-sheet', async (req, res) => { try { const paymentIntent = await stripe.paymentIntents.create({ - amount: 5099, - currency: 'usd', + amount: req.body.amount || 5099, + currency: req.body.currency || 'usd', payment_method: req.body.paymentMethodId, customer: req.body.customerId, }); return res.send({ clientSecret: paymentIntent.client_secret }); } catch (e) { + console.log(e); return res.send({ error: e }); } }); diff --git a/example/src/App.tsx b/example/src/App.tsx index ecfb20733..529c9fd73 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -43,6 +43,7 @@ import CollectBankAccountScreen from './screens/CollectBankAccountScreen'; import CashAppScreen from './screens/CashAppScreen'; import PaymentSheetDeferredIntentScreen from './screens/PaymentSheetDeferredIntentScreen'; import PaymentSheetDeferredIntentMultiStepScreen from './screens/PaymentSheetDeferredIntentMultiStepScreen'; +import PaymentSheetDeferredIntentMultiStepScreenWithUpdates from './screens/PaymentSheetDeferredIntentMultiStepScreenWithUpdates'; import CustomerSheetScreen from './screens/CustomerSheetScreen'; import RevolutPayScreen from './screens/RevolutPayScreen'; @@ -89,6 +90,7 @@ export type RootStackParamList = { CollectBankAccountScreen: undefined; PaymentSheetDeferredIntentScreen: undefined; PaymentSheetDeferredIntentMultiStepScreen: undefined; + PaymentSheetDeferredIntentMultiStepScreenWithUpdates: undefined; CustomerSheetScreen: undefined; RevolutPayScreen: undefined; }; @@ -165,6 +167,10 @@ export default function App() { name="PaymentSheetDeferredIntentMultiStepScreen" component={PaymentSheetDeferredIntentMultiStepScreen} /> + + +