import { html, render as litRender } from "lit-html"; import * as Output from "~/common/output.js"; import * as Playlist from "~/common/playlist.js"; import * as TID from "@atcute/tid"; 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", )); const createDialog = /** @type {HTMLDialogElement} */ (document.querySelector( "#create-playlist-dialog", )); document.querySelector("#create-playlist-btn")?.addEventListener( "click", () => { showCreatePlaylist(); }, ); 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 orderedPlaylists = playlists.filter((p) => !p.unordered); const unorderedPlaylists = playlists.filter((p) => p.unordered); list.hidden = playlists.length === 0; empty.hidden = playlists.length > 0; /** @param {typeof playlists} group @param {number} offset */ const renderGroup = (group, offset) => group.map(({ name, items }, index) => { const menuId = `playlists-menu-${offset + index}`; return html`