From 060286685753278c3b8324d286f9eb48c1b5edfa Mon Sep 17 00:00:00 2001
From: Nayeem Rahman <muhammed.rahman17@imperial.ac.uk>
Date: Thu, 10 Oct 2019 15:49:53 +0100
Subject: [PATCH] Add a service worker, manifest and logo

---
 public/index.html        |  16 ++++++++++
 public/logo.png          | Bin 0 -> 2047 bytes
 public/manifest.json     |  13 ++++++++
 public/service-worker.js |  66 +++++++++++++++++++++++++++++++++++++++
 4 files changed, 95 insertions(+)
 create mode 100644 public/logo.png
 create mode 100644 public/manifest.json
 create mode 100644 public/service-worker.js

diff --git a/public/index.html b/public/index.html
index 4f47abd..369b33f 100644
--- a/public/index.html
+++ b/public/index.html
@@ -2,6 +2,22 @@
 <html lang="en">
   <head>
     <meta charset="UTF-8" />
+    <link rel="manifest" href="manifest.json">
+    <link rel="shortcut icon" href="logo.png">
+    <script>
+      if (navigator.serviceWorker) {
+        navigator.serviceWorker
+          .register("service-worker.js")
+          .then(
+            (registration) =>
+              console.log(
+                `Service worker registered on scope ${registration.scope}`,
+              ),
+            (reason) =>
+              console.log(`Service worker failed to register ~ ${reason}`),
+          )
+      }
+    </script>
   </head>
   <body>
     <div>
diff --git a/public/logo.png b/public/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..e4266dca24a4059dcb0a7eec22db9384378d0bf3
GIT binary patch
literal 2047
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

literal 0
HcmV?d00001

diff --git a/public/manifest.json b/public/manifest.json
new file mode 100644
index 0000000..1b94f0d
--- /dev/null
+++ b/public/manifest.json
@@ -0,0 +1,13 @@
+{
+  "short_name": "Drawing App",
+  "name": "Drawing App",
+  "icons": [
+    {
+      "src": "/logo.png",
+      "type": "image/png",
+      "sizes": "144x144"
+    }
+  ],
+  "display": "standalone",
+  "start_url": "/index.html"
+}
diff --git a/public/service-worker.js b/public/service-worker.js
new file mode 100644
index 0000000..006388a
--- /dev/null
+++ b/public/service-worker.js
@@ -0,0 +1,66 @@
+self.addEventListener("install", (event) => {
+  console.info("Service worker installed.", event)
+})
+
+self.addEventListener("activate", (event) => {
+  console.info("Service worker activated.", event)
+})
+
+const CACHE_NAME = "APP-V0"
+const FILES_TO_CACHE = [
+  "/index.html",
+  "/js/app.js",
+  "/manifest.json",
+]
+const FILE_ALIASES = new Map([
+  ["/", "/index.html"]
+])
+
+const normalizeUrl = (url) => {
+  const url_ = new URL(url)
+  url_.pathname = url_.pathname.replace(/\/+/g, "/").replace(/\/$/, "")
+  if (FILE_ALIASES.has(url_.pathname)) {
+    url_.pathname = FILE_ALIASES.get(url_.pathname)
+  }
+  return url_.href
+}
+
+self.addEventListener("install", async (event) => {
+  const cache = await caches.open(CACHE_NAME)
+  const additions = cache.addAll(FILES_TO_CACHE)
+  await additions
+  console.info(`Files cached: [\n  ${FILES_TO_CACHE.join(`,\n  `)}\n]`)
+})
+
+self.addEventListener("activate", async (event) => {
+  const oldCacheKeys = (await caches.keys()).filter((key) => key != CACHE_NAME)
+  oldCacheKeys.forEach((key) => caches.delete(key))
+})
+
+
+self.addEventListener("fetch", (event) => {
+  const normalizedUrl = normalizeUrl(event.request.url)
+  let response = fetch(event.request)
+  if (FILES_TO_CACHE.includes(normalizedUrl)) {
+    response = response
+      .then(async (response) => {
+        const cache = await caches.open(CACHE_NAME)
+        await cache.put(normalizedUrl, response.clone())
+        return response
+      })
+      .catch(() => caches.match(normalizedUrl))
+      .catch(e => null)
+  }
+  event.respondWith(
+    fetch(event.request)
+      .then(async (response) => {
+        if (FILES_TO_CACHE.includes(new URL(normalizedUrl).pathname)) {
+          const cache = await caches.open(CACHE_NAME)
+          await cache.put(normalizedUrl, response.clone())
+        }
+        return response
+      })
+      .catch(() => caches.match(normalizedUrl))
+      .catch(e => null)
+  )
+})
-- 
GitLab