/*
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";
}
});