diff --git a/offline.html b/offline.html
new file mode 100644
index 0000000..b31cad6
--- /dev/null
+++ b/offline.html
@@ -0,0 +1,29 @@
+
+
+
+
+
+ Offline - MTG Card CSV Generator
+
+
+
+
+
+
+
+
You're Offline
+
It looks like you are not connected to the internet. Please check your connection and try again.
+
While offline, you can still browse previously loaded content, but some features might not work as expected.
+
+ Go back to the main page
+
+
+
+
+
+
diff --git a/sw.js b/sw.js
index b159467..403b958 100644
--- a/sw.js
+++ b/sw.js
@@ -1,24 +1,54 @@
-self.addEventListener('install', (event) => {
- event.waitUntil(
- caches.open('mtg-csv-generator-v1').then((cache) => {
- return cache.addAll([
- '/',
- '/index.html',
- '/styles.css',
- '/app.js',
- '/manifest.json',
- '/icon.png',
- '/cash-money.mp3',
- '/randomWords.js'
- ]);
- })
- );
+// This is the service worker with the combined offline experience (Offline page + Offline copy of pages)
+
+const CACHE = "pwabuilder-offline-page";
+
+importScripts('https://storage.googleapis.com/workbox-cdn/releases/5.1.2/workbox-sw.js');
+
+// TODO: replace the following with the correct offline fallback page i.e.: const offlineFallbackPage = "offline.html";
+const offlineFallbackPage = "ToDo-replace-this-name.html";
+
+self.addEventListener("message", (event) => {
+ if (event.data && event.data.type === "SKIP_WAITING") {
+ self.skipWaiting();
+ }
});
-self.addEventListener('fetch', (event) => {
- event.respondWith(
- caches.match(event.request).then((response) => {
- return response || fetch(event.request);
- })
- );
+self.addEventListener('install', async (event) => {
+ event.waitUntil(
+ caches.open(CACHE)
+ .then((cache) => cache.add(offlineFallbackPage))
+ );
});
+
+if (workbox.navigationPreload.isSupported()) {
+ workbox.navigationPreload.enable();
+}
+
+workbox.routing.registerRoute(
+ new RegExp('/*'),
+ new workbox.strategies.StaleWhileRevalidate({
+ cacheName: CACHE
+ })
+);
+
+self.addEventListener('fetch', (event) => {
+ if (event.request.mode === 'navigate') {
+ event.respondWith((async () => {
+ try {
+ const preloadResp = await event.preloadResponse;
+
+ if (preloadResp) {
+ return preloadResp;
+ }
+
+ const networkResp = await fetch(event.request);
+ return networkResp;
+ } catch (error) {
+
+ const cache = await caches.open(CACHE);
+ const cachedResp = await cache.match(offlineFallbackPage);
+ return cachedResp;
+ }
+ })());
+ }
+});
\ No newline at end of file