): void {
this._params!.mediaPickedCallback(ev.detail);
if (this._action !== "play") {
@@ -73,6 +75,10 @@ class DialogMediaPlayerBrowse extends LitElement {
}
}
+ private get _action(): MediaPlayerBrowseAction {
+ return this._params!.action || "play";
+ }
+
static get styles(): CSSResultGroup {
return [
haStyleDialog,
diff --git a/src/components/media-player/ha-media-player-browse.ts b/src/components/media-player/ha-media-player-browse.ts
index 0d5ec6adb8..7c08bad54c 100644
--- a/src/components/media-player/ha-media-player-browse.ts
+++ b/src/components/media-player/ha-media-player-browse.ts
@@ -53,19 +53,21 @@ import "../ha-svg-icon";
declare global {
interface HASSDomEvents {
"media-picked": MediaPickedEvent;
+ "media-browsed": { ids: MediaPlayerItemId[]; back?: boolean };
}
}
+export interface MediaPlayerItemId {
+ media_content_id: string | undefined;
+ media_content_type: string | undefined;
+}
+
@customElement("ha-media-player-browse")
export class HaMediaPlayerBrowse extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant;
@property() public entityId!: string;
- @property() public mediaContentId?: string;
-
- @property() public mediaContentType?: string;
-
@property() public action: MediaPlayerBrowseAction = "play";
@property({ type: Boolean }) public dialog = false;
@@ -76,11 +78,13 @@ export class HaMediaPlayerBrowse extends LitElement {
@property({ type: Boolean, attribute: "scroll", reflect: true })
private _scrolled = false;
- @state() private _loading = false;
+ @property() public navigateIds!: MediaPlayerItemId[];
@state() private _error?: { message: string; code: string };
- @state() private _mediaPlayerItems: MediaPlayerItem[] = [];
+ @state() private _parentItem?: MediaPlayerItem;
+
+ @state() private _currentItem?: MediaPlayerItem;
@query(".header") private _header?: HTMLDivElement;
@@ -109,47 +113,18 @@ export class HaMediaPlayerBrowse extends LitElement {
}
}
- public navigateBack() {
- this._mediaPlayerItems!.pop();
- const item = this._mediaPlayerItems!.pop();
- if (!item) {
- return;
- }
- this._navigate(item);
- }
-
protected render(): TemplateResult {
- if (this._loading) {
+ if (this._error) {
+ return html`
+ ${this._renderError(this._error)}
+ `;
+ }
+
+ if (!this._currentItem) {
return html``;
}
- if (this._error && !this._mediaPlayerItems.length) {
- if (this.dialog) {
- this._closeDialogAction();
- showAlertDialog(this, {
- title: this.hass.localize(
- "ui.components.media-browser.media_browsing_error"
- ),
- text: this._renderError(this._error),
- });
- } else {
- return html`
- ${this._renderError(this._error)}
- `;
- }
- }
-
- if (!this._mediaPlayerItems.length) {
- return html``;
- }
-
- const currentItem =
- this._mediaPlayerItems[this._mediaPlayerItems.length - 1];
-
- const previousItem: MediaPlayerItem | undefined =
- this._mediaPlayerItems.length > 1
- ? this._mediaPlayerItems[this._mediaPlayerItems.length - 2]
- : undefined;
+ const currentItem = this._currentItem;
const subtitle = this.hass.localize(
`ui.components.media-browser.class.${currentItem.media_class}`
@@ -202,11 +177,11 @@ export class HaMediaPlayerBrowse extends LitElement {
: html``}