blob: d9e2596ed82543b750ecdb509e2eaf8598c36ec9 [file] [log] [blame]
import { registerSW } from 'virtual:pwa-register'
import i18n from './i18n.json'
import styleCSS from './style.css?inline'
window.addEventListener('load', () => {
const lang = i18n[window.EC_WWW_LANG || 'en']
const toastStyleEl = document.createElement('style')
toastStyleEl.innerText = styleCSS
document.head.appendChild(toastStyleEl)
const pwaToast = document.createElement('div')
pwaToast.className = 'pwa-toast'
pwaToast.setAttribute('role', 'alert')
pwaToast.innerHTML = `<div class="pwa-msg"></div><button class="pwa-close">${lang['Close']}</button><button class="pwa-refresh">${lang['Reload']}</button>`
document.body.appendChild(pwaToast)
const pwaMsg = pwaToast.querySelector('.pwa-msg')
const pwaCloseBtn = pwaToast.querySelector('.pwa-close')
const pwaRefreshBtn = pwaToast.querySelector('.pwa-refresh')
let refreshSW
let needRefresh
const refreshCallback = () => {
refreshSW && refreshSW(true)
needRefresh = false
}
const hideToast = () => {
pwaToast.classList.remove('show')
}
const showToast = (msg, isRefresh) => {
pwaMsg.innerText = msg
pwaToast.classList[isRefresh ? 'add' : 'remove']('is-refresh')
pwaToast.classList.add('show')
}
pwaRefreshBtn.addEventListener('click', refreshCallback)
pwaCloseBtn.addEventListener('click', hideToast)
const onOffline = () => needRefresh || showToast(lang['Offline'])
navigator.onLine || onOffline()
window.addEventListener('online', () => needRefresh || hideToast())
window.addEventListener('offline', onOffline)
refreshSW = registerSW({
immediate: true,
onOfflineReady() {
console.log('Page is ready to work offline')
},
onNeedRefresh() {
console.log('New content available')
needRefresh = true
showToast(lang['NewContent'], true)
},
onRegisterError(e) {
console.error('failed to register service worker', e)
}
})
})