From 3433c03a940c6870e1c36a5a81fdb0db395e9cf3 Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Wed, 2 Sep 2020 11:51:19 +0200
Subject: [PATCH] Work on #445 - try simple service worker and offline page

---
 angular.json         |  4 ++++
 src/index.html       | 14 +++++++++++++
 src/pwa-offline.html |  8 ++++++++
 src/pwabuilder-sw.js | 48 ++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 74 insertions(+)
 create mode 100644 src/pwa-offline.html
 create mode 100644 src/pwabuilder-sw.js

diff --git a/angular.json b/angular.json
index 9c290d449..37a9618c1 100644
--- a/angular.json
+++ b/angular.json
@@ -23,6 +23,8 @@
               "src/favicon.ico",
               "src/.htaccess",
               "src/cassiopee.webmanifest",
+              "src/pwabuilder-sw.js",
+              "src/pwa-offline.html",
               {
                 "glob": "**/*.json",
                 "input": "src/",
@@ -114,6 +116,8 @@
               "src/assets",
               "src/favicon.ico",
               "src/cassiopee.webmanifest",
+              "src/pwabuilder-sw.js",
+              "src/pwa-offline.html",
               "src/**/*.json",
               "src/**/*.md",
               "src/**/*.png"
diff --git a/src/index.html b/src/index.html
index 01b8c0bdb..96d25eb92 100644
--- a/src/index.html
+++ b/src/index.html
@@ -12,7 +12,9 @@
    <link rel="icon" type="image/png" sizes="32x32" href="assets/icons/favicon-32x32.png">
    <link rel="icon" type="image/png" sizes="16x16" href="assets/icons/favicon-16x16.png">
    <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#ffffff">
+
    <link rel="manifest" href="cassiopee.webmanifest">
+   <meta name="theme-color" content="#003A80">
 
    <meta name="viewport" content="width=device-width, initial-scale=1">
 </head>
@@ -283,6 +285,18 @@
       }
    </script>
 
+    <script type="module">
+        /*
+        This code uses the pwa-update web component https://github.com/pwa-builder/pwa-update to register your service worker,
+        tell the user when there is an update available and let the user know when your PWA is ready to use offline.
+        */
+        import 'https://cdn.jsdelivr.net/npm/@pwabuilder/pwaupdate';
+
+        // généré par https://www.pwabuilder.com/serviceworker le 2020-09-02
+        const el = document.createElement('pwa-update');
+        document.body.appendChild(el);
+    </script>
+
 </body>
 
 </html>
\ No newline at end of file
diff --git a/src/pwa-offline.html b/src/pwa-offline.html
new file mode 100644
index 000000000..987f857cd
--- /dev/null
+++ b/src/pwa-offline.html
@@ -0,0 +1,8 @@
+<html>
+    <head>
+        <meta charset="utf-8">
+    </head>
+    <body>
+        <h1>Network is required to use Cassiopée</h1>
+    </body>
+</html>
\ No newline at end of file
diff --git a/src/pwabuilder-sw.js b/src/pwabuilder-sw.js
new file mode 100644
index 000000000..797a10ec0
--- /dev/null
+++ b/src/pwabuilder-sw.js
@@ -0,0 +1,48 @@
+// This is the "Offline page" service worker
+// généré par https://www.pwabuilder.com/serviceworker le 2020-09-02
+
+importScripts('https://storage.googleapis.com/workbox-cdn/releases/5.0.0/workbox-sw.js');
+
+const CACHE = "cassiopee-pwa";
+
+// TODO: replace the following with the correct offline fallback page i.e.: const offlineFallbackPage = "offline.html";
+const offlineFallbackPage = "pwa-offline.html";
+
+self.addEventListener("message", (event) => {
+  if (event.data && event.data.type === "SKIP_WAITING") {
+    self.skipWaiting();
+  }
+});
+
+self.addEventListener('install', async (event) => {
+  event.waitUntil(
+    caches.open(CACHE)
+      .then((cache) => cache.add(offlineFallbackPage))
+  );
+});
+
+if (workbox.navigationPreload.isSupported()) {
+  workbox.navigationPreload.enable();
+}
+
+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;
+      }
+    })());
+  }
+});
-- 
GitLab