Migrate to Vite + ES module architecture
Split monolithic app.js (~1850 lines) into maintainable ES modules: - src/state.js — shared mutable state (S object) - src/utils.js — md5, esc, formatDur, toast - src/api.js — Subsonic API, Navidrome REST, iTunes API - src/player.js — playback, transport, queue, media session, preview - src/views.js — navigation, page loaders, card makers, search - src/ui.js — all modals, overlays, sidebar, settings - src/pwa.js — service worker registration + update banner - src/main.js — app init, connect, window globals Updated Dockerfile to multi-stage (Node build → nginx serve). Static assets (sw.js, manifest.json, icon.svg) moved to public/. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
ce53c48835
commit
9aded56713
18 files changed
+3134
-2
No files matched your search
+34
@@ -0,0 +1,34 @@
|
||||
export function injectPWA() {
|
||||
if(!('serviceWorker' in navigator)) return;
|
||||
|
||||
navigator.serviceWorker.addEventListener('message', e => {
|
||||
if(e.data?.type === 'SW_UPDATED') {
|
||||
localStorage.setItem('sw-version', e.data.version);
|
||||
showUpdateBanner(e.data.version);
|
||||
}
|
||||
if(e.data?.type === 'VERSION') {
|
||||
const prev = localStorage.getItem('sw-version');
|
||||
if(prev && prev !== e.data.version) showUpdateBanner(e.data.version);
|
||||
localStorage.setItem('sw-version', e.data.version);
|
||||
}
|
||||
});
|
||||
|
||||
navigator.serviceWorker.register('sw.js', { updateViaCache: 'none' }).then(reg => {
|
||||
reg.update().catch(() => {});
|
||||
const ctrl = navigator.serviceWorker.controller;
|
||||
if(ctrl) ctrl.postMessage({ type: 'GET_VERSION' });
|
||||
}).catch(() => {});
|
||||
}
|
||||
|
||||
export function showUpdateBanner(version) {
|
||||
if(document.getElementById('update-banner')) return;
|
||||
const b = document.createElement('div');
|
||||
b.id = 'update-banner';
|
||||
b.className = 'update-banner';
|
||||
b.innerHTML = `
|
||||
<span class="update-banner-text">✦ Update verfügbar${version ? ' <span style="opacity:.55;font-size:10px">('+version+')</span>' : ''}</span>
|
||||
<button class="update-banner-btn" onclick="window.location.reload()">Neu laden</button>
|
||||
<button class="update-banner-close" onclick="document.getElementById('update-banner').remove()">✕</button>
|
||||
`;
|
||||
document.body.appendChild(b);
|
||||
}
|
||||
Reference in new issue
Block a user