mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-23 17:26:42 +00:00
Make cast backwards compatible (#5081)
* Make cast backwards compatible * Update hc-main.ts * Update home-assistant-js-websocket
This commit is contained in:
parent
1a3b747d17
commit
74657ae815
@ -26,10 +26,12 @@ import { CastManager } from "../../../../src/cast/cast_manager";
|
|||||||
import {
|
import {
|
||||||
LovelaceConfig,
|
LovelaceConfig,
|
||||||
getLovelaceCollection,
|
getLovelaceCollection,
|
||||||
|
getLegacyLovelaceCollection,
|
||||||
} from "../../../../src/data/lovelace";
|
} from "../../../../src/data/lovelace";
|
||||||
import "./hc-layout";
|
import "./hc-layout";
|
||||||
import { generateDefaultViewConfig } from "../../../../src/panels/lovelace/common/generate-lovelace-config";
|
import { generateDefaultViewConfig } from "../../../../src/panels/lovelace/common/generate-lovelace-config";
|
||||||
import { toggleAttribute } from "../../../../src/common/dom/toggle_attribute";
|
import { toggleAttribute } from "../../../../src/common/dom/toggle_attribute";
|
||||||
|
import { atLeastVersion } from "../../../../src/common/config/version";
|
||||||
|
|
||||||
@customElement("hc-cast")
|
@customElement("hc-cast")
|
||||||
class HcCast extends LitElement {
|
class HcCast extends LitElement {
|
||||||
@ -133,7 +135,9 @@ class HcCast extends LitElement {
|
|||||||
protected firstUpdated(changedProps) {
|
protected firstUpdated(changedProps) {
|
||||||
super.firstUpdated(changedProps);
|
super.firstUpdated(changedProps);
|
||||||
|
|
||||||
const llColl = getLovelaceCollection(this.connection);
|
const llColl = atLeastVersion(this.connection.haVersion, 0, 107)
|
||||||
|
? getLovelaceCollection(this.connection)
|
||||||
|
: getLegacyLovelaceCollection(this.connection);
|
||||||
// We first do a single refresh because we need to check if there is LL
|
// We first do a single refresh because we need to check if there is LL
|
||||||
// configuration.
|
// configuration.
|
||||||
llColl.refresh().then(
|
llColl.refresh().then(
|
||||||
|
@ -16,6 +16,8 @@ import {
|
|||||||
LovelaceConfig,
|
LovelaceConfig,
|
||||||
getLovelaceCollection,
|
getLovelaceCollection,
|
||||||
fetchResources,
|
fetchResources,
|
||||||
|
LegacyLovelaceConfig,
|
||||||
|
getLegacyLovelaceCollection,
|
||||||
} from "../../../../src/data/lovelace";
|
} from "../../../../src/data/lovelace";
|
||||||
import "./hc-launch-screen";
|
import "./hc-launch-screen";
|
||||||
import { castContext } from "../cast_context";
|
import { castContext } from "../cast_context";
|
||||||
@ -23,6 +25,7 @@ import { CAST_NS } from "../../../../src/cast/const";
|
|||||||
import { ReceiverStatusMessage } from "../../../../src/cast/sender_messages";
|
import { ReceiverStatusMessage } from "../../../../src/cast/sender_messages";
|
||||||
import { loadLovelaceResources } from "../../../../src/panels/lovelace/common/load-resources";
|
import { loadLovelaceResources } from "../../../../src/panels/lovelace/common/load-resources";
|
||||||
import { isNavigationClick } from "../../../../src/common/dom/is-navigation-click";
|
import { isNavigationClick } from "../../../../src/common/dom/is-navigation-click";
|
||||||
|
import { atLeastVersion } from "../../../../src/common/config/version";
|
||||||
|
|
||||||
let resourcesLoaded = false;
|
let resourcesLoaded = false;
|
||||||
|
|
||||||
@ -168,19 +171,14 @@ export class HcMain extends HassElement {
|
|||||||
this._error = "Cannot show Lovelace because we're not connected.";
|
this._error = "Cannot show Lovelace because we're not connected.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!resourcesLoaded) {
|
|
||||||
resourcesLoaded = true;
|
|
||||||
loadLovelaceResources(
|
|
||||||
await fetchResources(this.hass!.connection),
|
|
||||||
this.hass!.auth.data.hassUrl
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (!this._unsubLovelace || this._urlPath !== msg.urlPath) {
|
if (!this._unsubLovelace || this._urlPath !== msg.urlPath) {
|
||||||
this._urlPath = msg.urlPath;
|
this._urlPath = msg.urlPath;
|
||||||
if (this._unsubLovelace) {
|
if (this._unsubLovelace) {
|
||||||
this._unsubLovelace();
|
this._unsubLovelace();
|
||||||
}
|
}
|
||||||
const llColl = getLovelaceCollection(this.hass!.connection, msg.urlPath);
|
const llColl = atLeastVersion(this.hass.connection.haVersion, 0, 107)
|
||||||
|
? getLovelaceCollection(this.hass!.connection, msg.urlPath)
|
||||||
|
: getLegacyLovelaceCollection(this.hass!.connection);
|
||||||
// We first do a single refresh because we need to check if there is LL
|
// We first do a single refresh because we need to check if there is LL
|
||||||
// configuration.
|
// configuration.
|
||||||
try {
|
try {
|
||||||
@ -199,6 +197,15 @@ export class HcMain extends HassElement {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!resourcesLoaded) {
|
||||||
|
resourcesLoaded = true;
|
||||||
|
const resources = atLeastVersion(this.hass.connection.haVersion, 0, 107)
|
||||||
|
? await fetchResources(this.hass!.connection)
|
||||||
|
: (this._lovelaceConfig as LegacyLovelaceConfig).resources;
|
||||||
|
if (resources) {
|
||||||
|
loadLovelaceResources(resources, this.hass!.auth.data.hassUrl);
|
||||||
|
}
|
||||||
|
}
|
||||||
this._showDemo = false;
|
this._showDemo = false;
|
||||||
this._lovelacePath = msg.viewPath;
|
this._lovelacePath = msg.viewPath;
|
||||||
if (castContext.getDeviceCapabilities().touch_input_supported) {
|
if (castContext.getDeviceCapabilities().touch_input_supported) {
|
||||||
|
@ -18,6 +18,7 @@ import {
|
|||||||
} from "../../../src/data/hassio/addon";
|
} from "../../../src/data/hassio/addon";
|
||||||
import { navigate } from "../../../src/common/navigate";
|
import { navigate } from "../../../src/common/navigate";
|
||||||
import { filterAndSort } from "../components/hassio-filter-addons";
|
import { filterAndSort } from "../components/hassio-filter-addons";
|
||||||
|
import { atLeastVersion } from "../../../src/common/config/version";
|
||||||
|
|
||||||
class HassioAddonRepositoryEl extends LitElement {
|
class HassioAddonRepositoryEl extends LitElement {
|
||||||
@property() public hass!: HomeAssistant;
|
@property() public hass!: HomeAssistant;
|
||||||
@ -39,7 +40,6 @@ class HassioAddonRepositoryEl extends LitElement {
|
|||||||
protected render(): TemplateResult {
|
protected render(): TemplateResult {
|
||||||
const repo = this.repo;
|
const repo = this.repo;
|
||||||
const addons = this._getAddons(this.addons, this.filter);
|
const addons = this._getAddons(this.addons, this.filter);
|
||||||
const ha105pluss = this._computeHA105plus;
|
|
||||||
|
|
||||||
if (this.filter && addons.length < 1) {
|
if (this.filter && addons.length < 1) {
|
||||||
return html`
|
return html`
|
||||||
@ -92,7 +92,11 @@ class HassioAddonRepositoryEl extends LitElement {
|
|||||||
: !addon.available
|
: !addon.available
|
||||||
? "not_available"
|
? "not_available"
|
||||||
: ""}
|
: ""}
|
||||||
.iconImage=${ha105pluss && addon.icon
|
.iconImage=${atLeastVersion(
|
||||||
|
this.hass.connection.haVersion,
|
||||||
|
0,
|
||||||
|
105
|
||||||
|
) && addon.icon
|
||||||
? `/api/hassio/addons/${addon.slug}/icon`
|
? `/api/hassio/addons/${addon.slug}/icon`
|
||||||
: undefined}
|
: undefined}
|
||||||
.showTopbar=${addon.installed || !addon.available}
|
.showTopbar=${addon.installed || !addon.available}
|
||||||
@ -117,11 +121,6 @@ class HassioAddonRepositoryEl extends LitElement {
|
|||||||
navigate(this, `/hassio/addon/${ev.currentTarget.addon.slug}`);
|
navigate(this, `/hassio/addon/${ev.currentTarget.addon.slug}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
private get _computeHA105plus(): boolean {
|
|
||||||
const [major, minor] = this.hass.config.version.split(".", 2);
|
|
||||||
return Number(major) > 0 || (major === "0" && Number(minor) >= 105);
|
|
||||||
}
|
|
||||||
|
|
||||||
static get styles(): CSSResultArray {
|
static get styles(): CSSResultArray {
|
||||||
return [
|
return [
|
||||||
hassioStyle,
|
hassioStyle,
|
||||||
|
@ -36,6 +36,7 @@ import { haStyle } from "../../../src/resources/styles";
|
|||||||
import { HomeAssistant } from "../../../src/types";
|
import { HomeAssistant } from "../../../src/types";
|
||||||
import { navigate } from "../../../src/common/navigate";
|
import { navigate } from "../../../src/common/navigate";
|
||||||
import { showHassioMarkdownDialog } from "../dialogs/markdown/show-dialog-hassio-markdown";
|
import { showHassioMarkdownDialog } from "../dialogs/markdown/show-dialog-hassio-markdown";
|
||||||
|
import { atLeastVersion } from "../../../src/common/config/version";
|
||||||
|
|
||||||
const PERMIS_DESC = {
|
const PERMIS_DESC = {
|
||||||
rating: {
|
rating: {
|
||||||
@ -659,7 +660,10 @@ class HassioAddonInfo extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private get _computeCannotIngressSidebar(): boolean {
|
private get _computeCannotIngressSidebar(): boolean {
|
||||||
return !this.addon.ingress || !this._computeHA92plus;
|
return (
|
||||||
|
!this.addon.ingress ||
|
||||||
|
!atLeastVersion(this.hass.connection.haVersion, 0, 92)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private get _computeUsesProtectedOptions(): boolean {
|
private get _computeUsesProtectedOptions(): boolean {
|
||||||
@ -668,11 +672,6 @@ class HassioAddonInfo extends LitElement {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private get _computeHA92plus(): boolean {
|
|
||||||
const [major, minor] = this.hass.config.version.split(".", 2);
|
|
||||||
return Number(major) > 0 || (major === "0" && Number(minor) >= 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async _startOnBootToggled(): Promise<void> {
|
private async _startOnBootToggled(): Promise<void> {
|
||||||
this._error = undefined;
|
this._error = undefined;
|
||||||
const data: HassioAddonSetOptionParams = {
|
const data: HassioAddonSetOptionParams = {
|
||||||
|
@ -15,6 +15,7 @@ import { navigate } from "../../../src/common/navigate";
|
|||||||
import { hassioStyle } from "../resources/hassio-style";
|
import { hassioStyle } from "../resources/hassio-style";
|
||||||
import { haStyle } from "../../../src/resources/styles";
|
import { haStyle } from "../../../src/resources/styles";
|
||||||
import "../components/hassio-card-content";
|
import "../components/hassio-card-content";
|
||||||
|
import { atLeastVersion } from "../../../src/common/config/version";
|
||||||
|
|
||||||
@customElement("hassio-addons")
|
@customElement("hassio-addons")
|
||||||
class HassioAddons extends LitElement {
|
class HassioAddons extends LitElement {
|
||||||
@ -22,9 +23,6 @@ class HassioAddons extends LitElement {
|
|||||||
@property() public addons?: HassioAddonInfo[];
|
@property() public addons?: HassioAddonInfo[];
|
||||||
|
|
||||||
protected render(): TemplateResult {
|
protected render(): TemplateResult {
|
||||||
const [major, minor] = this.hass.config.version.split(".", 2);
|
|
||||||
const ha105pluss =
|
|
||||||
Number(major) > 0 || (major === "0" && Number(minor) >= 105);
|
|
||||||
return html`
|
return html`
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<h1>Add-ons</h1>
|
<h1>Add-ons</h1>
|
||||||
@ -68,7 +66,11 @@ class HassioAddons extends LitElement {
|
|||||||
: addon.installed && addon.state === "started"
|
: addon.installed && addon.state === "started"
|
||||||
? "running"
|
? "running"
|
||||||
: "stopped"}
|
: "stopped"}
|
||||||
.iconImage=${ha105pluss && addon.icon
|
.iconImage=${atLeastVersion(
|
||||||
|
this.hass.connection.haVersion,
|
||||||
|
0,
|
||||||
|
105
|
||||||
|
) && addon.icon
|
||||||
? `/api/hassio/addons/${addon.slug}/icon`
|
? `/api/hassio/addons/${addon.slug}/icon`
|
||||||
: undefined}
|
: undefined}
|
||||||
></hassio-card-content>
|
></hassio-card-content>
|
||||||
|
@ -85,7 +85,7 @@
|
|||||||
"fuse.js": "^3.4.4",
|
"fuse.js": "^3.4.4",
|
||||||
"google-timezones-json": "^1.0.2",
|
"google-timezones-json": "^1.0.2",
|
||||||
"hls.js": "^0.12.4",
|
"hls.js": "^0.12.4",
|
||||||
"home-assistant-js-websocket": "4.4.1",
|
"home-assistant-js-websocket": "4.5.0",
|
||||||
"intl-messageformat": "^2.2.0",
|
"intl-messageformat": "^2.2.0",
|
||||||
"js-yaml": "^3.13.1",
|
"js-yaml": "^3.13.1",
|
||||||
"leaflet": "^1.4.0",
|
"leaflet": "^1.4.0",
|
||||||
|
11
src/common/config/version.ts
Normal file
11
src/common/config/version.ts
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
export const atLeastVersion = (
|
||||||
|
version: string,
|
||||||
|
major: number,
|
||||||
|
minor: number
|
||||||
|
): boolean => {
|
||||||
|
const [haMajor, haMinor] = version.split(".", 2);
|
||||||
|
return (
|
||||||
|
Number(haMajor) > major ||
|
||||||
|
(Number(haMajor) === major && Number(haMinor) >= minor)
|
||||||
|
);
|
||||||
|
};
|
@ -16,6 +16,10 @@ export interface LovelaceConfig {
|
|||||||
background?: string;
|
background?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface LegacyLovelaceConfig extends LovelaceConfig {
|
||||||
|
resources?: LovelaceResource[];
|
||||||
|
}
|
||||||
|
|
||||||
export interface LovelaceResource {
|
export interface LovelaceResource {
|
||||||
id: string;
|
id: string;
|
||||||
type: "css" | "js" | "module" | "html";
|
type: "css" | "js" | "module" | "html";
|
||||||
@ -278,6 +282,34 @@ export const getLovelaceCollection = (
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Legacy functions to support cast for Home Assistion < 0.107
|
||||||
|
const fetchLegacyConfig = (
|
||||||
|
conn: Connection,
|
||||||
|
force: boolean
|
||||||
|
): Promise<LovelaceConfig> =>
|
||||||
|
conn.sendMessagePromise({
|
||||||
|
type: "lovelace/config",
|
||||||
|
force,
|
||||||
|
});
|
||||||
|
|
||||||
|
const subscribeLegacyLovelaceUpdates = (
|
||||||
|
conn: Connection,
|
||||||
|
onChange: () => void
|
||||||
|
) => conn.subscribeEvents(onChange, "lovelace_updated");
|
||||||
|
|
||||||
|
export const getLegacyLovelaceCollection = (conn: Connection) =>
|
||||||
|
getCollection(
|
||||||
|
conn,
|
||||||
|
"_lovelace",
|
||||||
|
(conn2) => fetchLegacyConfig(conn2, false),
|
||||||
|
(_conn, store) =>
|
||||||
|
subscribeLegacyLovelaceUpdates(conn, () =>
|
||||||
|
fetchLegacyConfig(conn, false).then((config) =>
|
||||||
|
store.setState(config, true)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
export interface WindowWithLovelaceProm extends Window {
|
export interface WindowWithLovelaceProm extends Window {
|
||||||
llConfProm?: Promise<LovelaceConfig>;
|
llConfProm?: Promise<LovelaceConfig>;
|
||||||
llResProm?: Promise<LovelaceResource[]>;
|
llResProm?: Promise<LovelaceResource[]>;
|
||||||
|
@ -36,7 +36,7 @@ class HaPanelDevInfo extends LitElement {
|
|||||||
)}"
|
)}"
|
||||||
/></a>
|
/></a>
|
||||||
<br />
|
<br />
|
||||||
<h2>Home Assistant ${hass.config.version}</h2>
|
<h2>Home Assistant ${hass.connection.haVersion}</h2>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
${this.hass.localize(
|
${this.hass.localize(
|
||||||
|
@ -7524,10 +7524,10 @@ hoek@6.x.x:
|
|||||||
resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.1.3.tgz#73b7d33952e01fe27a38b0457294b79dd8da242c"
|
resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.1.3.tgz#73b7d33952e01fe27a38b0457294b79dd8da242c"
|
||||||
integrity sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==
|
integrity sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==
|
||||||
|
|
||||||
home-assistant-js-websocket@4.4.1:
|
home-assistant-js-websocket@4.5.0:
|
||||||
version "4.4.1"
|
version "4.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/home-assistant-js-websocket/-/home-assistant-js-websocket-4.4.1.tgz#609943ee5a3e6ec0673b69a6df0c29b86e0d57bf"
|
resolved "https://registry.yarnpkg.com/home-assistant-js-websocket/-/home-assistant-js-websocket-4.5.0.tgz#e1cbdd6c279f25839986ffc8368e8c2d533ee0ff"
|
||||||
integrity sha512-UXVn8rryoL4R9OCdFd04O2J7o1mM1WZIGQpZBVXMIinE9kn6tbkP3JkBGvTPh8mc6JmO3finoxH4ZtZgS+lbHQ==
|
integrity sha512-ig+zws1MW14XwjMtXRzDBxDZVwvEaluTA9Pq4wqRebKo0Hw7yVix2GFn0wzG75eqC3mc0BlJQiXqBeWhJuJ0pQ==
|
||||||
|
|
||||||
homedir-polyfill@^1.0.1:
|
homedir-polyfill@^1.0.1:
|
||||||
version "1.0.3"
|
version "1.0.3"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user