Changeset 0dbb5c1 in Klonkt


Ignore:
Timestamp:
06/18/2026 07:24:25 AM (3 months ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
6623453
Parents:
5c261b7
Message:

Mini player: clickable on desktop → navigates to the associated post

When playing from a post embed, the current post URL is stored on the track(s)
(survives the sessionStorage resume). The expand trigger (cover+title) navigates
on desktop (≥768px) via htmx to that post — audio keeps playing. Mobile (or no
post known, e.g. site tracks) keeps the current behaviour: open the player sheet.
audio-player.js cache-buster v16.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@…>

Location:
src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/assets/js/audio-player.js

    r5c261b7 r0dbb5c1  
    562562    if (sheet.classList.contains('is-open')) closeSheet(true);
    563563  });
    564   expandTrigger.addEventListener('click', openSheet);
     564  // Mini-player-info aanklikken:
     565  //  - DESKTOP (≥768px): spring naar de post waar de track vandaan komt (als bekend),
     566  //    via htmx zodat de audio blijft spelen. Geen post bekend → val terug op de sheet.
     567  //  - MOBIEL: altijd de uitgebreide speler-sheet openen (huidig gedrag).
     568  function goToPost(url) {
     569    if (window.htmx && url.charAt(0) === '/') {
     570      try {
     571        window.htmx.ajax('GET', url, { target: '#pcms-main', swap: 'innerHTML' });
     572        history.pushState({}, '', url);
     573        window.scrollTo(0, 0);
     574        return;
     575      } catch (e) { /* val terug op volledige navigatie */ }
     576    }
     577    location.href = url;
     578  }
     579  expandTrigger.addEventListener('click', () => {
     580    const t = queue[currentIndex];
     581    const isDesktop = window.matchMedia && window.matchMedia('(min-width: 768px)').matches;
     582    if (isDesktop && t && t.postUrl) { goToPost(t.postUrl); return; }
     583    openSheet();
     584  });
    565585  sheetClose.addEventListener('click', () => closeSheet());
    566586  sheetBackdrop.addEventListener('click', () => closeSheet());
     
    663683    e.preventDefault();
    664684    e.stopPropagation();
     685    // De post waar je VANAF afspeelt = de pagina waar je nu bent (de embeds staan
     686    // in de post-content). Bewaar 'm op de track(s) zodat de mini-player er op
     687    // desktop naartoe kan springen — overleeft ook de sessionStorage-resume.
     688    const postUrl = location.pathname + location.search;
    665689    // Resolve metadata: button-first, then closest .post-audio-track wrapper
    666690    // (only inline single-track widgets put the data on the wrapper).
     
    676700      try {
    677701        const tracks = JSON.parse(album.dataset.pcmsAlbum);
     702        tracks.forEach((t) => { t.postUrl = postUrl; });
    678703        // Start at the clicked track if we know its URL, else start at 0
    679704        // (cover-btn and playall both want to start from the beginning).
     
    684709      try {
    685710        const t = JSON.parse(trackData);
     711        t.postUrl = postUrl;
    686712        setQueue([t], 0);
    687713      } catch(err) { console.error('[pcms-audio] bad track JSON', err, trackData); }
    688714    } else if (trackUrl) {
    689715      // Fallback: at minimum we have the signed URL
    690       setQueue([{ url: trackUrl, title: 'Track', artist: '', cover: '' }], 0);
     716      setQueue([{ url: trackUrl, title: 'Track', artist: '', cover: '', postUrl }], 0);
    691717    } else {
    692718      console.error('[pcms-audio] no track data or url on button or wrapper', btn);
  • src/views/shell.ejs

    r5c261b7 r0dbb5c1  
    300300     ?v=N — cache-buster: bump bij elke audio-player.js wijziging zodat
    301301     Cloudflare (max-age=1y) niet de oude versie blijft serveren. -->
    302 <script src="/assets/js/audio-player.js?v=15"></script>
     302<script src="/assets/js/audio-player.js?v=16"></script>
    303303<!-- Eigen custom media-embeds (YouTube/SoundCloud/Spotify) via de echte
    304304     player-API's + gedeelde mutual-exclusion registry met de site-speler. -->
Note: See TracChangeset for help on using the changeset viewer.