From 53607143c027c330ee9d010d6731455f0dd3edd6 Mon Sep 17 00:00:00 2001 From: Yuki Date: Wed, 16 Oct 2024 12:48:14 -0700 Subject: [PATCH 1/2] Embedded update pt 2 - update view --- .../project.pbxproj | 12 ++- .../Embedded/EmbeddedPaymentElement.swift | 13 ++- .../EmbeddedPaymentElementContainerView.swift | 78 ++++++++++++++++++ .../EmbeddedPaymentElementSnapshotTests.swift | 52 ++++++++++++ .../EmbeddedPaymentElementTest.swift | 1 - ...USBankAccountWithCompletionHandler_@3x.png | Bin 0 -> 20336 bytes 6 files changed, 151 insertions(+), 5 deletions(-) create mode 100644 StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Embedded/EmbeddedPaymentElementContainerView.swift create mode 100644 StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/EmbeddedPaymentElementSnapshotTests.swift create mode 100644 Tests/ReferenceImages_64/StripePaymentSheetTests.EmbeddedPaymentElementSnapshotTests/testUpdateFromCardToCardAndUSBankAccountWithCompletionHandler_@3x.png diff --git a/StripePaymentSheet/StripePaymentSheet.xcodeproj/project.pbxproj b/StripePaymentSheet/StripePaymentSheet.xcodeproj/project.pbxproj index f19d1cea323..b8a5518df5e 100644 --- a/StripePaymentSheet/StripePaymentSheet.xcodeproj/project.pbxproj +++ b/StripePaymentSheet/StripePaymentSheet.xcodeproj/project.pbxproj @@ -225,6 +225,8 @@ B63B2CF32BFBEE7B003810F3 /* VerticalPaymentMethodListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B63B2CF22BFBEE7B003810F3 /* VerticalPaymentMethodListViewController.swift */; }; B63B2CF52BFBEEAD003810F3 /* PaymentMethodFormViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B63B2CF42BFBEEAD003810F3 /* PaymentMethodFormViewController.swift */; }; B63B2CF72BFC116A003810F3 /* PaymentSheetVerticalViewControllerSnapshotTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B63B2CF62BFC116A003810F3 /* PaymentSheetVerticalViewControllerSnapshotTest.swift */; }; + B63DC6782CC054410011C27E /* EmbeddedPaymentElementContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B63DC6772CC0543D0011C27E /* EmbeddedPaymentElementContainerView.swift */; }; + B63DC67A2CC06AD10011C27E /* EmbeddedPaymentElementSnapshotTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B63DC6792CC06AC80011C27E /* EmbeddedPaymentElementSnapshotTests.swift */; }; B64FEF122C0FAC1E00F7CA26 /* PaymentSheetVerticalViewControllerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B64FEF112C0FAC1E00F7CA26 /* PaymentSheetVerticalViewControllerTest.swift */; }; B65B42972C013DED00EC565D /* PaymentMethodFormViewControllerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B65B42962C013DED00EC565D /* PaymentMethodFormViewControllerTest.swift */; }; B65FE7092BED33EA009A73FC /* VerticalPaymentMethodListViewControllerSnapshotTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B65FE7082BED33EA009A73FC /* VerticalPaymentMethodListViewControllerSnapshotTest.swift */; }; @@ -599,6 +601,8 @@ B63B2CF22BFBEE7B003810F3 /* VerticalPaymentMethodListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerticalPaymentMethodListViewController.swift; sourceTree = ""; }; B63B2CF42BFBEEAD003810F3 /* PaymentMethodFormViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PaymentMethodFormViewController.swift; sourceTree = ""; }; B63B2CF62BFC116A003810F3 /* PaymentSheetVerticalViewControllerSnapshotTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentSheetVerticalViewControllerSnapshotTest.swift; sourceTree = ""; }; + B63DC6772CC0543D0011C27E /* EmbeddedPaymentElementContainerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmbeddedPaymentElementContainerView.swift; sourceTree = ""; }; + B63DC6792CC06AC80011C27E /* EmbeddedPaymentElementSnapshotTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmbeddedPaymentElementSnapshotTests.swift; sourceTree = ""; }; B64FEF112C0FAC1E00F7CA26 /* PaymentSheetVerticalViewControllerTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentSheetVerticalViewControllerTest.swift; sourceTree = ""; }; B65B42962C013DED00EC565D /* PaymentMethodFormViewControllerTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentMethodFormViewControllerTest.swift; sourceTree = ""; }; B65FE7082BED33EA009A73FC /* VerticalPaymentMethodListViewControllerSnapshotTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerticalPaymentMethodListViewControllerSnapshotTest.swift; sourceTree = ""; }; @@ -930,15 +934,16 @@ 6180A5C52C82434A009D1536 /* Embedded */ = { isa = PBXGroup; children = ( + 6117D70F2CB0654B005C4EC1 /* EmbeddedMandateContainerView.swift */, B615E8702CA4CBEE007D684C /* EmbeddedPaymentElement.swift */, B6CACC9D2CB8B8E800682ECE /* EmbeddedPaymentElement+Internal.swift */, B615E8722CA4CC04007D684C /* EmbeddedPaymentElementConfiguration.swift */, + B63DC6772CC0543D0011C27E /* EmbeddedPaymentElementContainerView.swift */, B615E8742CA4CC38007D684C /* EmbeddedPaymentElementDelegate.swift */, 6180A5C02C8222A9009D1536 /* EmbeddedPaymentMethodsView.swift */, + 6117D7112CB065E7005C4EC1 /* MandateTextProvider.swift */, 6180A5C62C824377009D1536 /* RadioButton.swift */, 6180A5CA2C8249D2009D1536 /* UIStackView+Separator.swift */, - 6117D7112CB065E7005C4EC1 /* MandateTextProvider.swift */, - 6117D70F2CB0654B005C4EC1 /* EmbeddedMandateContainerView.swift */, ); path = Embedded; sourceTree = ""; @@ -1430,6 +1435,7 @@ 31699A822BE183D40048677F /* DownloadManagerTest.swift */, 73FB30705EC36BD0868904A2 /* Elements+TestHelpers.swift */, B6CACC9F2CBD9A3300682ECE /* EmbeddedPaymentElementTest.swift */, + B63DC6792CC06AC80011C27E /* EmbeddedPaymentElementSnapshotTests.swift */, 61FB6BCC2C8901B200F8E074 /* EmbeddedPaymentMethodsViewSnapshotTests.swift */, 614068E12CB0BF10003D2F12 /* EmbeddedPaymentMethodsViewTests.swift */, 64C8F350CDB5A29F62E86592 /* FlowControllerStateTests.swift */, @@ -1732,6 +1738,7 @@ 10A336F0F2331F22F1A0AC1B /* LinkStubs.swift in Sources */, 61C87E1E2CB81FAD001B7DA9 /* CardBrandFilterTests.swift in Sources */, 316B33122B5F171C0008D2E5 /* UserDefaults+StripePaymentSheetTest.swift in Sources */, + B63DC67A2CC06AD10011C27E /* EmbeddedPaymentElementSnapshotTests.swift in Sources */, D77514C28C9A031908E99CA1 /* PaymentMethodMessagingViewFunctionalTest.swift in Sources */, D14478CFCABDF7455DA7472A /* PaymentMethodMessagingViewSnapshotTests.swift in Sources */, 3D3607748436E625FF6CF921 /* PaymentSheet+APITest.swift in Sources */, @@ -1900,6 +1907,7 @@ 88BA38BE8949815F4DB79509 /* PayWithLinkController.swift in Sources */, 6B28A6B62BE9494500B47DBF /* CustomerSheetDataSource.swift in Sources */, 8C91277A8FEFD0B914CC6564 /* PaymentSheet-LinkConfirmOption.swift in Sources */, + B63DC6782CC054410011C27E /* EmbeddedPaymentElementContainerView.swift in Sources */, 573E3DB554058AC1E34E34B6 /* AddPaymentMethodViewController.swift in Sources */, 8D4951AE0D793D01528F352D /* PaymentMethodTypeCollectionView.swift in Sources */, 2CE83364A23B4E3BAFD447CA /* WalletHeaderView.swift in Sources */, diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Embedded/EmbeddedPaymentElement.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Embedded/EmbeddedPaymentElement.swift index 22636934077..5ad95f34e8e 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Embedded/EmbeddedPaymentElement.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Embedded/EmbeddedPaymentElement.swift @@ -17,8 +17,7 @@ public final class EmbeddedPaymentElement { /// A view that displays payment methods. It can present a sheet to collect more details or display saved payment methods. public var view: UIView { - // TODO: Make this a _container view_ so that we can swap out the inner `embeddedPaymentMethodsView` when `update` is called. - return embeddedPaymentMethodsView + return containerView } /// A view controller to present on. @@ -145,6 +144,7 @@ public final class EmbeddedPaymentElement { // At this point, we're the latest update - update self properties and inform our delegate. self.loadResult = loadResult self.embeddedPaymentMethodsView = embeddedPaymentMethodsView + self.containerView.updateEmbeddedPaymentMethodsView(embeddedPaymentMethodsView) if paymentOption != embeddedPaymentMethodsView.displayData { self.delegate?.embeddedPaymentElementDidUpdatePaymentOption(embeddedPaymentElement: self) } @@ -164,6 +164,7 @@ public final class EmbeddedPaymentElement { // MARK: - Internal + internal private(set) var containerView: EmbeddedPaymentElementContainerView internal private(set) var embeddedPaymentMethodsView: EmbeddedPaymentMethodsView internal private(set) var loadResult: PaymentSheetLoader.LoadResult internal private(set) var currentUpdateTask: Task? @@ -178,6 +179,14 @@ public final class EmbeddedPaymentElement { configuration: configuration, loadResult: loadResult ) + self.containerView = EmbeddedPaymentElementContainerView( + embeddedPaymentMethodsView: embeddedPaymentMethodsView + ) + + self.containerView.updateSuperviewHeight = { [weak self] in + guard let self else { return } + self.delegate?.embeddedPaymentElementDidUpdateHeight(embeddedPaymentElement: self) + } self.embeddedPaymentMethodsView.delegate = self } } diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Embedded/EmbeddedPaymentElementContainerView.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Embedded/EmbeddedPaymentElementContainerView.swift new file mode 100644 index 00000000000..f11d6190d1a --- /dev/null +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Embedded/EmbeddedPaymentElementContainerView.swift @@ -0,0 +1,78 @@ +// +// EmbeddedPaymentElementContainerView.swift +// StripePaymentSheet +// +// Created by Yuki Tokuhiro on 10/16/24. +// +import UIKit + +/// The view that's vended to the merchant, containing the embedded view. We use this to be able to swap out the embedded view with an animation when `update` is called. +class EmbeddedPaymentElementContainerView: UIView { + var updateSuperviewHeight: () -> Void = {} + var view: UIView + var bottomAnchorConstraint: NSLayoutConstraint! + + init(embeddedPaymentMethodsView: UIView) { + self.view = embeddedPaymentMethodsView + super.init(frame: .zero) + addInitialView(view) + } + + required init?(coder: NSCoder) { + fatalError() + } + + private func addInitialView(_ view: UIView) { + view.translatesAutoresizingMaskIntoConstraints = false + addSubview(view) + bottomAnchorConstraint = view.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor) + NSLayoutConstraint.activate([ + view.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor), + view.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor), + view.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor), + bottomAnchorConstraint, + ]) + } + + func updateEmbeddedPaymentMethodsView(_ embeddedPaymentMethodsView: UIView) { + guard frame.size != .zero else { + // A zero frame means we haven't been laid out yet. Simply replace the old view to avoid laying out before the view is ready and breaking constraints. + self.view.removeFromSuperview() + self.view = embeddedPaymentMethodsView + addInitialView(embeddedPaymentMethodsView) + return + } + let oldView = view + let oldViewHeight = frame.height + // Add the new view w/ 0 alpha + embeddedPaymentMethodsView.translatesAutoresizingMaskIntoConstraints = false + addSubview(embeddedPaymentMethodsView) + view = embeddedPaymentMethodsView + embeddedPaymentMethodsView.alpha = 0 + NSLayoutConstraint.activate([ + embeddedPaymentMethodsView.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor), + embeddedPaymentMethodsView.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor), + embeddedPaymentMethodsView.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor), + // Omit the bottom anchor so that the height is still fixed to the old view height + ]) + // important that the view is already laid out before the animation block so that it doesn't animate from zero size. + layoutIfNeeded() + + UIView.animate(withDuration: 0.2) { + // Re-pin bottom anchor to the new view, thus updating our height + self.bottomAnchorConstraint.isActive = false + self.bottomAnchorConstraint = embeddedPaymentMethodsView.bottomAnchor.constraint(equalTo: self.layoutMarginsGuide.bottomAnchor) + self.bottomAnchorConstraint.isActive = true + self.layoutIfNeeded() + // Fade old view out and new view in + oldView.alpha = 0 + embeddedPaymentMethodsView.alpha = 1 + if oldViewHeight != self.systemLayoutSizeFitting(.zero).height { + // Invoke EmbeddedPaymentElement delegate method so that height does not jump + self.updateSuperviewHeight() + } + } completion: { _ in + oldView.removeFromSuperview() + } + } +} diff --git a/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/EmbeddedPaymentElementSnapshotTests.swift b/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/EmbeddedPaymentElementSnapshotTests.swift new file mode 100644 index 00000000000..803d5ddd2c5 --- /dev/null +++ b/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/EmbeddedPaymentElementSnapshotTests.swift @@ -0,0 +1,52 @@ +// +// EmbeddedPaymentElementSnapshotTests.swift +// StripePaymentSheet +// +// Created by Yuki Tokuhiro on 10/16/24. +// + +import StripeCoreTestUtils +@_spi(STP) @testable import StripePayments +@_spi(EmbeddedPaymentElementPrivateBeta) @testable import StripePaymentSheet +@testable import StripePaymentsTestUtils +@_spi(STP) @testable import StripeUICore +import XCTest + +class EmbeddedPaymentElementSnapshotTests: STPSnapshotTestCase, EmbeddedPaymentElementDelegate { + var delegateDidUpdateHeightCalled: Bool = false + var delegateDidUpdatePaymentOptionCalled: Bool = false + func embeddedPaymentElementDidUpdateHeight(embeddedPaymentElement: StripePaymentSheet.EmbeddedPaymentElement) { + self.delegateDidUpdateHeightCalled = true + } + + func embeddedPaymentElementDidUpdatePaymentOption(embeddedPaymentElement: StripePaymentSheet.EmbeddedPaymentElement) { + self.delegateDidUpdatePaymentOptionCalled = true + } + + lazy var configuration: EmbeddedPaymentElement.Configuration = { + var config = EmbeddedPaymentElement.Configuration._testValue_MostPermissive(isApplePayEnabled: false) + config.apiClient = STPAPIClient(publishableKey: STPTestingDefaultPublishableKey) + return config + }() + let paymentIntentConfig = EmbeddedPaymentElement.IntentConfiguration(mode: .payment(amount: 1000, currency: "USD"), paymentMethodTypes: ["card"]) { _, _, _ in + // These tests don't confirm, so this is unused + } + let setupIntentConfig = EmbeddedPaymentElement.IntentConfiguration(mode: .setup(setupFutureUsage: .offSession), paymentMethodTypes: ["card", "us_bank_account"]) { _, _, _ in + // These tests don't confirm, so this is unused + } + + func testUpdateFromCardToCardAndUSBankAccount() async throws { + // Given a EmbeddedPaymentElement instance... + let sut = try await EmbeddedPaymentElement.create(intentConfiguration: paymentIntentConfig, configuration: configuration) + sut.delegate = self + sut.view.autosizeHeight(width: 300) + + let loadResult = await sut.update(intentConfiguration: setupIntentConfig) + XCTAssertEqual(loadResult, .succeeded) + sut.view.autosizeHeight(width: 300) + + STPSnapshotVerifyView(sut.view) // Should show US Bank and card + XCTAssertTrue(delegateDidUpdateHeightCalled) + XCTAssertFalse(delegateDidUpdatePaymentOptionCalled) + } +} diff --git a/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/EmbeddedPaymentElementTest.swift b/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/EmbeddedPaymentElementTest.swift index 0703a2593a6..2c268b479c0 100644 --- a/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/EmbeddedPaymentElementTest.swift +++ b/StripePaymentSheet/StripePaymentSheetTests/PaymentSheet/EmbeddedPaymentElementTest.swift @@ -112,7 +112,6 @@ class EmbeddedPaymentElementTest: STPNetworkStubbingTestCase { XCTAssertEqual(updateResult2, .succeeded) XCTAssertTrue(sut.loadResult.intent.isSettingUp) } - } extension EmbeddedPaymentElementTest: EmbeddedPaymentElementDelegate { diff --git a/Tests/ReferenceImages_64/StripePaymentSheetTests.EmbeddedPaymentElementSnapshotTests/testUpdateFromCardToCardAndUSBankAccountWithCompletionHandler_@3x.png b/Tests/ReferenceImages_64/StripePaymentSheetTests.EmbeddedPaymentElementSnapshotTests/testUpdateFromCardToCardAndUSBankAccountWithCompletionHandler_@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..cf39470bb4171c1611f29290a04afd474e32f287 GIT binary patch literal 20336 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 Date: Fri, 18 Oct 2024 14:56:47 -0700 Subject: [PATCH 2/2] PR feedback --- .../Embedded/EmbeddedPaymentElementContainerView.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Embedded/EmbeddedPaymentElementContainerView.swift b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Embedded/EmbeddedPaymentElementContainerView.swift index f11d6190d1a..1e147da327f 100644 --- a/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Embedded/EmbeddedPaymentElementContainerView.swift +++ b/StripePaymentSheet/StripePaymentSheet/Source/PaymentSheet/Embedded/EmbeddedPaymentElementContainerView.swift @@ -9,10 +9,10 @@ import UIKit /// The view that's vended to the merchant, containing the embedded view. We use this to be able to swap out the embedded view with an animation when `update` is called. class EmbeddedPaymentElementContainerView: UIView { var updateSuperviewHeight: () -> Void = {} - var view: UIView - var bottomAnchorConstraint: NSLayoutConstraint! + private var view: EmbeddedPaymentMethodsView + private var bottomAnchorConstraint: NSLayoutConstraint! - init(embeddedPaymentMethodsView: UIView) { + init(embeddedPaymentMethodsView: EmbeddedPaymentMethodsView) { self.view = embeddedPaymentMethodsView super.init(frame: .zero) addInitialView(view) @@ -34,7 +34,7 @@ class EmbeddedPaymentElementContainerView: UIView { ]) } - func updateEmbeddedPaymentMethodsView(_ embeddedPaymentMethodsView: UIView) { + func updateEmbeddedPaymentMethodsView(_ embeddedPaymentMethodsView: EmbeddedPaymentMethodsView) { guard frame.size != .zero else { // A zero frame means we haven't been laid out yet. Simply replace the old view to avoid laying out before the view is ready and breaking constraints. self.view.removeFromSuperview()