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:
@ -14,7 +14,7 @@
|
||||
</style>
|
||||
|
||||
<script>
|
||||
import { parseStatusStore, requestStore } from '../stores'
|
||||
import { parseStatusStore, requestStore, swStatusStore } from '../stores'
|
||||
|
||||
$: error = ($requestStore && $requestStore.error) ? $requestStore.error : null
|
||||
$: pendingRequest = Boolean($requestStore && !$requestStore.error)
|
||||
@ -36,4 +36,9 @@
|
||||
{$parseStatusStore}
|
||||
</div>
|
||||
{/if}
|
||||
{#if $swStatusStore}
|
||||
<div class='status-item'>
|
||||
{$swStatusStore}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
@ -2,11 +2,14 @@ import App from './components/App.svelte'
|
||||
|
||||
import * as stores from './stores'
|
||||
import * as services from './services'
|
||||
import serviceWorkerBoot from './sw-boot'
|
||||
|
||||
const boot = () => {
|
||||
|
||||
services.storageListener.register()
|
||||
|
||||
serviceWorkerBoot()
|
||||
|
||||
new App({
|
||||
target: document.querySelector('#root'),
|
||||
})
|
||||
|
@ -2,10 +2,12 @@ import configStore from './configStore'
|
||||
import eventStore from './eventStore'
|
||||
import parseStatusStore from './parseStatusStore'
|
||||
import requestStore from './requestStore'
|
||||
import swStatusStore from './swStatusStore'
|
||||
|
||||
export {
|
||||
configStore,
|
||||
eventStore,
|
||||
parseStatusStore,
|
||||
requestStore,
|
||||
swStatusStore,
|
||||
}
|
||||
|
3
lib/frontend/stores/swStatusStore.js
Normal file
3
lib/frontend/stores/swStatusStore.js
Normal file
@ -0,0 +1,3 @@
|
||||
import { writable } from 'svelte/store'
|
||||
|
||||
export default writable(null)
|
40
lib/frontend/sw-boot.js
Normal file
40
lib/frontend/sw-boot.js
Normal 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
|
||||
})
|
||||
}
|
@ -13,12 +13,6 @@ import { requestStore } from '../frontend/stores'
|
||||
import { Request } from '../frontend/records'
|
||||
|
||||
(() => {
|
||||
let request = null
|
||||
|
||||
requestStore.subscribe((updatedRequest) => {
|
||||
request = updatedRequest
|
||||
})
|
||||
|
||||
document.addEventListener('DOMContentLoaded', boot)
|
||||
|
||||
const configureLogger = (logger) => {
|
||||
@ -34,57 +28,5 @@ import { Request } from '../frontend/records'
|
||||
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)
|
||||
})()
|
||||
|
Reference in New Issue
Block a user