From 19ba5c8f115bbd374469de4a8dd71e1abff64c94 Mon Sep 17 00:00:00 2001 From: 3252a8 <3252a8@proton.me> Date: Sat, 23 May 2026 09:52:26 +0300 Subject: [PATCH] feat: support install guide app deeplinks --- frontend/src/App.svelte | 40 +++++++++++++++++++ .../webapp/screens/InstallGuideScreen.svelte | 7 +--- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte index 6216ecf..cbfdc88 100644 --- a/frontend/src/App.svelte +++ b/frontend/src/App.svelte @@ -1055,6 +1055,44 @@ window.location.assign(url); } + function hasControlChars(value) { + return Array.from(String(value || "")).some((char) => { + const code = char.charCodeAt(0); + return code <= 31 || code === 127; + }); + } + + function openAppLink(url) { + const raw = String(url || "").trim(); + if (!raw || hasControlChars(raw) || /^(javascript|data|vbscript):/i.test(raw)) { + return; + } + if (/^https?:\/\//i.test(raw)) { + openExternalLink(raw); + return; + } + if (/^tg:\/\//i.test(raw) && tg?.openTelegramLink) { + try { + tg.openTelegramLink(raw); + return; + } catch { + // Fall back to the generic deeplink path below. + } + } + try { + const anchor = document.createElement("a"); + anchor.href = raw; + anchor.target = "_self"; + anchor.rel = "noreferrer"; + anchor.style.display = "none"; + document.body.appendChild(anchor); + anchor.click(); + anchor.remove(); + } catch { + window.location.assign(raw); + } + } + function openConnectLink() { const url = subscription?.connect_url || subscription?.config_link; if (!url) { @@ -1374,6 +1412,7 @@ {goHome} openConnectLink={openPublicConnectLink} {openExternalLink} + {openAppLink} {copyText} {t} publicMode @@ -1484,6 +1523,7 @@ {goHome} {openConnectLink} {openExternalLink} + {openAppLink} {copyText} {t} /> diff --git a/frontend/src/webapp/screens/InstallGuideScreen.svelte b/frontend/src/webapp/screens/InstallGuideScreen.svelte index 2d41206..bfa924f 100644 --- a/frontend/src/webapp/screens/InstallGuideScreen.svelte +++ b/frontend/src/webapp/screens/InstallGuideScreen.svelte @@ -26,6 +26,7 @@ export let goHome = () => {}; export let openConnectLink = () => {}; export let openExternalLink = () => {}; + export let openAppLink = null; export let copyText = async () => {}; export let t = (key, _params = {}, fallback = "") => fallback || key; export let publicMode = false; @@ -197,11 +198,7 @@ openConnectLink(); return; } - if (/^https?:\/\//i.test(url)) { - openExternalLink(url); - return; - } - window.location.assign(url); + (openAppLink || openExternalLink)(url); } async function handleButton(button) {