From 623cfd97bb4d39c07e98113ec4fea0dc55015f8d Mon Sep 17 00:00:00 2001 From: Nick Porter Date: Fri, 10 May 2024 11:56:04 -0600 Subject: [PATCH 01/20] Add ability to toggle edit mode --- .../Source/Categories/String+Localized.swift | 7 +++ ...merSavedPaymentMethodsViewController.swift | 2 +- .../PaymentMethodRowButton.swift | 47 ++++++++++++++++--- ...calSavedPaymentMethodsViewController.swift | 44 +++++++++++++++-- .../BottomSheet3DS2ViewController.swift | 2 +- ...entSheetFlowControllerViewController.swift | 2 +- .../PaymentSheetViewController.swift | 2 +- .../PollingViewController.swift | 2 +- .../UpdateCardViewController.swift | 2 +- .../Views/SheetNavigationBar.swift | 9 ++-- 10 files changed, 99 insertions(+), 20 deletions(-) diff --git a/StripePaymentSheet/StripePaymentSheet/Source/Categories/String+Localized.swift b/StripePaymentSheet/StripePaymentSheet/Source/Categories/String+Localized.swift index 45cd2b8971a..a076bf446ca 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/Categories/String+Localized.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/Categories/String+Localized.swift @@ -254,4 +254,11 @@ extension String.Localized { "Select your payment method", "Title shown above a carousel containing the customer's payment methods") } + + static var manage_payment_methods: String { + STPLocalizedString( + "Manage payment methods", + "Title shown above a view containing the customer's card payment methods that they can delete or update" + ) + } } diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/CustomerSheet/CustomerSavedPaymentMethodsViewController.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/CustomerSheet/CustomerSavedPaymentMethodsViewController.swift index 5728ae9f5fe..6d7c7b05844 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/CustomerSheet/CustomerSavedPaymentMethodsViewController.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/CustomerSheet/CustomerSavedPaymentMethodsViewController.swift @@ -324,7 +324,7 @@ class CustomerSavedPaymentMethodsViewController: UIViewController { self.navigationBar.additionalButton.removeTarget( self, action: #selector(didSelectEditSavedPaymentMethodsButton), for: .touchUpInside) - return shouldShowPaymentMethodCarousel ? .back : .close(showAdditionalButton: false) + return shouldShowPaymentMethodCarousel ? .back(showAdditionalButton: false) : .close(showAdditionalButton: false) } }()) } diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift index ba6864be560..f635576f2de 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift @@ -25,16 +25,49 @@ final class PaymentMethodRowButton: UIView { // TODO(porter) Add can remove and can update } + enum State { + case selected + case unselected + case editing + } + // MARK: Internal properties - // TODO(porter) Maybe expand this into an enum of (selected, unselected, editing) state + var state: State = .unselected { + didSet { + previousState = oldValue + + switch state { + case .selected: + shadowRoundedRect.isSelected = true + circleView.alpha = 1.0 + case .unselected: + shadowRoundedRect.isSelected = false + circleView.alpha = 0.0 + case .editing: + shadowRoundedRect.isSelected = false + circleView.alpha = 0.0 + // TODO(porter) show edit buttons (edit and delete) + } + } + } + + private(set) var previousState: State = .unselected + var isSelected: Bool { - get { - return shadowRoundedRect.isSelected + switch state { + case .selected: + return true + case .unselected, .editing: + return false } + } - set { - shadowRoundedRect.isSelected = newValue - circleView.alpha = newValue ? 1.0 : 0.0 + var isEditing: Bool { + switch state { + case .selected, .unselected: + return false + case .editing: + return true } } @@ -109,6 +142,8 @@ final class PaymentMethodRowButton: UIView { // MARK: Tap handlers @objc private func handleTap() { + // Ignore selection taps when editing + guard !isEditing else { return } shadowRoundedRect.isSelected = true circleView.alpha = 1.0 delegate?.didSelectButton(self) diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/VerticalSavedPaymentMethodsViewController.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/VerticalSavedPaymentMethodsViewController.swift index d1defd75007..eaae9dabe51 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/VerticalSavedPaymentMethodsViewController.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/VerticalSavedPaymentMethodsViewController.swift @@ -21,6 +21,31 @@ class VerticalSavedPaymentMethodsViewController: UIViewController { private let configuration: PaymentSheet.Configuration private let paymentMethods: [STPPaymentMethod] + private var isEditingPaymentMethods: Bool = false { + didSet { + let additionalButtonTitle = isEditingPaymentMethods ? UIButton.doneButtonTitle : UIButton.editButtonTitle + navigationBar.additionalButton.setTitle(additionalButtonTitle, for: .normal) + headerLabel.text = headerText + + // If we are entering edit mode, put all buttons in an edit state, otherwise put back in their previous state + if isEditingPaymentMethods { + paymentMethodRows.map { $0.button }.forEach { $0.state = .editing } + } else { + paymentMethodRows.map { $0.button }.forEach { $0.state = $0.previousState } + } + // TODO(porter) Handle case where we delete the selected card + } + } + + private var headerText: String { + if isEditingPaymentMethods { + return .Localized.manage_payment_methods + } + + let nonCardPaymentMethods = paymentMethods.filter({ $0.type != .card }) + return nonCardPaymentMethods.isEmpty ? .Localized.select_card : .Localized.select_payment_method + } + // MARK: Internal properties weak var delegate: VerticalSavedPaymentMethodsViewControllerDelegate? @@ -29,15 +54,19 @@ class VerticalSavedPaymentMethodsViewController: UIViewController { lazy var navigationBar: SheetNavigationBar = { let navBar = SheetNavigationBar(isTestMode: configuration.apiClient.isTestmode, appearance: configuration.appearance) - navBar.setStyle(.back) + // TODO(porter) Only show edit button if we should + navBar.setStyle(.back(showAdditionalButton: true)) navBar.delegate = self + navBar.additionalButton.setTitle(UIButton.editButtonTitle, for: .normal) + navBar.additionalButton.accessibilityIdentifier = "edit_saved_button" + navBar.additionalButton.titleLabel?.adjustsFontForContentSizeCategory = true + navBar.additionalButton.addTarget(self, action: #selector(didSelectEditSavedPaymentMethodsButton), for: .touchUpInside) return navBar }() private lazy var headerLabel: UILabel = { let label = PaymentSheetUI.makeHeaderLabel(appearance: configuration.appearance) - let nonCardPaymentMethods = paymentMethods.filter({ $0.type != .card }) - label.text = nonCardPaymentMethods.isEmpty ? .Localized.select_card : .Localized.select_payment_method + label.text = headerText return label }() @@ -76,9 +105,13 @@ class VerticalSavedPaymentMethodsViewController: UIViewController { view.backgroundColor = configuration.appearance.colors.background configuration.style.configure(self) // TODO(porter) Pipe in selected payment method, default to selecting first for now - paymentMethodRows.first?.button.isSelected = true + paymentMethodRows.first?.button.state = .selected view.addAndPinSubviewToSafeArea(stackView, insets: PaymentSheetUI.defaultSheetMargins) } + + @objc func didSelectEditSavedPaymentMethodsButton() { + isEditingPaymentMethods = !isEditingPaymentMethods + } } // MARK: - BottomSheetContentViewController @@ -120,10 +153,11 @@ extension VerticalSavedPaymentMethodsViewController: PaymentMethodRowButtonDeleg } // Deselect previous button - paymentMethodRows.first { $0.button != button && $0.button.isSelected }?.button.isSelected = false + paymentMethodRows.first { $0.button != button && $0.button.isSelected }?.button.state = .unselected // Disable interaction to prevent double selecting since we will be dismissing soon self.view.isUserInteractionEnabled = false + self.navigationBar.isUserInteractionEnabled = false // Tint buttons in the nav bar to look disabled // Give time for new selected row to show it has been selected before dismissing // Makes UX feel a little nicer diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/BottomSheet3DS2ViewController.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/BottomSheet3DS2ViewController.swift index ed8331861c3..6a9b3ee887d 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/BottomSheet3DS2ViewController.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/BottomSheet3DS2ViewController.swift @@ -24,7 +24,7 @@ class BottomSheet3DS2ViewController: UIViewController { lazy var navigationBar: SheetNavigationBar = { let navBar = SheetNavigationBar(isTestMode: isTestMode, appearance: appearance) - navBar.setStyle(.back) + navBar.setStyle(.back(showAdditionalButton: false)) navBar.delegate = self return navBar }() diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PaymentSheetFlowControllerViewController.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PaymentSheetFlowControllerViewController.swift index 6299f4496f0..a588b72d143 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PaymentSheetFlowControllerViewController.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PaymentSheetFlowControllerViewController.swift @@ -315,7 +315,7 @@ class PaymentSheetFlowControllerViewController: UIViewController, FlowController self, action: #selector(didSelectEditSavedPaymentMethodsButton), for: .touchUpInside) return savedPaymentOptionsViewController.hasPaymentOptions - ? .back : .close(showAdditionalButton: false) + ? .back(showAdditionalButton: false) : .close(showAdditionalButton: false) } }()) } diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PaymentSheetViewController.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PaymentSheetViewController.swift index e5300d0c85b..c3cd12337d1 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PaymentSheetViewController.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PaymentSheetViewController.swift @@ -284,7 +284,7 @@ class PaymentSheetViewController: UIViewController, PaymentSheetViewControllerPr action: #selector(didSelectEditSavedPaymentMethodsButton), for: .touchUpInside ) - return !savedPaymentOptionsViewController.hasPaymentOptions ? .close(showAdditionalButton: false) : .back + return !savedPaymentOptionsViewController.hasPaymentOptions ? .close(showAdditionalButton: false) : .back(showAdditionalButton: false) } }() ) diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PollingViewController.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PollingViewController.swift index d42e0efad7b..69a5198d54e 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PollingViewController.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PollingViewController.swift @@ -280,7 +280,7 @@ class PollingViewController: UIViewController { self.cancelButton.isHidden = true self.titleLabel.text = .Localized.payment_failed self.instructionLabel.text = .Localized.please_go_back - self.navigationBar.setStyle(.back) + self.navigationBar.setStyle(.back(showAdditionalButton: false)) self.intentPoller.suspendPolling() self.oneSecondTimer?.invalidate() diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/UpdateCardViewController.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/UpdateCardViewController.swift index 3ae1c0ff912..d4751d6fcfe 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/UpdateCardViewController.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/UpdateCardViewController.swift @@ -42,7 +42,7 @@ final class UpdateCardViewController: UIViewController { let navBar = SheetNavigationBar(isTestMode: isTestMode, appearance: appearance) navBar.delegate = self - navBar.setStyle(.back) + navBar.setStyle(.back(showAdditionalButton: false)) return navBar }() diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Views/SheetNavigationBar.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Views/SheetNavigationBar.swift index 57c1f8202f2..a146caca654 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Views/SheetNavigationBar.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Views/SheetNavigationBar.swift @@ -132,16 +132,19 @@ class SheetNavigationBar: UIView { // MARK: - enum Style { case close(showAdditionalButton: Bool) - case back + case back(showAdditionalButton: Bool) case none } func setStyle(_ style: Style) { switch style { - case .back: + case .back(let showAdditionalButton): closeButtonLeft.isHidden = true closeButtonRight.isHidden = true - additionalButton.isHidden = true + additionalButton.isHidden = !showAdditionalButton + if showAdditionalButton { + bringSubviewToFront(additionalButton) + } backButton.isHidden = false bringSubviewToFront(backButton) case .close(let showAdditionalButton): From d1d2a17125f62527fc039e92eb2fb4993f673128 Mon Sep 17 00:00:00 2001 From: Nick Porter Date: Fri, 10 May 2024 12:17:15 -0600 Subject: [PATCH 02/20] Add edit and delete buttons --- .../PaymentMethodRowButton.swift | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift index f635576f2de..f45b2184c9f 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift @@ -40,12 +40,18 @@ final class PaymentMethodRowButton: UIView { case .selected: shadowRoundedRect.isSelected = true circleView.alpha = 1.0 + deleteButton.isHidden = true + editButton.isHidden = true case .unselected: shadowRoundedRect.isSelected = false circleView.alpha = 0.0 + deleteButton.isHidden = true + editButton.isHidden = true case .editing: shadowRoundedRect.isSelected = false circleView.alpha = 0.0 + deleteButton.isHidden = false + editButton.isHidden = false // TODO(porter) show edit buttons (edit and delete) } } @@ -100,9 +106,25 @@ final class PaymentMethodRowButton: UIView { circleView.alpha = 0.0 return circleView }() + + lazy var deleteButton: CircularButton = { + let deleteButton = CircularButton(style: .remove, iconColor: .white) + deleteButton.backgroundColor = viewModel.appearance.colors.danger + deleteButton.isHidden = true + return deleteButton + }() + + private lazy var editButton: CircularButton = { + let editButton = CircularButton(style: .edit, iconColor: viewModel.appearance.colors.icon) + editButton.backgroundColor = UIColor.dynamic(light: .systemGray5, + dark: viewModel.appearance.colors.componentBackground.lighten(by: 0.075)) + editButton.isHidden = true + // TODO(porter) Handle tap + return editButton + }() private lazy var stackView: UIStackView = { - let stackView = UIStackView(arrangedSubviews: [paymentMethodImageView, label, UIView.spacerView, circleView]) + let stackView = UIStackView(arrangedSubviews: [paymentMethodImageView, label, UIView.spacerView, circleView, editButton, deleteButton]) stackView.axis = .horizontal stackView.alignment = .center stackView.translatesAutoresizingMaskIntoConstraints = false @@ -111,7 +133,8 @@ final class PaymentMethodRowButton: UIView { bottom: 12, trailing: PaymentSheetUI.defaultPadding) stackView.isLayoutMarginsRelativeArrangement = true - stackView.setCustomSpacing(12, after: paymentMethodImageView) // Hardcoded from figma + stackView.spacing = 12 // Hardcoded from figma + return stackView }() From 355620b5503dfeb8ed36d0d53c54065375d6a8ad Mon Sep 17 00:00:00 2001 From: Nick Porter Date: Fri, 10 May 2024 12:51:56 -0600 Subject: [PATCH 03/20] Add delegate methods for remove and edit --- .../PaymentMethodRowButton.swift | 66 +++++++++---------- ...calSavedPaymentMethodsViewController.swift | 25 ++++++- 2 files changed, 56 insertions(+), 35 deletions(-) diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift index f45b2184c9f..64d141cde2d 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift @@ -13,7 +13,9 @@ import UIKit protocol PaymentMethodRowButtonDelegate: AnyObject { func didSelectButton(_ button: PaymentMethodRowButton) - // TODO(porter) Add did delete and did update + func didSelectRemoveButton(_ button: PaymentMethodRowButton) + func didSelectEditButton(_ button: PaymentMethodRowButton) + // TODO(porter) Add did remove and did update } final class PaymentMethodRowButton: UIView { @@ -35,25 +37,12 @@ final class PaymentMethodRowButton: UIView { var state: State = .unselected { didSet { previousState = oldValue - - switch state { - case .selected: - shadowRoundedRect.isSelected = true - circleView.alpha = 1.0 - deleteButton.isHidden = true - editButton.isHidden = true - case .unselected: - shadowRoundedRect.isSelected = false - circleView.alpha = 0.0 - deleteButton.isHidden = true - editButton.isHidden = true - case .editing: - shadowRoundedRect.isSelected = false - circleView.alpha = 0.0 - deleteButton.isHidden = false - editButton.isHidden = false - // TODO(porter) show edit buttons (edit and delete) - } + + selectionTapGesture.isEnabled = !isEditing + shadowRoundedRect.isSelected = isSelected + circleView.alpha = isSelected ? 1.0 : 0.0 + editButton.isHidden = !isEditing + removeButton.isHidden = !isEditing } } @@ -107,11 +96,12 @@ final class PaymentMethodRowButton: UIView { return circleView }() - lazy var deleteButton: CircularButton = { - let deleteButton = CircularButton(style: .remove, iconColor: .white) - deleteButton.backgroundColor = viewModel.appearance.colors.danger - deleteButton.isHidden = true - return deleteButton + lazy var removeButton: CircularButton = { + let removeButton = CircularButton(style: .remove, iconColor: .white) + removeButton.backgroundColor = viewModel.appearance.colors.danger + removeButton.isHidden = true + removeButton.addTarget(self, action: #selector(handleRemoveButtonTapped), for: .touchUpInside) + return removeButton }() private lazy var editButton: CircularButton = { @@ -119,12 +109,12 @@ final class PaymentMethodRowButton: UIView { editButton.backgroundColor = UIColor.dynamic(light: .systemGray5, dark: viewModel.appearance.colors.componentBackground.lighten(by: 0.075)) editButton.isHidden = true - // TODO(porter) Handle tap + editButton.addTarget(self, action: #selector(handleEditButtonTapped), for: .touchUpInside) return editButton }() private lazy var stackView: UIStackView = { - let stackView = UIStackView(arrangedSubviews: [paymentMethodImageView, label, UIView.spacerView, circleView, editButton, deleteButton]) + let stackView = UIStackView(arrangedSubviews: [paymentMethodImageView, label, UIView.spacerView, circleView, editButton, removeButton]) stackView.axis = .horizontal stackView.alignment = .center stackView.translatesAutoresizingMaskIntoConstraints = false @@ -144,6 +134,10 @@ final class PaymentMethodRowButton: UIView { shadowRoundedRect.addAndPinSubview(stackView) return shadowRoundedRect }() + + private lazy var selectionTapGesture: UITapGestureRecognizer = { + return UITapGestureRecognizer(target: self, action: #selector(handleSelectionTap)) + }() init(viewModel: ViewModel) { self.viewModel = viewModel @@ -155,8 +149,7 @@ final class PaymentMethodRowButton: UIView { paymentMethodImageView.widthAnchor.constraint(equalToConstant: 25), ]) // TODO(porter) accessibility? - let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap)) - addGestureRecognizer(tapGesture) + addGestureRecognizer(selectionTapGesture) } required init?(coder aDecoder: NSCoder) { @@ -164,13 +157,18 @@ final class PaymentMethodRowButton: UIView { } // MARK: Tap handlers - @objc private func handleTap() { - // Ignore selection taps when editing - guard !isEditing else { return } - shadowRoundedRect.isSelected = true - circleView.alpha = 1.0 + @objc private func handleSelectionTap() { + state = .selected delegate?.didSelectButton(self) } + + @objc private func handleEditButtonTapped() { + delegate?.didSelectEditButton(self) + } + + @objc private func handleRemoveButtonTapped() { + delegate?.didSelectRemoveButton(self) + } } diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/VerticalSavedPaymentMethodsViewController.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/VerticalSavedPaymentMethodsViewController.swift index eaae9dabe51..958b8a92e6b 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/VerticalSavedPaymentMethodsViewController.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/VerticalSavedPaymentMethodsViewController.swift @@ -146,8 +146,13 @@ extension VerticalSavedPaymentMethodsViewController: SheetNavigationBarDelegate // MARK: - PaymentMethodRowButtonDelegate extension VerticalSavedPaymentMethodsViewController: PaymentMethodRowButtonDelegate { + + private func paymentMethod(from button: PaymentMethodRowButton) -> STPPaymentMethod? { + return paymentMethodRows.first(where: { $0.button === button })?.paymentMethod + } + func didSelectButton(_ button: PaymentMethodRowButton) { - guard let paymentMethod = paymentMethodRows.first(where: { $0.button === button })?.paymentMethod else { + guard let paymentMethod = paymentMethod(from: button) else { // TODO(porter) Handle error - no matching payment method found return } @@ -166,4 +171,22 @@ extension VerticalSavedPaymentMethodsViewController: PaymentMethodRowButtonDeleg self?.delegate?.didSelectPaymentMethod(paymentMethod) } } + + func didSelectRemoveButton(_ button: PaymentMethodRowButton) { + guard let paymentMethod = paymentMethod(from: button) else { + // TODO(porter) Handle error - no matching payment method found + return + } + + print("Remove payment method with id: \(paymentMethod.stripeId)") + } + + func didSelectEditButton(_ button: PaymentMethodRowButton) { + guard let paymentMethod = paymentMethod(from: button) else { + // TODO(porter) Handle error - no matching payment method found + return + } + + print("Edit payment method with id: \(paymentMethod.stripeId)") + } } From 0f1958af437516492c29b9bdbcc30b282752da6f Mon Sep 17 00:00:00 2001 From: Nick Porter Date: Fri, 10 May 2024 12:52:26 -0600 Subject: [PATCH 04/20] Lint --- .../PaymentMethodRowButton.swift | 14 +++++++------- ...VerticalSavedPaymentMethodsViewController.swift | 12 ++++++------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift index 64d141cde2d..50979e83556 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift @@ -37,7 +37,7 @@ final class PaymentMethodRowButton: UIView { var state: State = .unselected { didSet { previousState = oldValue - + selectionTapGesture.isEnabled = !isEditing shadowRoundedRect.isSelected = isSelected circleView.alpha = isSelected ? 1.0 : 0.0 @@ -95,7 +95,7 @@ final class PaymentMethodRowButton: UIView { circleView.alpha = 0.0 return circleView }() - + lazy var removeButton: CircularButton = { let removeButton = CircularButton(style: .remove, iconColor: .white) removeButton.backgroundColor = viewModel.appearance.colors.danger @@ -103,7 +103,7 @@ final class PaymentMethodRowButton: UIView { removeButton.addTarget(self, action: #selector(handleRemoveButtonTapped), for: .touchUpInside) return removeButton }() - + private lazy var editButton: CircularButton = { let editButton = CircularButton(style: .edit, iconColor: viewModel.appearance.colors.icon) editButton.backgroundColor = UIColor.dynamic(light: .systemGray5, @@ -124,7 +124,7 @@ final class PaymentMethodRowButton: UIView { trailing: PaymentSheetUI.defaultPadding) stackView.isLayoutMarginsRelativeArrangement = true stackView.spacing = 12 // Hardcoded from figma - + return stackView }() @@ -134,7 +134,7 @@ final class PaymentMethodRowButton: UIView { shadowRoundedRect.addAndPinSubview(stackView) return shadowRoundedRect }() - + private lazy var selectionTapGesture: UITapGestureRecognizer = { return UITapGestureRecognizer(target: self, action: #selector(handleSelectionTap)) }() @@ -161,11 +161,11 @@ final class PaymentMethodRowButton: UIView { state = .selected delegate?.didSelectButton(self) } - + @objc private func handleEditButtonTapped() { delegate?.didSelectEditButton(self) } - + @objc private func handleRemoveButtonTapped() { delegate?.didSelectRemoveButton(self) } diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/VerticalSavedPaymentMethodsViewController.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/VerticalSavedPaymentMethodsViewController.swift index 958b8a92e6b..dbd7b193c22 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/VerticalSavedPaymentMethodsViewController.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/VerticalSavedPaymentMethodsViewController.swift @@ -146,11 +146,11 @@ extension VerticalSavedPaymentMethodsViewController: SheetNavigationBarDelegate // MARK: - PaymentMethodRowButtonDelegate extension VerticalSavedPaymentMethodsViewController: PaymentMethodRowButtonDelegate { - + private func paymentMethod(from button: PaymentMethodRowButton) -> STPPaymentMethod? { return paymentMethodRows.first(where: { $0.button === button })?.paymentMethod } - + func didSelectButton(_ button: PaymentMethodRowButton) { guard let paymentMethod = paymentMethod(from: button) else { // TODO(porter) Handle error - no matching payment method found @@ -171,22 +171,22 @@ extension VerticalSavedPaymentMethodsViewController: PaymentMethodRowButtonDeleg self?.delegate?.didSelectPaymentMethod(paymentMethod) } } - + func didSelectRemoveButton(_ button: PaymentMethodRowButton) { guard let paymentMethod = paymentMethod(from: button) else { // TODO(porter) Handle error - no matching payment method found return } - + print("Remove payment method with id: \(paymentMethod.stripeId)") } - + func didSelectEditButton(_ button: PaymentMethodRowButton) { guard let paymentMethod = paymentMethod(from: button) else { // TODO(porter) Handle error - no matching payment method found return } - + print("Edit payment method with id: \(paymentMethod.stripeId)") } } From 4e2b58f41cc90575c56a125b285456d91c01c0e0 Mon Sep 17 00:00:00 2001 From: Nick Porter Date: Fri, 10 May 2024 13:11:16 -0600 Subject: [PATCH 05/20] Add localize string and remove TODO --- .../Resources/Localizations/en.lproj/Localizable.strings | 3 +++ .../PaymentMethodRowButton.swift | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/StripePaymentSheet/StripePaymentSheet/Resources/Localizations/en.lproj/Localizable.strings b/StripePaymentSheet/StripePaymentSheet/Resources/Localizations/en.lproj/Localizable.strings index 831d4fa7405..c52e8a903f8 100644 --- a/StripePaymentSheet/StripePaymentSheet/Resources/Localizations/en.lproj/Localizable.strings +++ b/StripePaymentSheet/StripePaymentSheet/Resources/Localizations/en.lproj/Localizable.strings @@ -122,6 +122,9 @@ /* iDEAL bank section title for iDEAL form entry. */ "iDEAL Bank" = "iDEAL Bank"; +/* Title shown above a view containing the customer's card payment methods that they can delete or update */ +"Manage payment methods" = "Manage payment methods"; + /* Title shown above a carousel containing the customer's payment methods */ "Manage your payment methods" = "Manage your payment methods"; diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift index 50979e83556..e902dd3b0ca 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift @@ -15,7 +15,6 @@ protocol PaymentMethodRowButtonDelegate: AnyObject { func didSelectButton(_ button: PaymentMethodRowButton) func didSelectRemoveButton(_ button: PaymentMethodRowButton) func didSelectEditButton(_ button: PaymentMethodRowButton) - // TODO(porter) Add did remove and did update } final class PaymentMethodRowButton: UIView { From 48f149a208bbac2f54627e0b06b6adecc873389a Mon Sep 17 00:00:00 2001 From: Nick Porter Date: Fri, 10 May 2024 13:19:49 -0600 Subject: [PATCH 06/20] Fix edit icon color --- .../PaymentMethodRowButton.swift | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift index e902dd3b0ca..8e1c483a16b 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift @@ -40,8 +40,8 @@ final class PaymentMethodRowButton: UIView { selectionTapGesture.isEnabled = !isEditing shadowRoundedRect.isSelected = isSelected circleView.alpha = isSelected ? 1.0 : 0.0 - editButton.isHidden = !isEditing - removeButton.isHidden = !isEditing + editButton.isHidden = !isEditing // TODO(porter) only show if we can edit + removeButton.isHidden = !isEditing // TOOD(porter) only show if we can remove } } @@ -104,9 +104,8 @@ final class PaymentMethodRowButton: UIView { }() private lazy var editButton: CircularButton = { - let editButton = CircularButton(style: .edit, iconColor: viewModel.appearance.colors.icon) - editButton.backgroundColor = UIColor.dynamic(light: .systemGray5, - dark: viewModel.appearance.colors.componentBackground.lighten(by: 0.075)) + let editButton = CircularButton(style: .edit, iconColor: .white) + editButton.backgroundColor = viewModel.appearance.colors.icon editButton.isHidden = true editButton.addTarget(self, action: #selector(handleEditButtonTapped), for: .touchUpInside) return editButton From 0bead0cfc1ff9bf5c34af8d63db0cc46430f0de1 Mon Sep 17 00:00:00 2001 From: Nick Porter Date: Fri, 10 May 2024 13:37:46 -0600 Subject: [PATCH 07/20] Improve string comment --- .../Resources/Localizations/en.lproj/Localizable.strings | 2 +- .../StripePaymentSheet/Source/Categories/String+Localized.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/StripePaymentSheet/StripePaymentSheet/Resources/Localizations/en.lproj/Localizable.strings b/StripePaymentSheet/StripePaymentSheet/Resources/Localizations/en.lproj/Localizable.strings index c52e8a903f8..53c0934e9a6 100644 --- a/StripePaymentSheet/StripePaymentSheet/Resources/Localizations/en.lproj/Localizable.strings +++ b/StripePaymentSheet/StripePaymentSheet/Resources/Localizations/en.lproj/Localizable.strings @@ -122,7 +122,7 @@ /* iDEAL bank section title for iDEAL form entry. */ "iDEAL Bank" = "iDEAL Bank"; -/* Title shown above a view containing the customer's card payment methods that they can delete or update */ +/* Title shown above a view containing the customer's payment methods that they can delete or update */ "Manage payment methods" = "Manage payment methods"; /* Title shown above a carousel containing the customer's payment methods */ diff --git a/StripePaymentSheet/StripePaymentSheet/Source/Categories/String+Localized.swift b/StripePaymentSheet/StripePaymentSheet/Source/Categories/String+Localized.swift index a076bf446ca..47cb0bb61ec 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/Categories/String+Localized.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/Categories/String+Localized.swift @@ -258,7 +258,7 @@ extension String.Localized { static var manage_payment_methods: String { STPLocalizedString( "Manage payment methods", - "Title shown above a view containing the customer's card payment methods that they can delete or update" + "Title shown above a view containing the customer's payment methods that they can delete or update" ) } } From c2ea128c6c40ed4f8090a52824a1fc07f5c6dd68 Mon Sep 17 00:00:00 2001 From: Nick Porter Date: Fri, 10 May 2024 13:55:43 -0600 Subject: [PATCH 08/20] Delete CheckmarkCircleView --- .../project.pbxproj | 4 -- .../CheckmarkCircleView.swift | 53 ------------------ .../PaymentMethodRowButton.swift | 9 +-- .../PaymentSheet/Views/CircularButton.swift | 5 ++ ...ewControllerSnapshotTestsAppearance@3x.png | Bin 113001 -> 116567 bytes ...iewControllerSnapshotTestsLightMode@3x.png | Bin 92120 -> 94696 bytes ...ViewControllerSnapshotTestsDarkMode@3x.png | Bin 83285 -> 83423 bytes 7 files changed, 10 insertions(+), 61 deletions(-) delete mode 100644 StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/CheckmarkCircleView.swift diff --git a/StripePaymentSheet/StripePaymentSheet.xcodeproj/project.pbxproj b/StripePaymentSheet/StripePaymentSheet.xcodeproj/project.pbxproj index e18609187f3..7b4cdf1358a 100644 --- a/StripePaymentSheet/StripePaymentSheet.xcodeproj/project.pbxproj +++ b/StripePaymentSheet/StripePaymentSheet.xcodeproj/project.pbxproj @@ -111,7 +111,6 @@ 6103F2BC2BE45990002D67F8 /* SavedPaymentMethodManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6103F2BB2BE45990002D67F8 /* SavedPaymentMethodManager.swift */; }; 614A8AE72BE53C6900E8688B /* SavedPaymentMethodManagerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6103F2BD2BE53737002D67F8 /* SavedPaymentMethodManagerTest.swift */; }; 6151DDC02B14FDCF00ED4F7E /* UpdateCardViewControllerSnapshotTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6151DDBF2B14FDCF00ED4F7E /* UpdateCardViewControllerSnapshotTests.swift */; }; - 6198AA6C2BED1AC000F39D3E /* CheckmarkCircleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6198AA6B2BED1AC000F39D3E /* CheckmarkCircleView.swift */; }; 6198AA6E2BED1C5A00F39D3E /* PaymentMethodRowButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6198AA6D2BED1C5A00F39D3E /* PaymentMethodRowButton.swift */; }; 61C0D3B8C63EB4558AB74A7E /* StripePayments.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A1C7CFA5C9C1A8A73CFA1C0 /* StripePayments.framework */; }; 61CB0BD02BED985100E24A4C /* VerticalSavedPaymentMethodsViewControllerSnapshotTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61CBE6672BED97EE005F7FEB /* VerticalSavedPaymentMethodsViewControllerSnapshotTests.swift */; }; @@ -433,7 +432,6 @@ 6151DDBF2B14FDCF00ED4F7E /* UpdateCardViewControllerSnapshotTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateCardViewControllerSnapshotTests.swift; sourceTree = ""; }; 617C44F9338DE2E93E318291 /* PayWithLinkWebController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PayWithLinkWebController.swift; sourceTree = ""; }; 6193FC5E14E1EC459E31B5F4 /* SheetNavigationButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SheetNavigationButton.swift; sourceTree = ""; }; - 6198AA6B2BED1AC000F39D3E /* CheckmarkCircleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckmarkCircleView.swift; sourceTree = ""; }; 6198AA6D2BED1C5A00F39D3E /* PaymentMethodRowButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentMethodRowButton.swift; sourceTree = ""; }; 61CBE6652BED9749005F7FEB /* VerticalSavedPaymentMethodsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VerticalSavedPaymentMethodsViewController.swift; sourceTree = ""; }; 61CBE6672BED97EE005F7FEB /* VerticalSavedPaymentMethodsViewControllerSnapshotTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VerticalSavedPaymentMethodsViewControllerSnapshotTests.swift; sourceTree = ""; }; @@ -836,7 +834,6 @@ children = ( 61CBE6652BED9749005F7FEB /* VerticalSavedPaymentMethodsViewController.swift */, 6198AA6D2BED1C5A00F39D3E /* PaymentMethodRowButton.swift */, - 6198AA6B2BED1AC000F39D3E /* CheckmarkCircleView.swift */, ); path = "Vertical Saved Payment Method Screen"; sourceTree = ""; @@ -1704,7 +1701,6 @@ F42DEC1850964E75ACAC29AB /* CustomerSheet+API.swift in Sources */, 50C68C68B007A926BE99B2B8 /* CustomerSheet+PaymentMethodAvailability.swift in Sources */, DB8A4C5FC11D0EED55E8C975 /* CustomerSheet+SwiftUI.swift in Sources */, - 6198AA6C2BED1AC000F39D3E /* CheckmarkCircleView.swift in Sources */, 648FDD85FD6ECDA1BBC71D45 /* CustomerSheet.swift in Sources */, 9E77F1E9F801AE970F1A5BE1 /* CustomerSheetConfiguration.swift in Sources */, AB8E1556F008083257A99E91 /* CustomerSheetError.swift in Sources */, diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/CheckmarkCircleView.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/CheckmarkCircleView.swift deleted file mode 100644 index 7a473d2e958..00000000000 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/CheckmarkCircleView.swift +++ /dev/null @@ -1,53 +0,0 @@ -// -// CheckmarkCircleView.swift -// StripePaymentSheet -// -// Created by Nick Porter on 5/9/24. -// - -import Foundation -import UIKit - -/// Draws a circle with the desired fill color with a white checkmark in the center -final class CheckmarkCircleView: UIView { - - let checkmarkColor: UIColor = .white - let fillColor: UIColor - - init(fillColor: UIColor) { - self.fillColor = fillColor - super.init(frame: .zero) - self.backgroundColor = .clear - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override var intrinsicContentSize: CGSize { - return CGSize(width: 20, height: 20) - } - - override func draw(_ rect: CGRect) { - super.draw(rect) - drawCircle() - drawCheckmark() - } - - private func drawCircle() { - let path = UIBezierPath(ovalIn: CGRect(origin: .zero, size: intrinsicContentSize)) - fillColor.setFill() - path.fill() - } - - private func drawCheckmark() { - let path = UIBezierPath() - path.lineWidth = max(2, intrinsicContentSize.width * 0.06) - path.move(to: CGPoint(x: intrinsicContentSize.width * 0.28, y: intrinsicContentSize.height * 0.53)) - path.addLine(to: CGPoint(x: intrinsicContentSize.width * 0.42, y: intrinsicContentSize.height * 0.66)) - path.addLine(to: CGPoint(x: intrinsicContentSize.width * 0.72, y: intrinsicContentSize.height * 0.36)) - - checkmarkColor.setStroke() - path.stroke() - } -} diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift index 8e1c483a16b..eaba3fbc421 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/Vertical Saved Payment Method Screen/PaymentMethodRowButton.swift @@ -39,7 +39,7 @@ final class PaymentMethodRowButton: UIView { selectionTapGesture.isEnabled = !isEditing shadowRoundedRect.isSelected = isSelected - circleView.alpha = isSelected ? 1.0 : 0.0 + circleView.isHidden = !isSelected editButton.isHidden = !isEditing // TODO(porter) only show if we can edit removeButton.isHidden = !isEditing // TOOD(porter) only show if we can remove } @@ -89,9 +89,10 @@ final class PaymentMethodRowButton: UIView { return label }() - private lazy var circleView: CheckmarkCircleView = { - let circleView = CheckmarkCircleView(fillColor: viewModel.appearance.colors.primary) - circleView.alpha = 0.0 + private lazy var circleView: CircularButton = { + let circleView = CircularButton(style: .check, iconColor: .white) + circleView.backgroundColor = viewModel.appearance.colors.primary + circleView.isHidden = true return circleView }() diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Views/CircularButton.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Views/CircularButton.swift index d12fed7a428..f2b3edcb5e9 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Views/CircularButton.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Views/CircularButton.swift @@ -35,6 +35,7 @@ class CircularButton: UIControl { case close case remove case edit + case check } required init(style: Style, iconColor: UIColor = .secondaryLabel, dangerColor: UIColor = .systemRed) { @@ -105,6 +106,10 @@ class CircularButton: UIControl { imageView.image = Image.icon_edit.makeImage(template: true) accessibilityLabel = String.Localized.update_card accessibilityIdentifier = "CircularButton.Edit" + + case .check: + imageView.image = Image.icon_checkmark.makeImage(template: true) + // no accessibility for now, this is just used as a view, not a button } } diff --git a/Tests/ReferenceImages_64/StripePaymentSheetTests.VerticalSavedPaymentMethodsViewControllerSnapshotTests/test_VerticalSavedPaymentMethodsViewControllerSnapshotTestsAppearance@3x.png b/Tests/ReferenceImages_64/StripePaymentSheetTests.VerticalSavedPaymentMethodsViewControllerSnapshotTests/test_VerticalSavedPaymentMethodsViewControllerSnapshotTestsAppearance@3x.png index d6a0fba1ab1771e63e4b7ff5bc53206460697fc9..0f8aaac260a74c0ec4e88cedafc45a088cc1c63d 100644 GIT binary patch delta 51537 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 delta 47810 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 diff --git a/Tests/ReferenceImages_64/StripePaymentSheetTests.VerticalSavedPaymentMethodsViewControllerSnapshotTests/test_VerticalSavedPaymentMethodsViewControllerSnapshotTestsLightMode@3x.png b/Tests/ReferenceImages_64/StripePaymentSheetTests.VerticalSavedPaymentMethodsViewControllerSnapshotTests/test_VerticalSavedPaymentMethodsViewControllerSnapshotTestsLightMode@3x.png index 8c4cb30eca8792fea44071bb60921c4f7fc234b3..2b62990d15e1a396d1e45c24be27721a43b823f1 100644 GIT binary patch delta 47635 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