diff --git a/Gemfile.lock b/Gemfile.lock index 0c097d28f..406602d48 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -305,6 +305,7 @@ PLATFORMS arm64-darwin-22 x86_64-darwin-20 x86_64-darwin-21 + x86_64-darwin-22 DEPENDENCIES cocoapods diff --git a/Sources/App/WebView/IncomingURLHandler.swift b/Sources/App/WebView/IncomingURLHandler.swift index b576e156c..3754a9e97 100644 --- a/Sources/App/WebView/IncomingURLHandler.swift +++ b/Sources/App/WebView/IncomingURLHandler.swift @@ -50,6 +50,7 @@ class IncomingURLHandler { components.scheme = nil components.host = nil + let queryParameters = components.queryItems let isFromWidget = components.popWidgetAuthenticity() let server = components.popWidgetServer(isFromWidget: isFromWidget) @@ -61,12 +62,22 @@ class IncomingURLHandler { presenting is SFSafariViewController { // Dismiss my.* controller if it's on top - we don't get any other indication presenting.dismiss(animated: true, completion: { [windowController] in - windowController.openSelectingServer(from: .deeplink, urlString: rawURL, skipConfirm: true) + windowController.openSelectingServer( + from: .deeplink, + urlString: rawURL, + skipConfirm: true, + queryParameters: queryParameters + ) }) } else if let server = server { windowController.open(from: .deeplink, server: server, urlString: rawURL, skipConfirm: isFromWidget) } else { - windowController.openSelectingServer(from: .deeplink, urlString: rawURL, skipConfirm: isFromWidget) + windowController.openSelectingServer( + from: .deeplink, + urlString: rawURL, + skipConfirm: isFromWidget, + queryParameters: queryParameters + ) } default: Current.Log.warning("Can't route incoming URL: \(url)") diff --git a/Sources/App/WebView/WebViewWindowController.swift b/Sources/App/WebView/WebViewWindowController.swift index afe758176..997440fca 100644 --- a/Sources/App/WebView/WebViewWindowController.swift +++ b/Sources/App/WebView/WebViewWindowController.swift @@ -202,9 +202,27 @@ class WebViewWindowController { } } - func openSelectingServer(from: OpenSource, urlString openUrlRaw: String, skipConfirm: Bool = false) { - if let first = Current.servers.all.first, Current.servers.all.count == 1 { - open(from: from, server: first, urlString: openUrlRaw, skipConfirm: skipConfirm) + func openSelectingServer( + from: OpenSource, + urlString openUrlRaw: String, + skipConfirm: Bool = false, + queryParameters: [URLQueryItem]? = nil + ) { + let serverName = queryParameters?.first(where: { $0.name == "server" })?.value + let servers = Current.servers.all + + if let first = servers.first, Current.servers.all.count == 1 || serverName != nil { + if serverName == "default" || serverName == nil { + open(from: from, server: first, urlString: openUrlRaw, skipConfirm: skipConfirm) + } else { + if let selectedServer = servers.first(where: { server in + server.info.name.lowercased() == serverName?.lowercased() + }) { + open(from: from, server: selectedServer, urlString: openUrlRaw, skipConfirm: skipConfirm) + } else { + open(from: from, server: first, urlString: openUrlRaw, skipConfirm: skipConfirm) + } + } } else if Current.servers.all.count > 1 { let prompt: String?