Skip to content

"Open app" button #464

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions src-11ty/redirect-page.html
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@
.card-actions a {
text-decoration: none;
}
.open-card-actions {
display: flex;
gap: 10px;
align-items: end;
}
.fake-button {
padding: 0 24px;
line-height: 40px;
Expand Down Expand Up @@ -108,12 +113,18 @@ <h1 class="card-header">Open page in your Home Assistant?</h1>
{% if redirect.redirect == "oauth" %}
<div class="card-actions">
<div class="fake-button decline-link">Decline</div>
<div class="fake-button open-link">Link account</div>
<div class="open-card-actions">
<div class="fake-button open-link-app">Open link in app</div>
<div class="fake-button open-link">Link account</div>
</div>
</div>
{% else %}
<div class="card-actions">
<div></div>
<div class="fake-button open-link">Open link</div>
<div class="open-card-actions">
<div class="fake-button open-link-native">Open link on app</div>
<div class="fake-button open-link">Open link here</div>
</div>
</div>
{% endif %}
</div>
Expand Down
72 changes: 47 additions & 25 deletions src/entrypoints/my-redirect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
extractSearchParamsObject,
} from "../util/search-params";
import { getInstanceUrl } from "../data/instance_info";
import { Redirect } from "../const";
import { MOBILE_URL, Redirect } from "../const";
import { svgPencil } from "../components/svg-pencil";
import { isMobile } from "../data/is_mobile";
import { validateParam } from "../util/validate";
Expand Down Expand Up @@ -37,6 +37,12 @@ const createRedirectParams = (): string => {

let changingInstance = false;

const getRedirectUrl = (baseUrl: string, params) => {
return window.redirect.redirect === "oauth"
? `${baseUrl}/auth/external/callback${params}`
: `${baseUrl}/_my_redirect/${window.redirect.redirect}${params}`;
}

const render = (showTroubleshooting: boolean) => {
const instanceUrl = getInstanceUrl();

Expand All @@ -57,23 +63,35 @@ const render = (showTroubleshooting: boolean) => {
window.redirect.redirect + "/" + params
)}`;

if (instanceUrl === null) {
changingInstance = true;
document.location.assign(changeUrl);
return;
}
const redirectUrlToNativeApp = getRedirectUrl(MOBILE_URL, params);
const openLinkNative = document.querySelector(".open-link-native") as HTMLElement;
openLinkNative.outerHTML = `
<a href="${redirectUrlToNativeApp}" class='open-link-native' rel="noopener">
<md-filled-button>${isMobile ? 'Open link' : openLinkNative.innerText}</md-filled-button>
</a>
`;
openLinkNative.style.visibility = "visible";

const redirectUrl =
window.redirect.redirect === "oauth"
? `${instanceUrl}/auth/external/callback${params}`
: `${instanceUrl}/_my_redirect/${window.redirect.redirect}${params}`;
const redirectUrl =
instanceUrl === null
? changeUrl
: getRedirectUrl(instanceUrl, params);

const openLink = document.querySelector(".open-link") as HTMLElement;
openLink.outerHTML = `
<a href="${redirectUrl}" class='open-link' rel="noopener">
<md-filled-button>${openLink.innerText}</md-filled-button>
</a>
`;
if (isMobile) {
openLink.style.display = "none";
} else {
openLink.outerHTML = `
<a href="${redirectUrl}" class='open-link' rel="noopener">
<md-filled-button>${openLink.innerText}</md-filled-button>
</a>
`;
if (instanceUrl === null) {
document.querySelector(".open-link")!.addEventListener("click", () => {
changingInstance = true;
});
}
}

if (window.redirect.redirect === "oauth") {
const params = extractSearchParamsObject();
Expand All @@ -87,6 +105,8 @@ const render = (showTroubleshooting: boolean) => {
buttonCaption = "Notify Home Assistant of rejection";
(document.querySelector(".open-link") as HTMLElement).style.visibility =
"hidden";
(document.querySelector(".open-link-native") as HTMLElement).style.visibility =
"hidden";
}

const declineLink = document.querySelector(".decline-link")!;
Expand All @@ -107,16 +127,18 @@ const render = (showTroubleshooting: boolean) => {
return;
}

let changeInstanceEl = document.querySelector(".instance-footer")!;
changeInstanceEl.innerHTML = `
<b>Your instance URL:</b> ${instanceUrl}
<a href="${changeUrl}">
${svgPencil}
</a>
`;
changeInstanceEl.querySelector("a")!.addEventListener("click", () => {
changingInstance = true;
});
if (instanceUrl !== null) {
let changeInstanceEl = document.querySelector(".instance-footer")!;
changeInstanceEl.innerHTML = `
<b>Your instance URL:</b> ${instanceUrl}
<a href="${changeUrl}">
${svgPencil}
</a>
`;
changeInstanceEl.querySelector("a")!.addEventListener("click", () => {
changingInstance = true;
});
}

// When we were changing the instance, we're not going to mess with troubleshooting.
if (changingInstance) {
Expand Down