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.

feat: output configurator, always save to default and use it as fallback

+34 -4
+34 -4
src/components/configurator/output/element.js
··· 31 31 collection: computed(() => { 32 32 const out = this.#selectedOutput.value; 33 33 if (out) return out.tracks.collection(); 34 + 35 + const def = this.#defaultOutput.value; 36 + if (def) return def.tracks.collection(); 37 + 34 38 return this.#memory.tracks.value; 35 39 }), 36 40 reload: () => { 41 + const def = this.#defaultOutput.value; 42 + if (def) def.tracks.reload(); 43 + 37 44 const out = this.#selectedOutput.value; 38 45 if (out) return out.tracks.reload(); 46 + 39 47 return Promise.resolve(); 40 48 }, 41 49 save: async (newTracks) => { 50 + const def = this.#defaultOutput.value; 51 + if (def) await def.tracks.save(newTracks); 52 + 42 53 const out = this.#selectedOutput.value; 43 54 if (out) return await out.tracks.save(newTracks); 55 + 44 56 this.#memory.tracks.value = newTracks; 45 57 }, 46 58 state: computed(() => { 47 59 const out = this.#selectedOutput.value; 48 60 if (out) return out.tracks.state(); 61 + 62 + const def = this.#defaultOutput.value; 63 + if (def) def.tracks.state(); 64 + 49 65 return out === undefined ? "loading" : "loaded"; 50 66 }), 51 67 }, ··· 57 73 58 74 // SIGNALS 59 75 76 + #defaultOutput = signal( 77 + /** @type {Output | null | undefined} */ (undefined), 78 + ); 79 + 60 80 #memory = { 61 81 tracks: signal(/** @type {Track[]} */ ([])), 62 82 }; ··· 72 92 */ 73 93 async connectedCallback() { 74 94 super.connectedCallback(); 95 + 96 + const def_ault = this.getAttribute("default"); 97 + if (def_ault) this.#defaultOutput.value = await this.#findOutput(def_ault); 98 + 75 99 this.#selectedOutput.value = await this.#findSelectedOutput(); 76 100 } 77 101 78 102 // MISC 79 103 80 - async #findSelectedOutput() { 81 - const id = localStorage.getItem(`${STORAGE_PREFIX}/selected/id`) ?? 82 - this.getAttribute("default"); 104 + /** 105 + * @param {string} id 106 + */ 107 + async #findOutput(id) { 83 108 const el = id ? this.root().querySelector(`#${id}`) : null; 84 - 85 109 if (!el) return null; 86 110 87 111 await customElements.whenDefined(el.localName); ··· 94 118 } 95 119 96 120 return /** @type {Output} */ (/** @type {unknown} */ (el)); 121 + } 122 + 123 + async #findSelectedOutput() { 124 + const id = localStorage.getItem(`${STORAGE_PREFIX}/selected/id`); 125 + if (id) return this.#findOutput(id); 126 + return undefined; 97 127 } 98 128 99 129 /**