diff --git a/mac/Sources/Byre/Pages.swift b/mac/Sources/Byre/Pages.swift index 599b23a..86af5b9 100644 --- a/mac/Sources/Byre/Pages.swift +++ b/mac/Sources/Byre/Pages.swift @@ -93,7 +93,11 @@ extension Store { if shown.pages.isEmpty { shownPages[page.root] = nil pages.closeSites(page.root) - if sheet?.tab == .page { + let owner: Sheet.Owner = switch page.root { + case .task(let id): .task(id) + case .project(let id): .project(id) + } + if sheet?.tab == .page, sheet?.owner == owner { sheet = nil } return @@ -163,6 +167,7 @@ final class Pages { private(set) var titles: [Page: String] = [:] @ObservationIgnored var served: [PageSite: [String: Data]] = [:] @ObservationIgnored var popup: ((Page) -> Void)? + @ObservationIgnored var closePage: ((Page) -> Void)? @ObservationIgnored private var listener: PageListener? @ObservationIgnored private var hosts: [PageSite: String] = [:] @ObservationIgnored private var sites: [String: PageSite] = [:] @@ -177,6 +182,12 @@ final class Pages { delegate.popup = { [weak self] opener, config in self?.adopt(opener, config) } + delegate.close = { [weak self] view in + guard let self, let page = self.views.first(where: { $0.value === view })?.key else { + return + } + self.closePage?(page) + } listener = PageListener(api: api, ready: { [weak self] port in Task { @MainActor in self?.port = port @@ -638,6 +649,11 @@ private struct PageTabButton: View { @MainActor private final class PageDelegate: NSObject, WKUIDelegate, WKNavigationDelegate { var popup: ((WKWebView, WKWebViewConfiguration) -> WKWebView?)? + var close: ((WKWebView) -> Void)? + + func webViewDidClose(_ webView: WKWebView) { + close?(webView) + } private var waits: [ObjectIdentifier: CheckedContinuation] = [:] func wait(_ navigation: WKNavigation?) async throws { diff --git a/mac/Sources/Byre/Store.swift b/mac/Sources/Byre/Store.swift index 8b5d603..aee7c74 100644 --- a/mac/Sources/Byre/Store.swift +++ b/mac/Sources/Byre/Store.swift @@ -136,6 +136,9 @@ final class Store { pages.popup = { [weak self] page in self?.openPage(page) } + pages.closePage = { [weak self] page in + self?.closePage(page) + } } func sends(_ key: String) -> LocalSends {