From 0deb3916cf1688d623618f1976639fcba78bd808 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Pantale=C3=A3o=20Gon=C3=A7alves?= Date: Mon, 6 Nov 2023 08:56:08 +0100 Subject: [PATCH] Navigate to default server when deeplink to the app passing "?server=default" (#2392) ## Summary Navigate to default server when deeplink to the app passing "?server=default". Currently when you use deep link to navigate to one lovelace page and you have multiple HA servers in your iOS App it always asks which server you want to use. With this change you are able to default to your current server by using a query item "?server=default" ## Link to pull request in Documentation repository Documentation: home-assistant/companion.home-assistant# https://github.com/home-assistant/iOS/assets/5808343/c29ac74e-8ea4-4d5a-93ec-53ef7c64ced6 --- Gemfile.lock | 1 + Sources/App/WebView/IncomingURLHandler.swift | 15 ++++++++++-- .../App/WebView/WebViewWindowController.swift | 24 ++++++++++++++++--- 3 files changed, 35 insertions(+), 5 deletions(-) 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?