Skip to content

Commit dba79ce

Browse files
committed
Consolidate presentation logic to ensure style configuration is applied
1 parent f0ee717 commit dba79ce

File tree

7 files changed

+86
-4
lines changed

7 files changed

+86
-4
lines changed

StripeFinancialConnections/StripeFinancialConnections.xcodeproj/project.pbxproj

+8
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@
6363
492651682C25C0C2001DDBCA /* [email protected] in Resources */ = {isa = PBXBuildFile; fileRef = 492651672C25C0C2001DDBCA /* [email protected] */; };
6464
49424EB02D48050A0088F3D9 /* WebPrefillDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49424EAF2D48050A0088F3D9 /* WebPrefillDetails.swift */; };
6565
494D62072C45B9B700106519 /* [email protected] in Resources */ = {isa = PBXBuildFile; fileRef = 494D62062C45B9B700106519 /* [email protected] */; };
66+
4964F13A2D4C114800EE6BC9 /* PresentationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4964F1392D4C114800EE6BC9 /* PresentationManager.swift */; };
67+
4964F13C2D4C14D100EE6BC9 /* PresentationManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4964F13B2D4C14D100EE6BC9 /* PresentationManagerTests.swift */; };
6668
496A6AE72C29E0BB00D34F8E /* [email protected] in Resources */ = {isa = PBXBuildFile; fileRef = 496A6AE62C29E0BB00D34F8E /* [email protected] */; };
6769
497142BC2C514B08000DFA64 /* FlowRouterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 497142BB2C514B08000DFA64 /* FlowRouterTests.swift */; };
6870
499EEAFD2D3E948B00E1BE85 /* FinancialConnectionsAPIClientLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 499EEAFC2D3E948B00E1BE85 /* FinancialConnectionsAPIClientLogger.swift */; };
@@ -330,6 +332,8 @@
330332
492651672C25C0C2001DDBCA /* [email protected] */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "[email protected]"; sourceTree = "<group>"; };
331333
49424EAF2D48050A0088F3D9 /* WebPrefillDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebPrefillDetails.swift; sourceTree = "<group>"; };
332334
494D62062C45B9B700106519 /* [email protected] */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "[email protected]"; sourceTree = "<group>"; };
335+
4964F1392D4C114800EE6BC9 /* PresentationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentationManager.swift; sourceTree = "<group>"; };
336+
4964F13B2D4C14D100EE6BC9 /* PresentationManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentationManagerTests.swift; sourceTree = "<group>"; };
333337
496A6AE62C29E0BB00D34F8E /* [email protected] */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "[email protected]"; sourceTree = "<group>"; };
334338
497142BB2C514B08000DFA64 /* FlowRouterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlowRouterTests.swift; sourceTree = "<group>"; };
335339
499EEAFC2D3E948B00E1BE85 /* FinancialConnectionsAPIClientLogger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FinancialConnectionsAPIClientLogger.swift; sourceTree = "<group>"; };
@@ -1044,6 +1048,7 @@
10441048
49F047522C63B430006BAD3E /* StripeSchemeAddress.swift */,
10451049
49424EAF2D48050A0088F3D9 /* WebPrefillDetails.swift */,
10461050
49F883F72D496D7A00A104B0 /* ExperimentStore.swift */,
1051+
4964F1392D4C114800EE6BC9 /* PresentationManager.swift */,
10471052
);
10481053
path = Shared;
10491054
sourceTree = "<group>";
@@ -1098,6 +1103,7 @@
10981103
CF731140836AE438C7F4F6AB /* StringExtensionsTests.swift */,
10991104
497142BB2C514B08000DFA64 /* FlowRouterTests.swift */,
11001105
492039942CA4972B00CE2072 /* FinancialConnectionsWebFlowTests.swift */,
1106+
4964F13B2D4C14D100EE6BC9 /* PresentationManagerTests.swift */,
11011107
);
11021108
path = StripeFinancialConnectionsTests;
11031109
sourceTree = "<group>";
@@ -1481,6 +1487,7 @@
14811487
6A78141C2B462D5D00168992 /* LegalDetailsNoticeViewController.swift in Sources */,
14821488
6A7814112B32462100168992 /* CloseConfirmationViewController.swift in Sources */,
14831489
AB7C9A26484953762FFBB4A5 /* FinancialConnectionsWebFlowViewController.swift in Sources */,
1490+
4964F13A2D4C114800EE6BC9 /* PresentationManager.swift in Sources */,
14841491
);
14851492
runOnlyForDeploymentPostprocessing = 0;
14861493
};
@@ -1500,6 +1507,7 @@
15001507
846D1D7429B9E414744DEC99 /* FinancialConnectionsSheetTests.swift in Sources */,
15011508
C19996D0AC7E046DA87B6B32 /* ManualEntryValidatorTests.swift in Sources */,
15021509
779C729BB49FD4B99DCD517B /* MarkdownBoldAttributedStringTests.swift in Sources */,
1510+
4964F13C2D4C14D100EE6BC9 /* PresentationManagerTests.swift in Sources */,
15031511
49A0B5862C5D2F3C00D697D9 /* FinancialConnectionsAPIClientTests.swift in Sources */,
15041512
BF5F964E1CA6312755D4161E /* SessionFetcherTests.swift in Sources */,
15051513
ED818E10F37230678B9B73CC /* SoftLinkTests.swift in Sources */,

