A music player that connects to your cloud/distributed storage.
5
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: favourites toggle

+30 -19
+30 -19
src/components/orchestrator/favourites/element.js
··· 1 - import { BroadcastableDiffuseElement, defineElement, query } from "~/common/element.js"; 1 + import { 2 + BroadcastableDiffuseElement, 3 + defineElement, 4 + query, 5 + } from "~/common/element.js"; 2 6 import { match as matchPlaylistItem } from "~/common/playlist.js"; 3 7 import { computed, signal } from "~/common/signal.js"; 4 8 import { filterFavourites } from "./common.js"; 9 + import * as Output from "~/common/output.js"; 5 10 6 11 /** 7 12 * @import {Track} from "~/definitions/types.d.ts" ··· 20 25 21 26 /** @type {ProxiedActions<Actions>} */ 22 27 #proxy; 28 + 29 + #toggleInFlight = false; 23 30 24 31 constructor() { 25 32 super(); ··· 99 106 return; 100 107 } 101 108 102 - const col = output.playlistItems.collection(); 103 - const playlistItems = col.state === "loaded" ? col.data : []; 109 + const playlistItems = await Output.data(output.playlistItems); 104 110 const result = await this.#proxy.include({ 105 111 playlistItems, 106 112 tracks: tracksArray, ··· 123 129 return; 124 130 } 125 131 126 - const col = output.playlistItems.collection(); 127 - const playlistItems = col.state === "loaded" ? col.data : []; 132 + const playlistItems = await Output.data(output.playlistItems); 128 133 const result = await this.#proxy.expel({ 129 134 playlistItems, 130 135 tracks: tracksArray, ··· 139 144 * @param {Track | Track[]} tracks 140 145 */ 141 146 async toggle(tracks) { 142 - const tracksArray = Array.isArray(tracks) ? tracks : [tracks]; 143 - if (tracksArray.length === 0) return; 147 + if (this.#toggleInFlight) return; 148 + this.#toggleInFlight = true; 144 149 145 - const output = this.#output.value; 146 - if (!output) { 147 - console.warn("Favourites orchestrator: output element not ready"); 148 - return; 149 - } 150 + try { 151 + const tracksArray = Array.isArray(tracks) ? tracks : [tracks]; 152 + if (tracksArray.length === 0) return; 153 + 154 + const output = this.#output.value; 155 + if (!output) { 156 + console.warn("Favourites orchestrator: output element not ready"); 157 + return; 158 + } 150 159 151 - const col = output.playlistItems.collection(); 152 - const playlistItems = col.state === "loaded" ? col.data : []; 153 - const result = await this.#proxy.toggle({ 154 - playlistItems, 155 - tracks: tracksArray, 156 - }); 160 + const playlistItems = await Output.data(output.playlistItems); 161 + const result = await this.#proxy.toggle({ 162 + playlistItems, 163 + tracks: tracksArray, 164 + }); 157 165 158 - if (result) await output.playlistItems.save(result); 166 + if (result) await output.playlistItems.save(result); 167 + } finally { 168 + this.#toggleInFlight = false; 169 + } 159 170 } 160 171 161 172 // 🛠️