import { html, LitElement, unsafeCSS, type CSSResultGroup, type TemplateResult, } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { ifDefined } from 'lit/directives/if-defined.js'; import { createRef, ref, type Ref } from 'lit/directives/ref.js'; import { MediaLoadedInfoSourceController } from '../components-lib/media-loaded-info-source-controller.js'; import { VideoMediaPlayerController } from '../components-lib/media-player/video'; import videoPlayerStyle from '../scss/video-player.scss'; import type { MediaPlayer, MediaPlayerController, MediaPlayerElement } from '../types'; import { mayHaveAudio } from '../utils/audio'; import { hideMediaControlsTemporarily, MEDIA_LOAD_CONTROLS_HIDE_SECONDS, } from '../utils/controls'; import { createMediaLoadedInfo, dispatchMediaPauseEvent, dispatchMediaPlayEvent, dispatchMediaVolumeChangeEvent, } from '../utils/media-info'; @customElement('advanced-camera-card-video-player') export class AdvancedCameraCardVideoPlayer extends LitElement implements MediaPlayer { @property() public url?: string; @property() public targetID?: string; @property({ type: Boolean }) public controls = false; private _refVideo: Ref> = createRef(); private _mediaPlayerController = new VideoMediaPlayerController( this, () => this._refVideo.value ?? null, () => this.controls, ); private _mediaLoadedInfoSourceController = new MediaLoadedInfoSourceController(this, { getTargetID: () => this.targetID ?? null, }); public async getMediaPlayerController(): Promise { return this._mediaPlayerController; } protected render(): TemplateResult | void { return html` `; } static get styles(): CSSResultGroup { return unsafeCSS(videoPlayerStyle); } } declare global { interface HTMLElementTagNameMap { 'advanced-camera-card-video-player': AdvancedCameraCardVideoPlayer; } }