@@ -15,6 +15,10 @@ import { UNAVAILABLE } from "../../../data/entity";
1515import type { ImageEntity } from "../../../data/image" ;
1616import { computeImageUrl } from "../../../data/image" ;
1717import type { HomeAssistant } from "../../../types" ;
18+ import {
19+ isMediaSourceContentId ,
20+ resolveMediaSource ,
21+ } from "../../../data/media_source" ;
1822
1923const UPDATE_INTERVAL = 10000 ;
2024const DEFAULT_FILTER = "grayscale(100%)" ;
@@ -67,6 +71,12 @@ export class HuiImage extends LitElement {
6771
6872 @state ( ) private _loadedImageSrc ?: string ;
6973
74+ @state ( ) private _resolvedImageSrc ?: string ;
75+
76+ @state ( ) private _resolvedDarkModeImageSrc ?: string ;
77+
78+ @state ( ) private _resolvedStateImages : Record < string , string > = { } ;
79+
7080 @state ( ) private _lastImageHeight ?: number ;
7181
7282 private _intersectionObserver ?: IntersectionObserver ;
@@ -130,6 +140,46 @@ export class HuiImage extends LitElement {
130140 if ( this . _loadState === LoadState . Loading && ! this . cameraImage ) {
131141 this . _loadState = LoadState . Loaded ;
132142 }
143+
144+ const firstHass = changedProps . has ( "hass" ) && ! changedProps . get ( "hass" ) ;
145+ if ( this . hass && ( changedProps . has ( "image" ) || firstHass ) ) {
146+ if ( this . image && isMediaSourceContentId ( this . image ) ) {
147+ resolveMediaSource ( this . hass , this . image ) . then ( ( result ) => {
148+ this . _resolvedImageSrc = result . url ;
149+ } ) ;
150+ } else {
151+ this . _resolvedImageSrc = this . image ;
152+ }
153+ }
154+ if ( this . hass && ( changedProps . has ( "darkModeImage" ) || firstHass ) ) {
155+ if ( this . darkModeImage && isMediaSourceContentId ( this . darkModeImage ) ) {
156+ resolveMediaSource ( this . hass , this . darkModeImage ) . then ( ( result ) => {
157+ this . _resolvedDarkModeImageSrc = result . url ;
158+ } ) ;
159+ } else {
160+ this . _resolvedDarkModeImageSrc = this . darkModeImage ;
161+ }
162+ }
163+ if ( changedProps . has ( "stateImage" ) || firstHass ) {
164+ this . _resolvedStateImages = { } ;
165+ Object . entries ( this . stateImage || { } ) . forEach ( ( entry ) => {
166+ const key = entry [ 0 ] as string ;
167+ const value = entry [ 1 ] as any ;
168+ const image =
169+ ( typeof value === "object" && value . media_content_id ) ||
170+ ( value as string | undefined ) ;
171+ if ( isMediaSourceContentId ( image ) ) {
172+ resolveMediaSource ( this . hass ! , image ) . then ( ( result ) => {
173+ this . _resolvedStateImages = {
174+ ...this . _resolvedStateImages ,
175+ [ key ] : result . url ,
176+ } ;
177+ } ) ;
178+ } else {
179+ this . _resolvedStateImages ! [ key ] = image ;
180+ }
181+ } ) ;
182+ }
133183 }
134184
135185 protected render ( ) {
@@ -155,20 +205,20 @@ export class HuiImage extends LitElement {
155205 imageSrc = this . _cameraImageSrc ;
156206 }
157207 } else if ( this . stateImage ) {
158- const stateImage = this . stateImage [ entityState ] ;
208+ const stateImage = this . _resolvedStateImages [ entityState ] ;
159209
160210 if ( stateImage ) {
161211 imageSrc = stateImage ;
162212 } else {
163- imageSrc = this . image ;
213+ imageSrc = this . _resolvedImageSrc ;
164214 imageFallback = true ;
165215 }
166216 } else if ( this . darkModeImage && this . hass . themes . darkMode ) {
167- imageSrc = this . darkModeImage ;
217+ imageSrc = this . _resolvedDarkModeImageSrc ;
168218 } else if ( stateObj && computeDomain ( stateObj . entity_id ) === "image" ) {
169219 imageSrc = computeImageUrl ( stateObj as ImageEntity ) ;
170220 } else {
171- imageSrc = this . image ;
221+ imageSrc = this . _resolvedImageSrc ;
172222 }
173223
174224 if ( imageSrc ) {
0 commit comments