import { html, render as litRender } from "lit-html"; import * as Output from "~/common/output.js"; import * as Playlist from "~/common/playlist.js"; import foundation from "~/common/foundation.js"; import { effect } from "~/common/signal.js"; /** * @import { PlaylistItem, Track } from "~/definitions/types.d.ts" */ foundation.setup({ title: "Playlists | Diffuse" }); //////////////////////////////////////////// // SETUP //////////////////////////////////////////// const outputOrchestrator = await foundation.orchestrator.output(); await customElements.whenDefined(outputOrchestrator.localName); //////////////////////////////////////////// // UI //////////////////////////////////////////// const list = /** @type {HTMLElement} */ (document.querySelector("#playlists-list")); const empty = /** @type {HTMLElement} */ (document.querySelector("#playlists-empty")); const dialog = /** @type {HTMLDialogElement} */ (document.querySelector("#playlists-dialog")); effect(() => { const playlistItemsCol = outputOrchestrator.playlistItems.collection(); const playlistItems = playlistItemsCol.state === "loaded" ? playlistItemsCol.data : []; const tracksCol = outputOrchestrator.tracks.collection(); const tracks = tracksCol.state === "loaded" ? tracksCol.data : []; const playlists = [...Playlist.gather(playlistItems).values()] .sort((a, b) => a.name.localeCompare(b.name)); const stats = computeStats(tracks, playlists); list.hidden = playlists.length === 0; empty.hidden = playlists.length > 0; litRender( html` ${playlists.map(({ name, items }, index) => { const { matchedCount, missingCount } = stats.get(name) ?? { matchedCount: 0, missingCount: 0 }; const menuId = `playlists-menu-${index}`; return html`