fix: Show a background image in case media doesn't load (#1622)
This commit is contained in:
@@ -63,6 +63,7 @@ export class CardElementManager {
|
|||||||
this._api.getMediaLoadedInfoManager().initialize();
|
this._api.getMediaLoadedInfoManager().initialize();
|
||||||
this._api.getMicrophoneManager().initialize();
|
this._api.getMicrophoneManager().initialize();
|
||||||
this._api.getKeyboardStateManager().initialize();
|
this._api.getKeyboardStateManager().initialize();
|
||||||
|
this._api.getStyleManager().initialize();
|
||||||
|
|
||||||
// These initializers are called when the config is updated, but on initial
|
// These initializers are called when the config is updated, but on initial
|
||||||
// creation of the card hass is not yet available when the config is first
|
// creation of the card hass is not yet available when the config is first
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { StyleInfo } from 'lit/directives/style-map';
|
import { StyleInfo } from 'lit/directives/style-map';
|
||||||
import { FrigateCardConfig } from '../config/types';
|
import { FrigateCardConfig } from '../config/types';
|
||||||
|
import irisLogo from '../images/camera-iris.svg';
|
||||||
import { aspectRatioToStyle, setOrRemoveAttribute } from '../utils/basic';
|
import { aspectRatioToStyle, setOrRemoveAttribute } from '../utils/basic';
|
||||||
import { View } from '../view/view';
|
import { View } from '../view/view';
|
||||||
import { CardStyleAPI } from './types';
|
import { CardStyleAPI } from './types';
|
||||||
@@ -11,6 +12,10 @@ export class StyleManager {
|
|||||||
this._api = api;
|
this._api = api;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public initialize(): void {
|
||||||
|
this._setCommonStyleProperties();
|
||||||
|
}
|
||||||
|
|
||||||
public setLightOrDarkMode = (): void => {
|
public setLightOrDarkMode = (): void => {
|
||||||
const config = this._api.getConfigManager().getConfig();
|
const config = this._api.getConfigManager().getConfig();
|
||||||
const isDarkMode =
|
const isDarkMode =
|
||||||
@@ -133,4 +138,11 @@ export class StyleManager {
|
|||||||
}
|
}
|
||||||
return aspectRatioToStyle({ defaultStatic: true });
|
return aspectRatioToStyle({ defaultStatic: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected _setCommonStyleProperties(): void {
|
||||||
|
this._api
|
||||||
|
.getCardElementManager()
|
||||||
|
.getElement()
|
||||||
|
.style.setProperty('--frigate-card-media-background-image', `url("${irisLogo}")`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -134,6 +134,7 @@ export interface CardElementAPI {
|
|||||||
getMediaLoadedInfoManager(): MediaLoadedInfoManager;
|
getMediaLoadedInfoManager(): MediaLoadedInfoManager;
|
||||||
getMediaPlayerManager(): MediaPlayerManager;
|
getMediaPlayerManager(): MediaPlayerManager;
|
||||||
getMicrophoneManager(): MicrophoneManager;
|
getMicrophoneManager(): MicrophoneManager;
|
||||||
|
getStyleManager(): StyleManager;
|
||||||
getQueryStringManager(): QueryStringManager;
|
getQueryStringManager(): QueryStringManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
@use 'media-background.scss';
|
||||||
@use 'media-layout.scss';
|
@use 'media-layout.scss';
|
||||||
|
|
||||||
img {
|
img {
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
@use 'media-background.scss';
|
||||||
|
|
||||||
:host {
|
:host {
|
||||||
display: block;
|
display: block;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
:host {
|
||||||
|
background-position: center;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-image: var(--frigate-card-media-background-image);
|
||||||
|
background-size: 25%;
|
||||||
|
}
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
@use 'media-background.scss';
|
||||||
@use 'media-layout.scss';
|
@use 'media-layout.scss';
|
||||||
|
|
||||||
:host {
|
:host {
|
||||||
|
|||||||
@@ -127,6 +127,7 @@ describe('CardElementManager', () => {
|
|||||||
expect(api.getExpandManager().initialize).toBeCalled();
|
expect(api.getExpandManager().initialize).toBeCalled();
|
||||||
expect(api.getMediaLoadedInfoManager().initialize).toBeCalled();
|
expect(api.getMediaLoadedInfoManager().initialize).toBeCalled();
|
||||||
expect(api.getMicrophoneManager().initialize).toBeCalled();
|
expect(api.getMicrophoneManager().initialize).toBeCalled();
|
||||||
|
expect(api.getStyleManager().initialize).toBeCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should disconnect', () => {
|
it('should disconnect', () => {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
||||||
import { FrigateCardView } from '../../src/config/types';
|
|
||||||
import { StyleManager } from '../../src/card-controller/style-manager';
|
import { StyleManager } from '../../src/card-controller/style-manager';
|
||||||
|
import { FrigateCardView } from '../../src/config/types';
|
||||||
|
import irisLogo from '../../src/images/camera-iris.svg';
|
||||||
import { createCardAPI, createConfig, createHASS, createView } from '../test-utils';
|
import { createCardAPI, createConfig, createHASS, createView } from '../test-utils';
|
||||||
|
|
||||||
// @vitest-environment jsdom
|
// @vitest-environment jsdom
|
||||||
@@ -9,6 +10,21 @@ describe('StyleManager', () => {
|
|||||||
vi.resetAllMocks();
|
vi.resetAllMocks();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('initialize should set common properties', () => {
|
||||||
|
it('should set media background', () => {
|
||||||
|
const api = createCardAPI();
|
||||||
|
const element = document.createElement('div');
|
||||||
|
vi.mocked(api.getCardElementManager().getElement).mockReturnValue(element);
|
||||||
|
const manager = new StyleManager(api);
|
||||||
|
|
||||||
|
manager.initialize();
|
||||||
|
|
||||||
|
expect(
|
||||||
|
element.style.getPropertyValue('--frigate-card-media-background-image'),
|
||||||
|
).toEqual(`url("${irisLogo}")`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('setLightOrDarkMode', () => {
|
describe('setLightOrDarkMode', () => {
|
||||||
it('dark mode unspecified', () => {
|
it('dark mode unspecified', () => {
|
||||||
const api = createCardAPI();
|
const api = createCardAPI();
|
||||||
|
|||||||
Reference in New Issue
Block a user