import { CSSResultGroup, html, LitElement, PropertyValues, TemplateResult, unsafeCSS, } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { createRef, ref, Ref } from 'lit/directives/ref.js'; import mediaGridStyle from '../scss/media-grid.scss'; import { ViewDisplayConfig } from '../types.js'; import { MediaGridController } from '../utils/media-grid-controller.js'; @customElement('frigate-card-media-grid') export class FrigateCardMediaGrid extends LitElement { @property({ attribute: false }) public selected?: string; @property({ attribute: false }) public displayConfig?: ViewDisplayConfig; protected _controller: MediaGridController | null = null; protected _refSlot: Ref = createRef(); connectedCallback(): void { super.connectedCallback(); // Ensure the controller is recreated. this.requestUpdate(); } disconnectedCallback(): void { this._controller?.destroy(); this._controller = null; super.disconnectedCallback(); } protected updated(changedProps: PropertyValues): void { if (!this._controller && this._refSlot.value) { this._controller = new MediaGridController(this._refSlot.value, { selected: this.selected, displayConfig: this.displayConfig, }); } if (changedProps.has('selected')) { if (this.selected) { this._controller?.selectCell(this.selected); } else { this._controller?.unselectAll(); } } if (changedProps.has('displayConfig')) { this._controller?.setDisplayConfig(this.displayConfig ?? null); } } protected render(): TemplateResult | void { return html` `; } static get styles(): CSSResultGroup { return unsafeCSS(mediaGridStyle); } } declare global { interface HTMLElementTagNameMap { 'frigate-card-media-grid': FrigateCardMediaGrid; } }