diff --git a/src/components/media-player/ha-media-player-toggle.ts b/src/components/media-player/ha-media-player-toggle.ts index cbc7f9d122..0a82989909 100644 --- a/src/components/media-player/ha-media-player-toggle.ts +++ b/src/components/media-player/ha-media-player-toggle.ts @@ -1,14 +1,15 @@ import { type CSSResultGroup, LitElement, css, html } from "lit"; import { customElement, property } from "lit/decorators"; -import { mdiSpeaker } from "@mdi/js"; +import { mdiSpeaker, mdiSpeakerPause, mdiSpeakerPlay } from "@mdi/js"; +import memoizeOne from "memoize-one"; import type { HomeAssistant } from "../../types"; -import { computeStateName } from "../../common/entity/compute_state_name"; +import { computeEntityNameList } from "../../common/entity/compute_entity_name_display"; +import { computeRTL } from "../../common/util/compute_rtl"; import { fireEvent } from "../../common/dom/fire_event"; import "../ha-switch"; import "../ha-svg-icon"; -import type { MediaPlayerEntity } from "../../data/media-player"; @customElement("ha-media-player-toggle") class HaMediaPlayerToggle extends LitElement { @@ -20,15 +21,61 @@ class HaMediaPlayerToggle extends LitElement { @property({ type: Boolean }) public disabled = false; + private _computeDisplayData = memoizeOne( + ( + entityId: string, + entities: HomeAssistant["entities"], + devices: HomeAssistant["devices"], + areas: HomeAssistant["areas"], + floors: HomeAssistant["floors"], + isRTL: boolean, + stateObj: HomeAssistant["states"][string] + ) => { + const [entityName, deviceName, areaName] = computeEntityNameList( + stateObj, + [{ type: "entity" }, { type: "device" }, { type: "area" }], + entities, + devices, + areas, + floors + ); + + const primary = entityName || deviceName || entityId; + const secondary = [areaName, entityName ? deviceName : undefined] + .filter(Boolean) + .join(isRTL ? " ◂ " : " ▸ "); + + return { primary, secondary }; + } + ); + protected render() { const stateObj = this.hass.states[this.entityId]; + + let icon = mdiSpeaker; + if (stateObj.state === "playing") { + icon = mdiSpeakerPlay; + } else if (stateObj.state === "paused") { + icon = mdiSpeakerPause; + } + + const isRTL = computeRTL(this.hass); + + const { primary, secondary } = this._computeDisplayData( + this.entityId, + this.hass.entities, + this.hass.devices, + this.hass.areas, + this.hass.floors, + isRTL, + stateObj + ); + return html`