/* PWA Installer */ console.log('PWA gestartet'); var deferredPrompt = deferredPrompt || null; let isPWAInstalled = false; let version = "2.2.5"; let manifest = null; async function loadManifest() { if (manifest) return manifest; // Reuse const response = await fetch("manifest.json"); manifest = await response.json(); return manifest; } async function requestNotificationPermission() { if (!("Notification" in window)) { console.warn("Benachrichtigungen werden vom Browser nicht unterstützt."); return; } const permission = await Notification.requestPermission(); if (permission === "granted") { console.log("[PWA] ✅ Benachrichtigungen erlaubt."); new Notification("🎉 JPX wurde installiert!"); } else { console.warn("[PWA] ❌ Benachrichtigungen wurden abgelehnt."); } } document.addEventListener("DOMContentLoaded", async function () { if ('serviceWorker' in navigator && navigator.serviceWorker.controller) { // Lade start_url aus manifest const manifest = await loadManifest(); const startUrl = manifest.start_url || "/de/"; console.log("[PWA] Sende start_url an SW:", startUrl); navigator.serviceWorker.controller.postMessage({ startUrl }); } const installicon = document.getElementById("install-icon") try { // Manifest.json laden und App-Daten setzen manifest = await loadManifest(); if(installicon){ bindInstallButton(); document.getElementById("install-icon").src = manifest.icons ? manifest.icons[0].src : "/fileadmin/Public/Images/Favicons/Messe/android-chrome-144x144.png"; document.getElementById("install-text").innerText = `Installiere ${manifest.name || "unsere App"}!`; } } catch (error) { console.error("[PWA] Fehler beim Laden des Manifests:", error); } // Prüfen, ob die App bereits installiert ist isPWAInstalled = window.matchMedia('(display-mode: standalone)').matches || window.navigator.standalone === true; if (isPWAInstalled) { console.log("[PWA] Die App ist bereits installiert."); return; // Keine Installation erforderlich } // Event: Installationsaufforderung abfangen window.addEventListener("beforeinstallprompt", (e) => { console.log("[PWA] beforeinstallprompt ausgelöst."); e.preventDefault(); deferredPrompt = e; const banner = document.getElementById("install-banner"); if (banner) { banner.style.display = "block"; } else { console.warn("[PWA] Installationsbanner nicht gefunden."); } // Optional: Button anzeigen, der dann das Banner auslöst const installBtn = document.getElementById('install-icon'); if (installBtn) { installBtn.style.display = 'block'; installBtn.addEventListener('click', async () => { installBtn.style.display = 'none'; if (deferredPrompt) { console.log("[PWA] Zeige Installationsbanner..."); deferredPrompt.prompt(); const { outcome } = await deferredPrompt.userChoice; console.log(`[PWA] Benutzerentscheidung: ${outcome}`); deferredPrompt = null; } else { console.log("[PWA] Kein gespeichertes Prompt vorhanden."); } }); } else { console.warn("[PWA] Kein install-icon im DOM gefunden."); } }); // Installationsbutton: PWA Installation starten document.getElementById("install-btn")?.addEventListener("click", async () => { if (!deferredPrompt) { console.log("[PWA] Kein Installations-Prompt verfügbar."); return; } try { await deferredPrompt.prompt(); // Muss innerhalb einer Benutzeraktion erfolgen const choiceResult = await deferredPrompt.userChoice; if (choiceResult.outcome === "accepted") { console.log("[PWA] Installation akzeptiert!"); // Jetzt Service Worker registrieren if ('serviceWorker' in navigator) { navigator.serviceWorker.register("/sw.js") .then(reg => console.log("[PWA] SW nachträglich registriert:", reg.scope)) .catch(err => console.error("[PWA] Fehler bei SW-Registrierung:", err)); navigator.serviceWorker.addEventListener("controllerchange", () => { console.log("[PWA] Neuer SW aktiv – Seite wird neu geladen."); window.location.reload(); }); } requestNotificationPermission(); } else { console.log("[PWA] Installation abgelehnt."); } // Banner ausblenden deferredPrompt = null; document.getElementById("install-banner").style.display = "none"; } catch (error) { console.error("[PWA] Fehler beim Installationsversuch:", error); } }); // Schließen-Button für das Banner document.getElementById("close-banner")?.addEventListener("click", () => { document.getElementById("install-banner").style.display = "none"; }); }); if ('serviceWorker' in navigator) { window.addEventListener('load', async () => { // Wenn der aktuelle Pfad ein einmaliger Registrierungslink ist: Service Worker NICHT registrieren const url = new URL(window.location.href); if (url.searchParams.has('tx_srfeuserregister_pi1[regHash]')) { console.log("[PWA] Registrierung übersprungen – Einmal-Link erkannt."); return; } if (await shouldRegisterServiceWorker()) { try { manifest = await loadManifest(); // Manifest.json laden, um die start_url zu setzen const startUrl = manifest.start_url || "/"; console.log("[PWA] Start-URL aus manifest.json:", startUrl); } catch (error) { console.error("[PWA] Fehler beim Laden des Manifests:", error); } } }); } function bindInstallButton() { const installBtn = document.getElementById('install-icon'); if (!installBtn) { console.warn("[PWA] install-icon nicht gefunden."); return; } installBtn.style.display = 'block'; installBtn.onclick = async () => { if (!deferredPrompt) { console.warn("[PWA] Kein Prompt vorhanden."); return; } console.log("[PWA] Install-Prompt wird angezeigt."); deferredPrompt.prompt(); const choice = await deferredPrompt.userChoice; console.log(`[PWA] Antwort: ${choice.outcome}`); deferredPrompt = null; installBtn.style.display = 'none'; }; } // Prüfen, ob der Service Worker registriert werden soll async function shouldRegisterServiceWorker() { return !isPWAInstalled; // Service Worker nur registrieren, wenn die App noch nicht installiert ist } // Debugging: Alle relevanten Events ausgeben ["appinstalled", "beforeinstallprompt", "DOMContentLoaded"].forEach(eventName => { window.addEventListener(eventName, (event) => { console.log(`[PWA] Event: ${eventName}`, event); }); }); document.addEventListener("DOMContentLoaded", () => { const saveButton = document.getElementById("save-for-offline"); const statusMessage = document.getElementById("offline-status"); const cachedPagesList = document.getElementById("cached-pages"); if ("serviceWorker" in navigator) { if(saveButton){ saveButton.addEventListener("click", async () => { if (navigator.serviceWorker.controller) { console.log("[PWA] Seite wird in den Cache gespeichert..."); const messageChannel = new MessageChannel(); messageChannel.port1.onmessage = (event) => { if (event.data.success) { statusMessage.textContent = "Seite wurde offline gespeichert! ✅"; statusMessage.style.color = "green"; listCachedPages(); // Liste aktualisieren } else { statusMessage.textContent = "Fehler beim Speichern. ❌"; statusMessage.style.color = "red"; } }; navigator.serviceWorker.controller.postMessage( { action: "cachePage", url: window.location.href }, [messageChannel.port2] ); } }); } // Gecachte Seiten abrufen async function listCachedPages() { if (navigator.serviceWorker.controller) { const messageChannel = new MessageChannel(); messageChannel.port1.onmessage = (event) => { if(cachedPagesList){ cachedPagesList.innerHTML = ""; // Liste leeren event.data.pages.forEach((url) => { const li = document.createElement("li"); li.innerHTML = ` ${url} `; cachedPagesList.appendChild(li); }); } // Löschen-Funktion für Buttons document.querySelectorAll(".delete-cached-page").forEach((button) => { button.addEventListener("click", (event) => { const url = event.target.getAttribute("data-url"); deleteCachedPage(url); }); }); }; navigator.serviceWorker.controller.postMessage( { action: "listCachedPages" }, [messageChannel.port2] ); } } // Seite aus Cache löschen async function deleteCachedPage(url) { if (navigator.serviceWorker.controller) { const messageChannel = new MessageChannel(); messageChannel.port1.onmessage = (event) => { if (event.data.success) { console.log(`[PWA] ${url} wurde aus dem Cache gelöscht.`); listCachedPages(); // Liste aktualisieren } else { console.error(`[PWA] Fehler beim Löschen von ${url}`); } }; navigator.serviceWorker.controller.postMessage( { action: "deletePage", url: url }, [messageChannel.port2] ); } } async function forceReload() { // Browser Cache umgehen if ('caches' in window) { const keys = await caches.keys(); for (const key of keys) { await caches.delete(key); } } // SW neu laden if (navigator.serviceWorker) { const regs = await navigator.serviceWorker.getRegistrations(); for (const reg of regs) { await reg.update(); } } // echter Reload const url = new URL(window.location.href); url.searchParams.set('_reload', Date.now()); window.location.href = url.toString(); } // Liste beim Laden aktualisieren listCachedPages(); } else { console.warn("[PWA] Service Worker wird nicht unterstützt."); if(saveButton) saveButton.style.display = "none"; } });