diff options
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.js | 22 |
1 files changed, 19 insertions, 3 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 d2d56b5..2331977 100644 --- a/packages/meshbay-hub/src/meshbay_hub/static/group-page.js +++ b/packages/meshbay-hub/src/meshbay_hub/static/group-page.js @@ -432,10 +432,26 @@ function GroupPage({ groupId, group, token, username, userId, userPrefs, // A single dispatcher so any app can open the right modal without owning // video/preview state itself — Files' table and Chat's attachments both - // call this the same way. + // call this the same way. Audio goes to the same persistent player Music + // uses (onPlayQueue) rather than a modal — but the queue it builds is + // Explorer's own next/previous, deliberately not Music's: every audio + // entry sharing this file's literal containing directory, in filename + // order, never Music's artist/album grouping, which would pull in files + // nowhere near this one on disk. onPlayQueue always replaces whatever is + // already playing (from Music, or a previous Files click) rather than + // merging with it, so there is nothing to special-case here. const onPreview = useCallback((entry) => { - if (entry.type === 'video') setVideoEntry(entry); else setPreviewEntry(entry); - }, []); + if (entry.type === 'video') { setVideoEntry(entry); return; } + if (entry.type === 'audio') { + const siblings = entries + .filter((e) => e.type === 'audio' && e.path === entry.path) + .sort((a, b) => a.name.localeCompare(b.name)); + const startIndex = Math.max(0, siblings.findIndex((e) => e.id === entry.id)); + onPlayQueue(siblings, startIndex); + return; + } + setPreviewEntry(entry); + }, [entries, onPlayQueue]); const apps = visibleApps(enabledApps); const commonProps = { |