From 8d7dc5115875b908d240d96f8774135b31b5d223 Mon Sep 17 00:00:00 2001 From: Nick Porter <88012362+porter-stripe@users.noreply.github.com> Date: Wed, 8 May 2024 13:44:20 -0600 Subject: [PATCH] Add VerticalSavedPaymentOptionsViewController (#3569) ## Summary - Adds VerticalSavedPaymentOptionsViewController - Adds scaffolding in place snapshot tests - Handles navigation between vertical PaymentSheet and VerticalSavedPaymentOptionsViewController https://github.com/stripe/stripe-ios/assets/88012362/b340e598-3300-4b40-9320-d36504958c5c ## Motivation https://jira.corp.stripe.com/browse/MOBILESDK-2023 ## Testing - Manual ## Changelog N/A --- .../project.pbxproj | 8 ++ .../en.lproj/Localizable.strings | 6 ++ .../Source/Categories/String+Localized.swift | 20 ++++ ...calSavedPaymentOptionsViewController.swift | 91 ++++++++++++++++++ ...entSheetFlowControllerViewController.swift | 4 +- .../PaymentSheetVerticalViewController.swift | 13 ++- .../PaymentSheetViewController.swift | 5 +- ...pdateCardViewControllerSnapshotTests.swift | 2 +- ...ntOptionsViewControllerSnapshotTests.swift | 40 ++++++++ ...ewControllerSnapshotTestsAppearance@3x.png | Bin 0 -> 17176 bytes ...ViewControllerSnapshotTestsDarkMode@3x.png | Bin 0 -> 18881 bytes ...iewControllerSnapshotTestsLightMode@3x.png | Bin 0 -> 17676 bytes 12 files changed, 178 insertions(+), 11 deletions(-) create mode 100644 StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/VerticalSavedPaymentOptionsViewController.swift create mode 100644 StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/VerticalSavedPaymentOptionsViewControllerSnapshotTests.swift create mode 100644 Tests/ReferenceImages_64/StripePaymentSheetTests.VerticalSavedPaymentOptionsViewControllerSnapshotTests/test_VerticalSavedPaymentOptionsViewControllerSnapshotTestsAppearance@3x.png create mode 100644 Tests/ReferenceImages_64/StripePaymentSheetTests.VerticalSavedPaymentOptionsViewControllerSnapshotTests/test_VerticalSavedPaymentOptionsViewControllerSnapshotTestsDarkMode@3x.png create mode 100644 Tests/ReferenceImages_64/StripePaymentSheetTests.VerticalSavedPaymentOptionsViewControllerSnapshotTests/test_VerticalSavedPaymentOptionsViewControllerSnapshotTestsLightMode@3x.png diff --git a/StripePaymentSheet/StripePaymentSheet.xcodeproj/project.pbxproj b/StripePaymentSheet/StripePaymentSheet.xcodeproj/project.pbxproj index 365b57bd9e9..4844d0aaadd 100644 --- a/StripePaymentSheet/StripePaymentSheet.xcodeproj/project.pbxproj +++ b/StripePaymentSheet/StripePaymentSheet.xcodeproj/project.pbxproj @@ -111,6 +111,8 @@ 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 */; }; + 619E5B972BEA84630040647A /* VerticalSavedPaymentOptionsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 619E5B962BEA84630040647A /* VerticalSavedPaymentOptionsViewController.swift */; }; + 619E5B9A2BEA89D90040647A /* VerticalSavedPaymentOptionsViewControllerSnapshotTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 619E5B982BEA891E0040647A /* VerticalSavedPaymentOptionsViewControllerSnapshotTests.swift */; }; 61C0D3B8C63EB4558AB74A7E /* StripePayments.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A1C7CFA5C9C1A8A73CFA1C0 /* StripePayments.framework */; }; 623C2D9F87929D6DA9C09E23 /* STPCameraView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D39B31D0B890A4F8E4819B15 /* STPCameraView.swift */; }; 630A3B22BC5C176928538511 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B7188D37BDE69B56D8223046 /* Main.storyboard */; }; @@ -429,6 +431,8 @@ 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 = ""; }; + 619E5B962BEA84630040647A /* VerticalSavedPaymentOptionsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerticalSavedPaymentOptionsViewController.swift; sourceTree = ""; }; + 619E5B982BEA891E0040647A /* VerticalSavedPaymentOptionsViewControllerSnapshotTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerticalSavedPaymentOptionsViewControllerSnapshotTests.swift; sourceTree = ""; }; 62CE362B80042827F47ABC3F /* AffirmCopyLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AffirmCopyLabel.swift; sourceTree = ""; }; 64C8F350CDB5A29F62E86592 /* FlowControllerStateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlowControllerStateTests.swift; sourceTree = ""; }; 64D658AC15478BF1E0A76B9D /* TestModeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestModeView.swift; sourceTree = ""; }; @@ -934,6 +938,7 @@ children = ( 5AA26FF00FD57F6AA1A7CB83 /* SavedPaymentMethodCollectionView.swift */, 2B3ECDF6CF9AABD573F86CA2 /* SavedPaymentOptionsViewController.swift */, + 619E5B962BEA84630040647A /* VerticalSavedPaymentOptionsViewController.swift */, ); path = "Saved Payment Method Screen"; sourceTree = ""; @@ -1318,6 +1323,7 @@ C1AED4473AD4C07D461E9E48 /* SavedPaymentOptionsViewControllerSnapshotTests.swift */, BA3902DA8D647E934686CB5C /* SepaMandateViewControllerSnapshotTest.swift */, 6151DDBF2B14FDCF00ED4F7E /* UpdateCardViewControllerSnapshotTests.swift */, + 619E5B982BEA891E0040647A /* VerticalSavedPaymentOptionsViewControllerSnapshotTests.swift */, B68CB9622B0D2169006ACDB1 /* STPAPIClient+PaymentSheetTest.swift */, D16926577504D37992F8917E /* STPApplePayContext+PaymentSheetTest.swift */, E09C073021CE89593466548C /* STPCardBrandChoiceTest.swift */, @@ -1590,6 +1596,7 @@ EEC6283DB21D04AD5B77F9D2 /* STPApplePayContext+PaymentSheetTest.swift in Sources */, 714FBCA75296C291FDB3B345 /* STPCardBrandChoiceTest.swift in Sources */, E0E47773D3C0B432E26AA457 /* STPElementsSessionTest.swift in Sources */, + 619E5B9A2BEA89D90040647A /* VerticalSavedPaymentOptionsViewControllerSnapshotTests.swift in Sources */, 29C98FB712F3FB987CBE18B0 /* STPFixtures+PaymentSheet.swift in Sources */, 45D9849E9B36C56E15EAAE0A /* SavedPaymentOptionsViewControllerSnapshotTests.swift in Sources */, 9787A622B527C1AD96A73827 /* SepaMandateViewControllerSnapshotTest.swift in Sources */, @@ -1627,6 +1634,7 @@ 40806EF506CB719299FC90CC /* STPLocalizedString.swift in Sources */, 71132CE036C3EE0655ECD2DB /* STPStringUtils.swift in Sources */, 1AF3BBA86D643AAF26CD0E2B /* StripePaymentSheet+Exports.swift in Sources */, + 619E5B972BEA84630040647A /* VerticalSavedPaymentOptionsViewController.swift in Sources */, B6859A882BE54CD30018E06C /* PaymentSheetVerticalViewController.swift in Sources */, 73F3E8DCF2314972A162B2A3 /* StripePaymentSheetBundleLocator.swift in Sources */, 73EE441CF71707651109CE19 /* ConsumerSession+LookupResponse.swift in Sources */, diff --git a/StripePaymentSheet/StripePaymentSheet/Resources/Localizations/en.lproj/Localizable.strings b/StripePaymentSheet/StripePaymentSheet/Resources/Localizations/en.lproj/Localizable.strings index d3d2c022c08..831d4fa7405 100644 --- a/StripePaymentSheet/StripePaymentSheet/Resources/Localizations/en.lproj/Localizable.strings +++ b/StripePaymentSheet/StripePaymentSheet/Resources/Localizations/en.lproj/Localizable.strings @@ -212,6 +212,12 @@ e.g, 'Pay faster at Example, Inc. and thousands of businesses.' */ to be saved and used in future checkout sessions. */ "Save your info for secure 1-click checkout with Link" = "Save your info for secure 1-click checkout with Link"; +/* Title shown above a view containing the customer's card payment methods */ +"Select card" = "Select card"; + +/* Title shown above a view containing the customer's payment methods */ +"Select payment method" = "Select payment method"; + /* Title shown above a carousel containing the customer's payment methods */ "Select your payment method" = "Select your payment method"; diff --git a/StripePaymentSheet/StripePaymentSheet/Source/Categories/String+Localized.swift b/StripePaymentSheet/StripePaymentSheet/Source/Categories/String+Localized.swift index 4f19a19225c..45cd2b8971a 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/Categories/String+Localized.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/Categories/String+Localized.swift @@ -234,4 +234,24 @@ extension String.Localized { "Amazon Pay mandate text" ) } + + static var select_payment_method: String { + STPLocalizedString( + "Select payment method", + "Title shown above a view containing the customer's payment methods" + ) + } + + static var select_card: String { + STPLocalizedString( + "Select card", + "Title shown above a view containing the customer's card payment methods" + ) + } + + static var select_your_payment_method: String { + STPLocalizedString( + "Select your payment method", + "Title shown above a carousel containing the customer's payment methods") + } } diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/VerticalSavedPaymentOptionsViewController.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/VerticalSavedPaymentOptionsViewController.swift new file mode 100644 index 00000000000..ce26e552c45 --- /dev/null +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Saved Payment Method Screen/VerticalSavedPaymentOptionsViewController.swift @@ -0,0 +1,91 @@ +// +// VerticalSavedPaymentOptionsViewController.swift +// StripePaymentSheet +// +// Created by Nick Porter on 5/7/24. +// + +import Foundation +@_spi(STP) import StripeCore +@_spi(STP) import StripeUICore +import UIKit + +/// A view controller that shows a list of saved payment methods in a vertical orientation +class VerticalSavedPaymentOptionsViewController: UIViewController { + + private let configuration: PaymentSheet.Configuration + + // MARK: - UI properties + + lazy var navigationBar: SheetNavigationBar = { + let navBar = SheetNavigationBar(isTestMode: configuration.apiClient.isTestmode, + appearance: configuration.appearance) + navBar.setStyle(.back) + navBar.delegate = self + return navBar + }() + + private lazy var headerLabel: UILabel = { + let label = PaymentSheetUI.makeHeaderLabel(appearance: configuration.appearance) + label.text = .Localized.select_payment_method + return label + }() + + private lazy var stackView: UIStackView = { + let stackView = UIStackView(arrangedSubviews: [headerLabel]) + stackView.directionalLayoutMargins = PaymentSheetUI.defaultMargins + stackView.isLayoutMarginsRelativeArrangement = true + stackView.axis = .vertical + stackView.spacing = PaymentSheetUI.defaultPadding + return stackView + }() + + init(configuration: PaymentSheet.Configuration) { + self.configuration = configuration + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = configuration.appearance.colors.background + configuration.style.configure(self) + + view.addAndPinSubviewToSafeArea(stackView, insets: PaymentSheetUI.defaultSheetMargins) + } +} + +// MARK: - BottomSheetContentViewController +extension VerticalSavedPaymentOptionsViewController: BottomSheetContentViewController { + var allowsDragToDismiss: Bool { + // TODO + return true + } + + func didTapOrSwipeToDismiss() { + dismiss(animated: true) + } + + var requiresFullScreen: Bool { + // TODO + return false + } + + func didFinishAnimatingHeight() { + // no-op + } +} + +// MARK: - SheetNavigationBarDelegate +extension VerticalSavedPaymentOptionsViewController: SheetNavigationBarDelegate { + func sheetNavigationBarDidClose(_ sheetNavigationBar: SheetNavigationBar) { + // no-op we are in 'back' style mode + } + + func sheetNavigationBarDidBack(_ sheetNavigationBar: SheetNavigationBar) { + _ = bottomSheetController?.popContentViewController() + } +} diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PaymentSheetFlowControllerViewController.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PaymentSheetFlowControllerViewController.swift index e3c711b017c..7c95ce33518 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PaymentSheetFlowControllerViewController.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PaymentSheetFlowControllerViewController.swift @@ -343,9 +343,7 @@ class PaymentSheetFlowControllerViewController: UIViewController, FlowController switch mode { case .selectingSaved: - headerLabel.text = STPLocalizedString( - "Select your payment method", - "Title shown above a carousel containing the customer's payment methods") + headerLabel.text = .Localized.select_your_payment_method case .addingNew: if addPaymentMethodViewController.paymentMethodTypes == [.stripe(.card)] { headerLabel.text = STPLocalizedString("Add a card", "Title shown above a card entry form") diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PaymentSheetVerticalViewController.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PaymentSheetVerticalViewController.swift index 317614c4645..14fa79a69a4 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PaymentSheetVerticalViewController.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PaymentSheetVerticalViewController.swift @@ -50,15 +50,22 @@ class PaymentSheetVerticalViewController: UIViewController, FlowControllerViewCo view.backgroundColor = configuration.appearance.colors.background configuration.style.configure(self) - let dummyView = UILabel() - dummyView.text = "Welcome to vertical mode" + let dummyButton = UIButton(type: .system) + dummyButton.setTitle("Welcome to vertical mode", for: .normal) + dummyButton.addTarget(self, action: #selector(presentManageScreen), for: .touchUpInside) // One stack view contains all our subviews let stackView = UIStackView(arrangedSubviews: [ - dummyView, + dummyButton, ]) view.addAndPinSubview(stackView, insets: .init(top: 0, leading: 0, bottom: 0, trailing: PaymentSheetUI.defaultSheetMargins.bottom)) } + + // TOOD(porter) Remove/rename + @objc func presentManageScreen() { + bottomSheetController?.pushContentViewController(VerticalSavedPaymentOptionsViewController(configuration: configuration)) + // TODO(porter) Set delegate + } } // MARK: - BottomSheetContentViewController diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PaymentSheetViewController.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PaymentSheetViewController.swift index 1389d67fa73..a210cfc6299 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PaymentSheetViewController.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/ViewControllers/PaymentSheetViewController.swift @@ -336,10 +336,7 @@ class PaymentSheetViewController: UIViewController { ) case .selectingSaved: headerLabel.isHidden = shouldShowWalletHeader - headerLabel.text = STPLocalizedString( - "Select your payment method", - "Title shown above a carousel containing the customer's payment methods" - ) + headerLabel.text = .Localized.select_your_payment_method } // Content diff --git a/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/UpdateCardViewControllerSnapshotTests.swift b/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/UpdateCardViewControllerSnapshotTests.swift index 69c9df1957f..69d8d990803 100644 --- a/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/UpdateCardViewControllerSnapshotTests.swift +++ b/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/UpdateCardViewControllerSnapshotTests.swift @@ -43,7 +43,7 @@ final class UpdateCardViewControllerSnapshotTests: STPSnapshotTestCase { } } -private extension UIView { +extension UIView { /// Constrains the view to the given width and autosizes its height. /// - Parameter width: Resizes the view to this width /// - Parameter height: Resizes the view to this height diff --git a/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/VerticalSavedPaymentOptionsViewControllerSnapshotTests.swift b/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/VerticalSavedPaymentOptionsViewControllerSnapshotTests.swift new file mode 100644 index 00000000000..47be6f7a237 --- /dev/null +++ b/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/VerticalSavedPaymentOptionsViewControllerSnapshotTests.swift @@ -0,0 +1,40 @@ +// +// VerticalSavedPaymentOptionsViewControllerSnapshotTests.swift +// StripePaymentSheet +// +// Created by Nick Porter on 5/7/24. +// + +import StripeCoreTestUtils +@_spi(STP) @testable import StripePaymentSheet +@testable import StripePaymentsTestUtils +import XCTest + +final class VerticalSavedPaymentOptionsViewControllerSnapshotTests: STPSnapshotTestCase { + + func test_VerticalSavedPaymentOptionsViewControllerSnapshotTestsDarkMode() { + _test_VerticalSavedPaymentOptionsViewControllerSnapshotTests(darkMode: true) + } + + func test_VerticalSavedPaymentOptionsViewControllerSnapshotTestsLightMode() { + _test_VerticalSavedPaymentOptionsViewControllerSnapshotTests(darkMode: false) + } + + func test_VerticalSavedPaymentOptionsViewControllerSnapshotTestsAppearance() { + _test_VerticalSavedPaymentOptionsViewControllerSnapshotTests(darkMode: false, appearance: ._testMSPaintTheme) + } + + func _test_VerticalSavedPaymentOptionsViewControllerSnapshotTests(darkMode: Bool, appearance: PaymentSheet.Appearance = .default) { + var configuration = PaymentSheet.Configuration() + configuration.appearance = appearance + let sut = VerticalSavedPaymentOptionsViewController(configuration: configuration) + let testWindow = UIWindow(frame: CGRect(x: 0, y: 0, width: 428, height: 500)) + testWindow.isHidden = false + if darkMode { + testWindow.overrideUserInterfaceStyle = .dark + } + testWindow.rootViewController = sut + sut.view.autosizeHeight(width: 375) + STPSnapshotVerifyView(sut.view) + } +} diff --git a/Tests/ReferenceImages_64/StripePaymentSheetTests.VerticalSavedPaymentOptionsViewControllerSnapshotTests/test_VerticalSavedPaymentOptionsViewControllerSnapshotTestsAppearance@3x.png b/Tests/ReferenceImages_64/StripePaymentSheetTests.VerticalSavedPaymentOptionsViewControllerSnapshotTests/test_VerticalSavedPaymentOptionsViewControllerSnapshotTestsAppearance@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..8cb3a796ec17a5d78840487b31becddb09439335 GIT binary patch literal 17176 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 literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_64/StripePaymentSheetTests.VerticalSavedPaymentOptionsViewControllerSnapshotTests/test_VerticalSavedPaymentOptionsViewControllerSnapshotTestsDarkMode@3x.png b/Tests/ReferenceImages_64/StripePaymentSheetTests.VerticalSavedPaymentOptionsViewControllerSnapshotTests/test_VerticalSavedPaymentOptionsViewControllerSnapshotTestsDarkMode@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..53369472bc82a3cdbee72a401e4a3bacd6d7454d GIT binary patch literal 18881 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 o3#$EJh2{TGsP<{9 literal 0 HcmV?d00001 diff --git a/Tests/ReferenceImages_64/StripePaymentSheetTests.VerticalSavedPaymentOptionsViewControllerSnapshotTests/test_VerticalSavedPaymentOptionsViewControllerSnapshotTestsLightMode@3x.png b/Tests/ReferenceImages_64/StripePaymentSheetTests.VerticalSavedPaymentOptionsViewControllerSnapshotTests/test_VerticalSavedPaymentOptionsViewControllerSnapshotTestsLightMode@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a0bf003bf88e873d0dc96189cd8b30961e177ded GIT binary patch literal 17676 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