Skip to content

Commit 8725085

Browse files
Add PaymentSheet FlowController didCancel presentation APIs to React Native SDK (#2079)
* added didCancel support in React Native * update ios version * revert podfile lock * revert script changes * remove console log * applied suggestion * default nil * cleaner? * lint * changelog
1 parent 13f03bf commit 8725085

File tree

7 files changed

+18
-6
lines changed

7 files changed

+18
-6
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# CHANGELOG
22

3+
## X.XX.X - XXXX-XX-XX
4+
**Features**
5+
- [#2079](https://github.com/stripe/stripe-react-native/pull/2079) Added support to differentiate between a user closing FlowController and selecting a payment option
6+
37
## 0.51.0 - 2025-08-20
48

59
**Features**

android/src/main/java/com/reactnativestripesdk/PaymentSheetFragment.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,8 @@ class PaymentSheetFragment :
132132
val option: WritableMap = WritableNativeMap()
133133
option.putString("label", it.label)
134134
option.putString("image", imageString)
135-
createResult("paymentOption", option)
135+
val additionalFields: Map<String, Any> = mapOf("didCancel" to paymentOptionResult.didCancel)
136+
createResult("paymentOption", option, additionalFields)
136137
}
137138
?: run {
138139
if (paymentSheetTimedOut) {

android/src/main/java/com/reactnativestripesdk/utils/Mappers.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,11 @@ import com.stripe.android.paymentsheet.PaymentSheet
3333
internal fun createResult(
3434
key: String,
3535
value: WritableMap,
36+
additionalFields: Map<String, Any>? = null,
3637
): WritableMap {
3738
val map = WritableNativeMap()
3839
map.putMap(key, value)
40+
additionalFields?.let { map.merge(it.toReadableMap()) }
3941
return map
4042
}
4143

ios/Mappers.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ import Stripe
22
import StripePaymentSheet
33

44
class Mappers {
5-
class func createResult(_ key: String, _ value: NSDictionary?) -> NSDictionary {
6-
return [key: value ?? NSNull()]
5+
class func createResult(_ key: String, _ value: NSDictionary?, additionalFields: [String: Any]? = nil) -> NSDictionary {
6+
let result = NSMutableDictionary()
7+
result[key] = value ?? NSNull()
8+
additionalFields?.forEach { (a, b) in result[a] = b }
9+
return result
710
}
811

912
class func mapToPKContactField(field: String) -> PKContactField {

ios/StripeSdkImpl.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,14 +211,14 @@ public class StripeSdkImpl: NSObject, UIAdaptivePresentationControllerDelegate {
211211
paymentSheetViewController = UIApplication.shared.delegate?.window??.rootViewController ?? UIViewController()
212212
if let paymentSheetFlowController = self.paymentSheetFlowController {
213213
paymentSheetFlowController.presentPaymentOptions(from: findViewControllerPresenter(from: paymentSheetViewController!)
214-
) {
214+
) { didCancel in
215215
paymentSheetViewController = nil
216216
if let paymentOption = self.paymentSheetFlowController?.paymentOption {
217217
let option: NSDictionary = [
218218
"label": paymentOption.label,
219219
"image": paymentOption.image.pngData()?.base64EncodedString() ?? ""
220220
]
221-
resolve(Mappers.createResult("paymentOption", option))
221+
resolve(Mappers.createResult("paymentOption", option, additionalFields: ["didCancel": didCancel]))
222222
} else {
223223
resolve(Errors.createError(ErrorType.Canceled, "The payment option selection flow has been canceled"))
224224
}

src/functions.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ export const presentPaymentSheet = async (
435435
options: PaymentSheet.PresentOptions = {}
436436
): Promise<PresentPaymentSheetResult> => {
437437
try {
438-
const { paymentOption, error } =
438+
const { paymentOption, didCancel, error } =
439439
await NativeStripeSdk.presentPaymentSheet(options);
440440
if (error) {
441441
return {
@@ -444,6 +444,7 @@ export const presentPaymentSheet = async (
444444
}
445445
return {
446446
paymentOption: paymentOption!,
447+
didCancel: didCancel,
447448
};
448449
} catch (error: any) {
449450
return {

src/types/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ export type InitPaymentSheetResult =
154154

155155
export type PresentPaymentSheetResult = {
156156
paymentOption?: PaymentSheet.PaymentOption | undefined;
157+
didCancel?: boolean;
157158
error?: StripeError<PaymentSheetError> | undefined;
158159
};
159160

0 commit comments

Comments
 (0)