diff --git a/lib/index.js b/lib/index.js index 154ce67..01ff686 100644 --- a/lib/index.js +++ b/lib/index.js @@ -14,6 +14,7 @@ const app = express() app.set('view engine', 'ejs') app.set('views', path.join(__dirname, 'views')) +app.use(express.static(path.join(__dirname, 'public'))) app.use(favicon(path.join(__dirname, 'views', 'favicon.ico'))) app.use(bodyParser()) diff --git a/lib/public/service-worker.js b/lib/public/service-worker.js new file mode 100644 index 0000000..c452157 --- /dev/null +++ b/lib/public/service-worker.js @@ -0,0 +1,19 @@ +self.addEventListener('install', (event) => { + event.waitUntil( + caches.open('fb-to-ical').then((cache) => { + return cache.addAll([ + '/', + '/favicon.ico', + ]) + }) + ) +}) + +self.addEventListener('fetch', (event) => { + event.respondWith( + caches.match(event.request) + .then((response) => { + return response || fetch(event.request) + }) + ) +}) diff --git a/lib/views/index.ejs b/lib/views/index.ejs index 98f78fe..d8a39aa 100644 --- a/lib/views/index.ejs +++ b/lib/views/index.ejs @@ -72,6 +72,8 @@
+
+
@@ -112,6 +114,10 @@ } const getStorage = () => { + if (!useStorage) { + return null + } + const storage = localStorage.getItem('fb-to-ical-events') if (!storage) { @@ -249,6 +255,13 @@ error.classList.add('show') } + const setServiceWorkerStatus = (status) => { + clearStatuses() + const sw = document.querySelector('#service-worker') + sw.innerText = status + status ? sw.classList.add('show') : sw.classList.remove('show') + } + const pendingRequest = () => { input.disabled = true submitButton.disabled = true @@ -292,8 +305,43 @@ const link = document.querySelector("#current-download") const table = document.querySelector('#list') const tableBody = table.querySelector('tbody') + const noJScheckbox = document.querySelector('#nojs') - hydrateList() + const loadNoJS = () => { + if (!useStorage) { + return + } + const value = localStorage.getItem('fb-to-ical-nojs') + noJScheckbox.checked = value ? JSON.parse(value) : false + } + + loadNoJS() + + if (window.navigator && window.navigator.serviceWorker && !noJS()) { + const serviceWorker = window.navigator.serviceWorker + serviceWorker.register('service-worker.js', { + scope: './', + }).then((registration) => { + setServiceWorkerStatus(`Service worker registered with scope ${registration.scope}`) + setTimeout(() => { + setServiceWorkerStatus('') + }, 4500) + }).catch((err) => { + setServiceWorkerStatus(`Service worker error: ${err.toString()}`) + }) + } + + if (!noJS()) { + hydrateList() + } + + noJScheckbox.addEventListener('click', (event) => { + if (!useStorage) { + return + } + + localStorage.setItem('fb-to-ical-nojs', event.target.checked) + }) submitButton.addEventListener('click', (event) => { if (noJS()) {