StripeFinancialConnections/StripeFinancialConnections/Source/FinancialConnectionsSheet.swift

+6-2
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,11 @@ final public class FinancialConnectionsSheet {
118118
private var wrapperViewController: ModalPresentationWrapperViewController?
119119

120120
/// Contains all configurable properties of Financial Connections.
121-
@_spi(STP) public var configuration: FinancialConnectionsSheet.Configuration = .init()
121+
@_spi(STP) public var configuration: FinancialConnectionsSheet.Configuration = .init() {
122+
didSet {
123+
PresentationManager.shared.configuration = configuration
124+
}
125+
}
122126

123127
/// Any additional Elements context useful for the Financial Connections SDK.
124128
@_spi(STP) public var elementsSessionContext: StripeCore.ElementsSessionContext?
@@ -303,7 +307,7 @@ final public class FinancialConnectionsSheet {
303307
toPresent = wrapperViewController!
304308
animated = false
305309
}
306-
presentingViewController.present(toPresent, animated: animated, completion: nil)
310+
PresentationManager.shared.present(toPresent, from: presentingViewController, animated: animated)
307311
}
308312
}
309313

StripeFinancialConnections/StripeFinancialConnections/Source/Native/Shared/ExperimentStore.swift

+5
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,9 @@ import Foundation
1616

1717
@_spi(STP) public var useAsyncAPIClient: Bool = false
1818
@_spi(STP) public var supportsDynamicStyle: Bool = false
19+
20+
@_spi(STP) public func reset() {
21+
useAsyncAPIClient = false
22+
supportsDynamicStyle = false
23+
}
1924
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//
2+
// PresentationManager.swift
3+
// StripeFinancialConnections
4+
//
5+
// Created by Mat Schmid on 2025-01-30.
6+
//
7+
8+
import UIKit
9+
10+
/// Handles applying the current style configuration to each view controller presented.
11+
class PresentationManager {
12+
static let shared = PresentationManager()
13+
14+
var configuration: FinancialConnectionsSheet.Configuration = .init()
15+
16+
func present(
17+
_ viewControllerToPresent: UIViewController,
18+
from presentingViewController: UIViewController,
19+
animated: Bool = true,
20+
completion: (() -> Void)? = nil
21+
) {
22+
configuration.style.configure(viewControllerToPresent)
23+
presentingViewController.present(viewControllerToPresent, animated: animated, completion: completion)
24+
}
25+
}

StripeFinancialConnections/StripeFinancialConnections/Source/Native/Shared/SFSafariViewController+Extensions.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@ extension SFSafariViewController {
1919
return
2020
}
2121
let safariViewController = SFSafariViewController(url: url)
22-
topMostViewController.present(safariViewController, animated: true, completion: nil)
22+
PresentationManager.shared.present(safariViewController, from: topMostViewController)
2323
}
2424
}

StripeFinancialConnections/StripeFinancialConnections/Source/Native/Shared/SheetViewController.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ class SheetViewController: UIViewController {
386386
func present(on viewController: UIViewController) {
387387
modalPresentationStyle = .custom
388388
transitioningDelegate = transitionDelegate
389-
viewController.present(self, animated: true)
389+
PresentationManager.shared.present(self, from: viewController)
390390
}
391391
}
392392

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
//
2+
// PresentationManagerTests.swift
3+
// StripeFinancialConnections
4+
//
5+
// Created by Mat Schmid on 2025-01-30.
6+
//
7+
8+
@testable @_spi(STP) import StripeFinancialConnections
9+
import UIKit
10+
import XCTest
11+
12+
class PresentationManagerTests: XCTestCase {
13+
override func setUp() {
14+
super.setUp()
15+
ExperimentStore.shared.supportsDynamicStyle = true
16+
}
17+
18+
override func tearDown() {
19+
super.tearDown()
20+
ExperimentStore.shared.reset()
21+
PresentationManager.shared.configuration = .init()
22+
}
23+
24+
func testConfigurationIsApplied() {
25+
let toViewController = UIViewController()
26+
27+
// Start the user interface style as `.light`
28+
toViewController.overrideUserInterfaceStyle = .light
29+
XCTAssertEqual(toViewController.traitCollection.userInterfaceStyle, .light)
30+
31+
// Create an `.alwaysDark` configuration
32+
var configuration = FinancialConnectionsSheet.Configuration()
33+
configuration.style = .alwaysDark
34+
PresentationManager.shared.configuration = configuration
35+
36+
// Expect that the presentation manager sets the user interface style as `.dark`
37+
PresentationManager.shared.present(toViewController, from: UIViewController())
38+
XCTAssertEqual(toViewController.traitCollection.userInterfaceStyle, .dark)
39+
}
40+
}

0 commit comments

Comments
 (0)