1
0
mirror of https://github.com/comatory/fb2iCal synced 2025-06-05 22:09:25 +02:00

fix: extract service worker setup to Svelte app initialization

This commit is contained in:
Ondřej Synáček
2020-12-20 15:00:00 +01:00
parent a5b9887fec
commit 29ad7fcf73
6 changed files with 54 additions and 59 deletions

View File

@ -14,7 +14,7 @@
</style> </style>
<script> <script>
import { parseStatusStore, requestStore } from '../stores' import { parseStatusStore, requestStore, swStatusStore } from '../stores'
$: error = ($requestStore && $requestStore.error) ? $requestStore.error : null $: error = ($requestStore && $requestStore.error) ? $requestStore.error : null
$: pendingRequest = Boolean($requestStore && !$requestStore.error) $: pendingRequest = Boolean($requestStore && !$requestStore.error)
@ -36,4 +36,9 @@
{$parseStatusStore} {$parseStatusStore}
</div> </div>
{/if} {/if}
{#if $swStatusStore}
<div class='status-item'>
{$swStatusStore}
</div>
{/if}
</div> </div>

View File

@ -2,11 +2,14 @@ import App from './components/App.svelte'
import * as stores from './stores' import * as stores from './stores'
import * as services from './services' import * as services from './services'
import serviceWorkerBoot from './sw-boot'
const boot = () => { const boot = () => {
services.storageListener.register() services.storageListener.register()
serviceWorkerBoot()
new App({ new App({
target: document.querySelector('#root'), target: document.querySelector('#root'),
}) })

View File

@ -2,10 +2,12 @@ import configStore from './configStore'
import eventStore from './eventStore' import eventStore from './eventStore'
import parseStatusStore from './parseStatusStore' import parseStatusStore from './parseStatusStore'
import requestStore from './requestStore' import requestStore from './requestStore'
import swStatusStore from './swStatusStore'
export { export {
configStore, configStore,
eventStore, eventStore,
parseStatusStore, parseStatusStore,
requestStore, requestStore,
swStatusStore,
} }

View File

@ -0,0 +1,3 @@
import { writable } from 'svelte/store'
export default writable(null)

40
lib/frontend/sw-boot.js Normal file
View File

@ -0,0 +1,40 @@
import { swStatusStore } from './stores'
export default () => {
if (!window.navigator || !window.navigator.serviceWorker) {
return
}
const { serviceWorker } = window.navigator
serviceWorker.register('sw.js', {
scope: './',
}).then((registration) => {
swStatusStore.set(`Service worker registered with scope ${registration.scope}`)
setTimeout(() => {
swStatusStore.set(null)
}, 4500)
registration.addEventListener('updatefound', () => {
console.info('Service worker will be updated...')
const newWorker = registration.installing
newWorker.addEventListener('statechange', () => {
if (newWorker.state === 'installed') {
newWorker.postMessage({ action: 'skipWaiting' })
}
})
})
}).catch((err) => {
swStatusStore.set(`Service worker error: ${err.toString()}`)
})
let refreshing
serviceWorker.addEventListener('controllerchange', () => {
if (refreshing) {
return
}
window.location.reload()
refreshing = true
})
}

View File

@ -13,12 +13,6 @@ import { requestStore } from '../frontend/stores'
import { Request } from '../frontend/records' import { Request } from '../frontend/records'
(() => { (() => {
let request = null
requestStore.subscribe((updatedRequest) => {
request = updatedRequest
})
document.addEventListener('DOMContentLoaded', boot) document.addEventListener('DOMContentLoaded', boot)
const configureLogger = (logger) => { const configureLogger = (logger) => {
@ -34,57 +28,5 @@ import { Request } from '../frontend/records'
logger.setRemoteLogging(shouldTrack) logger.setRemoteLogging(shouldTrack)
} }
const clearStatuses = () => {
document.querySelectorAll('.status-item').forEach((item) => {
item.classList.remove('show')
})
}
const setServiceWorkerStatus = (status) => {
clearStatuses()
const sw = document.querySelector('#service-worker')
sw.innerText = status
status ? sw.classList.add('show') : sw.classList.remove('show')
}
const form = document.querySelector('form')
const submitButton = document.querySelector("#submit")
const input = document.querySelector("#url")
const link = document.querySelector("#current-download")
if (window.navigator && window.navigator.serviceWorker) {
const serviceWorker = window.navigator.serviceWorker
serviceWorker.register('sw.js', {
scope: './',
}).then((registration) => {
setServiceWorkerStatus(`Service worker registered with scope ${registration.scope}`)
setTimeout(() => {
setServiceWorkerStatus('')
}, 4500)
registration.addEventListener('updatefound', () => {
console.info('Service worker will be updated...')
const newWorker = registration.installing
newWorker.addEventListener('statechange', () => {
if (newWorker.state === 'installed') {
newWorker.postMessage({ action: 'skipWaiting' })
}
})
})
}).catch((err) => {
setServiceWorkerStatus(`Service worker error: ${err.toString()}`)
})
let refreshing
serviceWorker.addEventListener('controllerchange', () => {
if (refreshing) {
return
}
window.location.reload()
refreshing = true
})
}
configureLogger(logger) configureLogger(logger)
})() })()