Skip to content

Commit 61ebf8d

Browse files
committed
Show checkbox for sepa based payment methods to set allow_redisplay
1 parent 310439c commit 61ebf8d

File tree

2 files changed

+47
-4
lines changed

2 files changed

+47
-4
lines changed

StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/PaymentMethodType.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ extension PaymentSheet {
457457
}
458458
// This payment method and its requirements are hardcoded on the client
459459
switch paymentMethodType {
460-
case .card, .USBankAccount:
460+
case .card, .USBankAccount, .iDEAL, .sofort, .bancontact, .SEPADebit:
461461
return true
462462
default:
463463
return false

StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/PaymentSheetFormFactory/PaymentSheetFormFactory.swift

+46-3
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,8 @@ class PaymentSheetFormFactory {
206206
return makeiDEAL(spec: spec)
207207
} else if paymentMethod == .sofort {
208208
return makeSofort(spec: spec)
209+
} else if paymentMethod == .SEPADebit {
210+
return makeSepaDebit(spec: spec)
209211
}
210212

211213
// 2. Element-based forms defined in JSON
@@ -457,22 +459,42 @@ extension PaymentSheetFormFactory {
457459
}
458460
}()
459461
let mandate: Element? = isSettingUp ? makeSepaMandate() : nil // Note: We show a SEPA mandate b/c sofort saves bank details as a SEPA Direct Debit Payment Method
460-
let elements: [Element?] = [contactSection, addressSection, mandate]
462+
let checkboxElement: Element? = makeSepaBasedPMCheckbox()
463+
let elements: [Element?] = [contactSection, addressSection, checkboxElement, mandate]
461464
return FormElement(
462465
autoSectioningElements: elements.compactMap { $0 },
463466
theme: theme
464467
)
465468
}
466469

470+
func makeSepaDebit(spec: FormSpec) -> PaymentMethodElement {
471+
let contactSection: Element? = makeContactInformationSection(
472+
nameRequiredByPaymentMethod: true,
473+
emailRequiredByPaymentMethod: true,
474+
phoneRequiredByPaymentMethod: false
475+
)
476+
let iban: Element = makeIban()
477+
let mandate: Element? = makeSepaMandate()
478+
let addressSection: Element? = makeBillingAddressSection()
479+
let checkboxElement: Element? = makeSepaBasedPMCheckbox()
480+
let elements: [Element?] = [contactSection, iban, addressSection, checkboxElement, mandate]
481+
return FormElement(
482+
autoSectioningElements: elements.compactMap { $0 },
483+
theme: theme
484+
)
485+
}
486+
487+
467488
func makeBancontact() -> PaymentMethodElement {
468489
let contactSection: Element? = makeContactInformationSection(
469490
nameRequiredByPaymentMethod: true,
470491
emailRequiredByPaymentMethod: isSettingUp,
471492
phoneRequiredByPaymentMethod: false
472493
)
473494
let addressSection: Element? = makeBillingAddressSectionIfNecessary(requiredByPaymentMethod: false)
495+
let checkboxElement: Element? = makeSepaBasedPMCheckbox()
474496
let mandate: Element? = isSettingUp ? makeSepaMandate() : nil // Note: We show a SEPA mandate b/c iDEAL saves bank details as a SEPA Direct Debit Payment Method
475-
let elements: [Element?] = [contactSection, addressSection, mandate]
497+
let elements: [Element?] = [contactSection, addressSection, checkboxElement, mandate]
476498
return FormElement(
477499
autoSectioningElements: elements.compactMap { $0 },
478500
theme: theme
@@ -518,7 +540,8 @@ extension PaymentSheetFormFactory {
518540

519541
let addressSection: Element? = makeBillingAddressSectionIfNecessary(requiredByPaymentMethod: false)
520542
let mandate: Element? = isSettingUp ? makeSepaMandate() : nil // Note: We show a SEPA mandate b/c iDEAL saves bank details as a SEPA Direct Debit Payment Method
521-
let elements: [Element?] = [contactSection, bankDropdown, addressSection, mandate]
543+
let checkboxElement = makeSepaBasedPMCheckbox()
544+
let elements: [Element?] = [contactSection, bankDropdown, addressSection, checkboxElement, mandate]
522545
return FormElement(
523546
autoSectioningElements: elements.compactMap { $0 },
524547
theme: theme
@@ -602,6 +625,26 @@ extension PaymentSheetFormFactory {
602625
return FormElement(elements: [contactInfoSection, billingDetails], theme: theme)
603626
}
604627

628+
// Only show checkbox for PI+SFU & Setup Intent
629+
func makeSepaBasedPMCheckbox() -> Element? {
630+
let isSaving = BoolReference()
631+
let saveCheckbox = makeSaveCheckbox(
632+
label: String(
633+
format: STPLocalizedString(
634+
"Save this account for future %@ payments",
635+
"Prompt next to checkbox to save bank account."
636+
),
637+
configuration.merchantDisplayName
638+
)
639+
) { value in
640+
isSaving.value = value
641+
}
642+
isSaving.value = shouldDisplaySaveCheckbox && isSettingUp
643+
? configuration.savePaymentMethodOptInBehavior.isSelectedByDefault : isSettingUp
644+
645+
return shouldDisplaySaveCheckbox && isSettingUp ? saveCheckbox : nil
646+
}
647+
605648
func makeCountry(countryCodes: [String]?, apiPath: String? = nil) -> PaymentMethodElement {
606649
let locale = Locale.current
607650
let resolvedCountryCodes = countryCodes ?? addressSpecProvider.countries

0 commit comments

Comments
 (0)