import "@polymer/app-route/app-location";
import { html, property, PropertyValues } from "lit-element";
import { navigate } from "../common/navigate";
import { getStorageDefaultPanelUrlPath } from "../data/panel";
import "../resources/custom-card-support";
import "../resources/ha-style";
import { HassElement } from "../state/hass-element";
import { HomeAssistant, Route } from "../types";
import {
registerServiceWorker,
supportsServiceWorker,
} from "../util/register-service-worker";
import "./ha-init-page";
import "./home-assistant-main";
import { setHAVersion } from "../common/config/version";
export class HomeAssistantAppEl extends HassElement {
@property() private _route?: Route;
@property() private _error = false;
@property() private _panelUrl?: string;
private _haVersion?: string;
protected render() {
const hass = this.hass;
return html`
${this._panelUrl === undefined || this._route === undefined
? ""
: hass && hass.states && hass.config && hass.services
? html`
`
: html` `}
`;
}
protected firstUpdated(changedProps) {
super.firstUpdated(changedProps);
this._initialize();
setTimeout(registerServiceWorker, 1000);
/* polyfill for paper-dropdown */
import(
/* webpackChunkName: "polyfill-web-animations-next" */ "web-animations-js/web-animations-next-lite.min"
);
}
protected updated(changedProps: PropertyValues): void {
super.updated(changedProps);
if (changedProps.has("_panelUrl")) {
this.panelUrlChanged(this._panelUrl!);
this._updateHass({ panelUrl: this._panelUrl });
}
if (changedProps.has("hass")) {
this.hassChanged(
this.hass!,
changedProps.get("hass") as HomeAssistant | undefined
);
}
}
protected hassConnected() {
super.hassConnected();
if (__BACKWARDS_COMPAT__) {
setHAVersion(this.hass!.connection.haVersion);
}
// @ts-ignore
this._loadHassTranslations(this.hass!.language, "state");
}
protected hassReconnected() {
super.hassReconnected();
// If backend has been upgraded, make sure we update frontend
if (this.hass!.connection.haVersion !== this._haVersion) {
if (supportsServiceWorker()) {
navigator.serviceWorker.getRegistration().then((registration) => {
if (registration) {
registration.update();
} else {
location.reload(true);
}
});
} else {
location.reload(true);
}
}
}
protected async _initialize() {
try {
const { auth, conn } = await window.hassConnection;
this._haVersion = conn.haVersion;
this.initializeHass(auth, conn);
} catch (err) {
this._error = true;
}
}
private async _routeChanged(ev) {
// routeChangged event listener is called while we're doing the fist render,
// causing the update to be ignored. So delay it to next task (Lit render is sync).
await new Promise((resolve) => setTimeout(resolve, 0));
const route = ev.detail.value as Route;
// If it's the first route that we process,
// check if we should navigate away from /
if (
this._route === undefined &&
(route.path === "" || route.path === "/")
) {
navigate(window, `/${getStorageDefaultPanelUrlPath()}`, true);
return;
}
this._route = route;
const dividerPos = route.path.indexOf("/", 1);
this._panelUrl =
dividerPos === -1
? route.path.substr(1)
: route.path.substr(1, dividerPos - 1);
}
}
customElements.define("home-assistant", HomeAssistantAppEl);