/**
* KGV PWA – Service Worker Registrierung & Install-Prompt
*/
( function () {
'use strict';
var cfg = window.kgvPwaConfig || {};
var swUrl = cfg.swUrl || '/sw.js';
var scope = cfg.scope || '/';
if ( cfg.requireLogin && ! cfg.isLoggedIn ) {
return;
}
// ------------------------------------------------------------------
// Service Worker registrieren
// ------------------------------------------------------------------
if ( 'serviceWorker' in navigator ) {
window.addEventListener( 'load', function () {
navigator.serviceWorker
.register( swUrl, { scope: scope } )
.catch( function ( err ) {
if ( window.console && console.warn ) {
console.warn( 'KGV PWA: Service Worker konnte nicht registriert werden.', err );
}
} );
} );
}
// ------------------------------------------------------------------
// Install-Banner
// ------------------------------------------------------------------
var deferredPrompt = null;
var banner = null;
/**
* Banner-Element erzeugen und in den DOM einhängen.
*/
function createBanner() {
banner = document.createElement( 'div' );
banner.id = 'kgv-pwa-install-banner';
banner.setAttribute( 'role', 'region' );
banner.setAttribute( 'aria-label', 'App installieren' );
banner.innerHTML =
'Diese Seite als App installieren' +
'' +
'';
document.body.appendChild( banner );
banner.querySelector( '.kgv-pwa-banner__install' ).addEventListener( 'click', triggerInstall );
banner.querySelector( '.kgv-pwa-banner__close' ).addEventListener( 'click', dismissBanner );
}
function showBanner() {
if ( ! banner ) {
createBanner();
}
banner.classList.add( 'kgv-pwa-banner--visible' );
}
function dismissBanner() {
if ( banner ) {
banner.classList.remove( 'kgv-pwa-banner--visible' );
}
// Nicht mehr anzeigen bis zum nächsten Tag
try {
sessionStorage.setItem( 'kgv_pwa_install_dismissed', '1' );
} catch ( e ) {}
}
/**
* Nativen Browser-Installationsdialog öffnen.
* Kann auch von einem beliebigen Button auf der Seite aufgerufen werden:
* document.dispatchEvent( new CustomEvent('kgv-pwa-install') );
*/
function triggerInstall() {
if ( ! deferredPrompt ) {
if ( isIos() ) {
window.alert( cfg.iosInstallNotice || 'Auf iPhone/iPad: Teilen > Zum Home-Bildschirm.' );
}
return;
}
deferredPrompt.prompt();
deferredPrompt.userChoice.then( function ( result ) {
deferredPrompt = null;
dismissBanner();
if ( window.console && console.info ) {
console.info( 'KGV PWA: Installationsentscheidung:', result.outcome );
}
} );
}
// Externer Aufruf via Custom Event ermöglichen
document.addEventListener( 'kgv-pwa-install', triggerInstall );
// ------------------------------------------------------------------
// beforeinstallprompt – Browser signalisiert Installierbarkeit
// ------------------------------------------------------------------
window.addEventListener( 'beforeinstallprompt', function ( e ) {
// Standard-Mini-Infobar des Browsers unterdrücken
e.preventDefault();
deferredPrompt = e;
// Banner nicht zeigen, wenn der Nutzer ihn in dieser Sitzung bereits weggeklickt hat
try {
if ( sessionStorage.getItem( 'kgv_pwa_install_dismissed' ) ) {
return;
}
} catch ( err ) {}
showBanner();
} );
// ------------------------------------------------------------------
// appinstalled – nach erfolgreicher Installation Banner verbergen
// ------------------------------------------------------------------
window.addEventListener( 'appinstalled', function () {
deferredPrompt = null;
dismissBanner();
} );
function isIos() {
return /iphone|ipad|ipod/i.test( window.navigator.userAgent || '' );
}
} )();