You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
3.9 KiB
143 lines
3.9 KiB
(function () { |
|
var STORAGE_DISMISS = 'geonet-console-pwa-install-dismissed'; |
|
var STORAGE_INSTALLED = 'geonet-console-pwa-installed'; |
|
var DISMISS_DAYS = 7; |
|
var deferredPrompt = null; |
|
|
|
function isStandalone() { |
|
return window.matchMedia('(display-mode: standalone)').matches |
|
|| window.navigator.standalone === true; |
|
} |
|
|
|
function isIos() { |
|
return /iphone|ipad|ipod/i.test(navigator.userAgent); |
|
} |
|
|
|
function isDismissed() { |
|
try { |
|
var raw = localStorage.getItem(STORAGE_DISMISS); |
|
if (!raw) { |
|
return false; |
|
} |
|
var dismissedAt = parseInt(raw, 10); |
|
if (isNaN(dismissedAt)) { |
|
return false; |
|
} |
|
return (Date.now() - dismissedAt) < (DISMISS_DAYS * 24 * 60 * 60 * 1000); |
|
} catch (e) { |
|
return false; |
|
} |
|
} |
|
|
|
function markDismissed() { |
|
try { |
|
localStorage.setItem(STORAGE_DISMISS, String(Date.now())); |
|
} catch (e) {} |
|
hideBanner(); |
|
} |
|
|
|
function markInstalled() { |
|
try { |
|
localStorage.setItem(STORAGE_INSTALLED, '1'); |
|
} catch (e) {} |
|
hideBanner(); |
|
} |
|
|
|
function hideBanner() { |
|
var banner = document.getElementById('pwa-install-banner'); |
|
if (banner) { |
|
banner.hidden = true; |
|
banner.setAttribute('aria-hidden', 'true'); |
|
} |
|
} |
|
|
|
function showBanner(mode) { |
|
if (isStandalone() || isDismissed()) { |
|
return; |
|
} |
|
|
|
var banner = document.getElementById('pwa-install-banner'); |
|
if (!banner) { |
|
return; |
|
} |
|
|
|
var chromeRow = banner.querySelector('[data-pwa-install-chrome]'); |
|
var iosRow = banner.querySelector('[data-pwa-install-ios]'); |
|
|
|
if (mode === 'ios') { |
|
if (chromeRow) chromeRow.hidden = true; |
|
if (iosRow) iosRow.hidden = false; |
|
} else { |
|
if (chromeRow) chromeRow.hidden = false; |
|
if (iosRow) iosRow.hidden = true; |
|
} |
|
|
|
banner.hidden = false; |
|
banner.setAttribute('aria-hidden', 'false'); |
|
} |
|
|
|
function bindActions() { |
|
var banner = document.getElementById('pwa-install-banner'); |
|
if (!banner) { |
|
return; |
|
} |
|
|
|
var installBtn = banner.querySelector('[data-pwa-install-action]'); |
|
var dismissBtn = banner.querySelector('[data-pwa-install-dismiss]'); |
|
|
|
if (installBtn) { |
|
installBtn.addEventListener('click', function () { |
|
if (deferredPrompt) { |
|
deferredPrompt.prompt(); |
|
deferredPrompt.userChoice.then(function (choice) { |
|
if (choice.outcome === 'accepted') { |
|
markInstalled(); |
|
} |
|
deferredPrompt = null; |
|
}); |
|
return; |
|
} |
|
|
|
if (isIos()) { |
|
showBanner('ios'); |
|
} |
|
}); |
|
} |
|
|
|
if (dismissBtn) { |
|
dismissBtn.addEventListener('click', markDismissed); |
|
} |
|
} |
|
|
|
window.addEventListener('beforeinstallprompt', function (event) { |
|
event.preventDefault(); |
|
deferredPrompt = event; |
|
showBanner('chrome'); |
|
}); |
|
|
|
window.addEventListener('appinstalled', markInstalled); |
|
|
|
document.addEventListener('DOMContentLoaded', function () { |
|
bindActions(); |
|
|
|
if (isStandalone()) { |
|
hideBanner(); |
|
return; |
|
} |
|
|
|
if (isIos() && !isDismissed()) { |
|
window.setTimeout(function () { |
|
showBanner('ios'); |
|
}, 1500); |
|
return; |
|
} |
|
|
|
if (!deferredPrompt && !isDismissed()) { |
|
window.setTimeout(function () { |
|
if (!deferredPrompt && !isIos()) { |
|
return; |
|
} |
|
}, 2000); |
|
} |
|
}); |
|
})();
|
|
|