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>
|
</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>
|
||||||
|
@ -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'),
|
||||||
})
|
})
|
||||||
|
@ -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,
|
||||||
}
|
}
|
||||||
|
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'
|
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)
|
||||||
})()
|
})()
|
||||||
|
Reference in New Issue
Block a user