@@ -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