aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-hub/src/meshbay_hub/static/group-page.js
diff options
context:
space:
mode:
authorChristophe Besson <cbesson@gmail.com>2026-08-24 19:46:06 +0200
committerChristophe Besson <cbesson@gmail.com>2026-08-24 19:46:06 +0200
commit62253b9592a83ce152d0c64471e20514218fb132 (patch)
treed41b84661da3252045937f5a90dc45ca7b029edc /packages/meshbay-hub/src/meshbay_hub/static/group-page.js
parentd053d083627f1f9f010752f8ad67941e22d49f27 (diff)
downloadmeshbay-62253b9592a83ce152d0c64471e20514218fb132.tar.gz
feat(hub): consolidate loose tracks, "&"/"and" fold, player close/queue
Album-grid readability, part two: - groupMusicEntries (music-app.js): an album bucket left with exactly one track - a real album tag, but only one song from it, not the whole release - clutters the grid the same way an untagged loose track does. Both kinds now fold into one "<artist> - Various" tile per artist, unless there is only one leftover track overall, where relabeling buys nothing and the track keeps its own name (or the generic placeholder, if it never had one). - foldKey also normalizes "&" vs "and" ("Artist & The Band" / "Artist and The Band" is one act, tagged both ways across different rips of the same catalogue) alongside the existing case/whitespace fold. - music-player.js: a close button pauses and tears the player down; an unmount cleanup effect (pause, revoke every cached blob URL) fires either way, whether that's the close button or the shell tearing the bar down on its own. A "current queue" button opens an overlay listing the whole playing queue with the current track highlighted, click any to jump to it - works identically regardless of how the queue was built (an album, the consolidated misc bucket, a single standalone track), since it only ever reads the player's own live tracks/order/pos. - group-page.js: this component is not remounted when switching to a *different* group on the same /group/:id route (only the groupId prop changes) - so without an explicit reset, music from one group would carry into the next one opened. Resets musicQueue to null on groupId change; a tab switch inside one group still leaves it alone. - Scrubbed real artist/band names that had leaked into code comments and test fixtures (enrich_audio.py's docstrings, several test_enrich_audio.py assertions, a music-app.js comment) - replaced with generic placeholders, no behavioural change. - i18n: music.various, music.player_close, music.player_queue, music.queue_title added across all ten locales. Client-side only except none of this touches the node at all. npm run sync-ui re-run. Full suite: 1129 passed, no regressions. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KBi7ALLGfwcjBXt57yNMcy
Diffstat (limited to 'packages/meshbay-hub/src/meshbay_hub/static/group-page.js')
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/static/group-page.js14
1 files changed, 12 insertions, 2 deletions
diff --git a/packages/meshbay-hub/src/meshbay_hub/static/group-page.js b/packages/meshbay-hub/src/meshbay_hub/static/group-page.js
index 01ab4e0..d2d56b5 100644
--- a/packages/meshbay-hub/src/meshbay_hub/static/group-page.js
+++ b/packages/meshbay-hub/src/meshbay_hub/static/group-page.js
@@ -99,6 +99,12 @@ function GroupPage({ groupId, group, token, username, userId, userPrefs,
const onPlayQueue = useCallback((tracks, startIndex) => {
setMusicQueue({ tracks, startIndex, nonce: Date.now() });
}, []);
+ // This component instance is not remounted when switching to a *different*
+ // group on the same /group/:id route (only groupId as a prop changes, see
+ // the connect effect's own comment below) — so leaving music playing here
+ // would carry it into whatever group is opened next. Tab switches inside
+ // one group must not stop it; leaving the group itself must.
+ useEffect(() => { setMusicQueue(null); }, [groupId]);
// Paired ≠ operator account. `is_node_admin` says the hub account owning this
// node is the one connecting; this says the node pinned *this browser's* key
// as an operator key. Only the second one lets you sign an invite, and only
@@ -595,9 +601,13 @@ function GroupPage({ groupId, group, token, username, userId, userPrefs,
once something has been played this session, the bar stays
mounted and keeps playing regardless of which tab is active —
switching to Chat or Files must not stop the music. Renders
- nothing of its own until onPlayQueue has been called once. */
+ nothing of its own until onPlayQueue has been called once.
+ Its own close button, and the effect above on leaving the
+ group, both go through the same setMusicQueue(null) — the
+ bar's own unmount cleanup is what actually stops playback. */
musicQueue && html`
- <${MusicPlayerBar} transportRef=${transportRef} gekRef=${gekRef} queue=${musicQueue} />
+ <${MusicPlayerBar} transportRef=${transportRef} gekRef=${gekRef} queue=${musicQueue}
+ onClose=${() => setMusicQueue(null)} />
`}
</div>
`;