mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-31 13:07:49 +00:00
Allow picture card to serve media images (#26291)
* Allow picture card to serve media images * small adjustments
This commit is contained in:
parent
4740a71bdd
commit
c14425b2d1
@ -24,6 +24,9 @@ export const browseLocalMediaPlayer = (
|
|||||||
media_content_id: mediaContentId,
|
media_content_id: mediaContentId,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const isMediaSourceContentId = (mediaId: string) =>
|
||||||
|
mediaId.startsWith("media-source://");
|
||||||
|
|
||||||
export const isLocalMediaSourceContentId = (mediaId: string) =>
|
export const isLocalMediaSourceContentId = (mediaId: string) =>
|
||||||
mediaId.startsWith("media-source://media_source");
|
mediaId.startsWith("media-source://media_source");
|
||||||
|
|
||||||
|
@ -18,6 +18,10 @@ import { createEntityNotFoundWarning } from "../components/hui-warning";
|
|||||||
import type { LovelaceCard, LovelaceCardEditor } from "../types";
|
import type { LovelaceCard, LovelaceCardEditor } from "../types";
|
||||||
import type { PictureCardConfig } from "./types";
|
import type { PictureCardConfig } from "./types";
|
||||||
import type { PersonEntity } from "../../../data/person";
|
import type { PersonEntity } from "../../../data/person";
|
||||||
|
import {
|
||||||
|
isMediaSourceContentId,
|
||||||
|
resolveMediaSource,
|
||||||
|
} from "../../../data/media_source";
|
||||||
|
|
||||||
@customElement("hui-picture-card")
|
@customElement("hui-picture-card")
|
||||||
export class HuiPictureCard extends LitElement implements LovelaceCard {
|
export class HuiPictureCard extends LitElement implements LovelaceCard {
|
||||||
@ -37,6 +41,8 @@ export class HuiPictureCard extends LitElement implements LovelaceCard {
|
|||||||
|
|
||||||
@state() private _config?: PictureCardConfig;
|
@state() private _config?: PictureCardConfig;
|
||||||
|
|
||||||
|
@state() private _resolvedImage?: string;
|
||||||
|
|
||||||
public getCardSize(): number {
|
public getCardSize(): number {
|
||||||
return 5;
|
return 5;
|
||||||
}
|
}
|
||||||
@ -53,7 +59,11 @@ export class HuiPictureCard extends LitElement implements LovelaceCard {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected shouldUpdate(changedProps: PropertyValues): boolean {
|
protected shouldUpdate(changedProps: PropertyValues): boolean {
|
||||||
if (!this._config || hasConfigChanged(this, changedProps)) {
|
if (
|
||||||
|
!this._config ||
|
||||||
|
hasConfigChanged(this, changedProps) ||
|
||||||
|
changedProps.has("_resolvedImage")
|
||||||
|
) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (this._config.image_entity && changedProps.has("hass")) {
|
if (this._config.image_entity && changedProps.has("hass")) {
|
||||||
@ -70,6 +80,33 @@ export class HuiPictureCard extends LitElement implements LovelaceCard {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected willUpdate(changedProps: PropertyValues) {
|
||||||
|
super.willUpdate(changedProps);
|
||||||
|
|
||||||
|
if (!this._config || !this.hass) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const firstHass =
|
||||||
|
changedProps.has("hass") && changedProps.get("hass") === undefined;
|
||||||
|
const imageChanged =
|
||||||
|
changedProps.has("_config") &&
|
||||||
|
changedProps.get("_config")?.image !== this._config?.image;
|
||||||
|
|
||||||
|
if (
|
||||||
|
(firstHass || imageChanged) &&
|
||||||
|
typeof this._config?.image === "string" &&
|
||||||
|
isMediaSourceContentId(this._config.image)
|
||||||
|
) {
|
||||||
|
this._resolvedImage = undefined;
|
||||||
|
resolveMediaSource(this.hass, this._config?.image).then((result) => {
|
||||||
|
this._resolvedImage = result.url;
|
||||||
|
});
|
||||||
|
} else if (imageChanged) {
|
||||||
|
this._resolvedImage = this._config?.image;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected updated(changedProps: PropertyValues): void {
|
protected updated(changedProps: PropertyValues): void {
|
||||||
super.updated(changedProps);
|
super.updated(changedProps);
|
||||||
if (!this._config || !this.hass) {
|
if (!this._config || !this.hass) {
|
||||||
@ -106,7 +143,7 @@ export class HuiPictureCard extends LitElement implements LovelaceCard {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let image: string | undefined = this._config.image;
|
let image: string | undefined = this._resolvedImage;
|
||||||
if (this._config.image_entity) {
|
if (this._config.image_entity) {
|
||||||
const domain: string = computeDomain(this._config.image_entity);
|
const domain: string = computeDomain(this._config.image_entity);
|
||||||
switch (domain) {
|
switch (domain) {
|
||||||
@ -121,6 +158,11 @@ export class HuiPictureCard extends LitElement implements LovelaceCard {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (image === undefined) {
|
||||||
|
// Bail if we're waiting for our image to be resolved from the media-source.
|
||||||
|
return nothing;
|
||||||
|
}
|
||||||
|
|
||||||
return html`
|
return html`
|
||||||
<ha-card
|
<ha-card
|
||||||
@action=${this._handleAction}
|
@action=${this._handleAction}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user