Skip to content

Commit de87dcd

Browse files
committed
Fix in-app browser close button overlap on iPad (closes #2377)
1 parent 9c90595 commit de87dcd

File tree

1 file changed

+40
-9
lines changed

1 file changed

+40
-9
lines changed

IceCubesApp/App/Router/SafariRouter.swift

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,6 @@ private struct SafariRouter: ViewModifier {
9292
func open(_ url: URL) -> OpenURLAction.Result {
9393
guard let windowScene else { return .systemAction }
9494

95-
window = setupWindow(windowScene: windowScene)
96-
9795
let configuration = SFSafariViewController.Configuration()
9896
configuration.entersReaderIfAvailable = UserPreferences.shared.inAppBrowserReaderView
9997

@@ -103,17 +101,25 @@ private struct SafariRouter: ViewModifier {
103101
safari.delegate = self
104102

105103
DispatchQueue.main.async { [weak self] in
106-
self?.viewController.present(safari, animated: true)
104+
if let presenter = self?.bestPresenter(in: windowScene) {
105+
self?.window = nil
106+
presenter.present(safari, animated: true)
107+
} else {
108+
self?.window = self?.setupWindow(windowScene: windowScene)
109+
self?.viewController.present(safari, animated: true)
110+
}
107111
}
108112

109113
return .handled
110114
}
111115

112116
func dismiss() {
113117
viewController.presentedViewController?.dismiss(animated: true)
114-
window?.resignKey()
115-
window?.isHidden = false
116-
window = nil
118+
if let window {
119+
window.resignKey()
120+
window.isHidden = false
121+
self.window = nil
122+
}
117123
}
118124

119125
func setupWindow(windowScene: UIWindowScene) -> UIWindow {
@@ -135,10 +141,35 @@ private struct SafariRouter: ViewModifier {
135141

136142
nonisolated func safariViewControllerDidFinish(_: SFSafariViewController) {
137143
Task { @MainActor in
138-
window?.resignKey()
139-
window?.isHidden = false
140-
window = nil
144+
if let window {
145+
window.resignKey()
146+
window.isHidden = false
147+
self.window = nil
148+
}
149+
}
150+
}
151+
152+
private func bestPresenter(in windowScene: UIWindowScene) -> UIViewController? {
153+
let keyWindow = windowScene.windows.first(where: \.isKeyWindow)
154+
guard let root = keyWindow?.rootViewController else { return nil }
155+
return topViewController(from: root)
156+
}
157+
158+
private func topViewController(from root: UIViewController) -> UIViewController {
159+
if let presented = root.presentedViewController {
160+
return topViewController(from: presented)
161+
}
162+
if let navigation = root as? UINavigationController,
163+
let visible = navigation.visibleViewController
164+
{
165+
return topViewController(from: visible)
166+
}
167+
if let tab = root as? UITabBarController,
168+
let selected = tab.selectedViewController
169+
{
170+
return topViewController(from: selected)
141171
}
172+
return root
142173
}
143174
}
144175
#endif

0 commit comments

Comments
 (0)