Skip to content

Commit 1804518

Browse files
committed
Add service worker and PWA capabilities
1 parent 7448b92 commit 1804518

File tree

4 files changed

+149
-10
lines changed

4 files changed

+149
-10
lines changed

assets/styles.css

+1-1
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ task-category-form,
183183
left: 0;
184184
height: var(--bottomnav-height);
185185
width: 100%;
186-
z-index: 10;
186+
z-index: 1;
187187

188188
background-color: var(--bg-navbar);
189189
border-top: 1px solid var(--border-color-dark);

index.html

+34-5
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,7 @@
66
<meta http-equiv="X-UA-Compatible" content="IE=edge">
77
<title>My List</title>
88

9-
<link rel=stylesheet href=assets/styles.css>
10-
<script src=assets/lib.js></script>
11-
<script src=assets/components.js></script>
12-
<script src=assets/main.js></script>
13-
<script src=assets/sortable.min.js></script>
9+
<link rel="stylesheet" href="assets/styles.css">
1410

1511
<!-- favicon generated with https://realfavicongenerator.net/ -->
1612
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
@@ -165,6 +161,10 @@ <h3 id="faq">FAQ</h3>
165161
(<a href="https://github.com/JuanKman94/mylist">source code</a>).
166162
</p>
167163

164+
<p>
165+
<code id="app-version">v1.0</code>
166+
</p>
167+
168168
<ul class="italic text-left">
169169
<li>
170170
<a href="https://github.com/ipython/xkcd-font">xkcd font</a>,
@@ -367,6 +367,35 @@ <h3 class="task-category--title">
367367
</details>
368368
</template>
369369

370+
<script src="assets/lib.js"></script>
371+
<script src="assets/components.js"></script>
372+
<script src="assets/main.js"></script>
373+
<script src="assets/sortable.min.js"></script>
374+
375+
<script>
376+
const registerServiceWorker = async () => {
377+
if ('serviceWorker' in navigator) {
378+
try {
379+
const registration = await navigator
380+
.serviceWorker
381+
.register('sw.js', { scope: './' });
382+
383+
if (registration.installing) {
384+
console.log('Service worker is installing.');
385+
} else if (registration.waiting) {
386+
console.log('Service worker successfully installed.');
387+
} else if (registration.active) {
388+
console.log('Service worker is active!');
389+
}
390+
} catch (err) {
391+
console.error('Service worker cannot be installed.', err);
392+
}
393+
}
394+
};
395+
396+
registerServiceWorker();
397+
</script>
398+
370399
<!--
371400
SVG icons generated with https://github.com/jgarber623/svgeez and embedded for styling.
372401
Individual files located at: assets/icons/

site.webmanifest

+10-4
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
{
2-
"name": "",
3-
"short_name": "",
2+
"name": "My List",
3+
"short_name": "My List",
4+
"start_url": "./",
45
"icons": [
56
{
6-
"src": "/android-chrome-192x192.png",
7+
"src": "./apple-touch-icon.png",
8+
"sizes": "180x180",
9+
"type": "image/png"
10+
},
11+
{
12+
"src": "./android-chrome-192x192.png",
713
"sizes": "192x192",
814
"type": "image/png"
915
},
1016
{
11-
"src": "/android-chrome-512x512.png",
17+
"src": "./android-chrome-512x512.png",
1218
"sizes": "512x512",
1319
"type": "image/png"
1420
}

sw.js

+104
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
/**
2+
* Service Worker to enable PWA functionality.
3+
*
4+
* @see https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Guides/Caching
5+
* @see https://web.archive.org/web/20231106070218/https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Guides/Caching
6+
*/
7+
const CACHE_NAME = "mylist_1";
8+
const PRECACHED_RESOURCES = [
9+
"./",
10+
"./index.html",
11+
"./assets/styles.css",
12+
"./apple-touch-icon.png",
13+
"./favicon-32x32.png",
14+
"./favicon-16x16.png",
15+
"./assets/lib.js",
16+
"./assets/components.js",
17+
"./assets/main.js",
18+
"./assets/sortable.min.js",
19+
"./assets/sticky-tape.png",
20+
"./assets/images/check.svg",
21+
"./assets/icons/check.svg",
22+
"./assets/icons/info.svg",
23+
"./assets/icons/list.svg",
24+
"./assets/icons/loop.svg",
25+
"./assets/fonts/xkcd.otf",
26+
];
27+
28+
function isCacheable(request) {
29+
const url = new URL(request.url);
30+
31+
return !url.pathname.endsWith(".json");
32+
}
33+
34+
function precache() {
35+
return caches.open(CACHE_NAME)
36+
.then((cache) => {
37+
console.debug('[mylist:sw.js] #precache: adding cache for', PRECACHED_RESOURCES);
38+
39+
return cache.addAll(PRECACHED_RESOURCES);
40+
})
41+
}
42+
43+
function fetchResponsePromise(request, cache) {
44+
console.warn('Fetching response for', request.url);
45+
46+
return fetch(request)
47+
.then(function(networkResponse) {
48+
if (networkResponse.ok) {
49+
console.info('Storing cache for', request.url);
50+
cache.put(request, networkResponse.clone());
51+
}
52+
53+
return networkResponse;
54+
})
55+
.catch(function(err) {
56+
console.error('Could not fetch', request.url, '. Error:', err);
57+
return Response.error();
58+
});
59+
}
60+
61+
function cacheFirstWithRefresh(request) {
62+
return caches
63+
.open(CACHE_NAME)
64+
.then(function(cache) {
65+
if (cache.match(request)) {
66+
console.info('Found cache for', request.url);
67+
return cache.match(request);
68+
}
69+
70+
return fetchResponsePromise(request, cache);
71+
});
72+
}
73+
74+
self.addEventListener("fetch", function(ev) {
75+
const url = new URL(ev.request.url);
76+
77+
if (!url.pathname.endsWith(".json")) {
78+
ev.respondWith( cacheFirstWithRefresh(ev.request) );
79+
}
80+
});
81+
82+
self.addEventListener("install", function(ev) {
83+
console.log('[mylist:sw.js] #install: pre-caching files...');
84+
85+
ev.waitUntil(precache());
86+
});
87+
88+
self.addEventListener("push", function(ev) {
89+
console.debug('[mylist:sw.js] push event received:', ev);
90+
});
91+
92+
function enableNavigationPreload() {
93+
if (self.registration.navigationPreload) {
94+
return self.registration.navigationPreload.enable();
95+
}
96+
97+
return null;
98+
};
99+
100+
self.addEventListener('activate', (ev) => {
101+
ev.waitUntil(enableNavigationPreload());
102+
});
103+
104+
console.log('[mylist:sw.js] loaded.');

0 commit comments

Comments
 (0)