Show an error page when offline
This commit is contained in:
parent
95984cfdab
commit
6207863271
|
@ -0,0 +1,149 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>You are offline</title>
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||||
|
<meta name="theme-color" content="#f0edf4">
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--primary: #5e35b1;
|
||||||
|
--muted: 108, 117, 125;
|
||||||
|
--background: #f0edf4;
|
||||||
|
}
|
||||||
|
|
||||||
|
*, *:before, *:after {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: var(--primary);
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
padding: 2rem 1rem 1rem 1rem;
|
||||||
|
margin: 0;
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
|
||||||
|
background-color: var(--background);
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-primary {
|
||||||
|
color: var(--primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-muted {
|
||||||
|
color: rgb(var(--muted));
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.font-weight-bold {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.d-none {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.links {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.links li {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.links li:not(:last-child):after {
|
||||||
|
content: ' • ';
|
||||||
|
}
|
||||||
|
|
||||||
|
.mb-0 {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mt-0 {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error-artwork-container {
|
||||||
|
display:flex;
|
||||||
|
justify-content: center;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error-artwork-container picture {
|
||||||
|
display: block;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error-artwork-container picture img {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error-text-container {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
body {
|
||||||
|
padding: 3rem 1rem 1rem 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error-artwork-container picture {
|
||||||
|
width: 576px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 992px) {
|
||||||
|
body {
|
||||||
|
padding: 5rem 1rem 3rem 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error-text-container {
|
||||||
|
align-self: center;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="error">
|
||||||
|
<div class="error-artwork-container">
|
||||||
|
<picture>
|
||||||
|
<source
|
||||||
|
srcset="/images/errors/small/404.png 576w,
|
||||||
|
/images/errors/medium/404.png 768w,
|
||||||
|
/images/errors/original/404.png 1200w">
|
||||||
|
<img src="/images/errors/small/404.png" alt="A raccoon peeking out of a bin, looking confused" />
|
||||||
|
</picture>
|
||||||
|
</div>
|
||||||
|
<div class="error-text-container">
|
||||||
|
<h1>
|
||||||
|
<span class="text-primary font-weight-bold">404</span>
|
||||||
|
<small class="text-muted">You are offline</small>
|
||||||
|
</h1>
|
||||||
|
<p>
|
||||||
|
This content is not available offline.
|
||||||
|
</p>
|
||||||
|
<ul class="links">
|
||||||
|
<li>
|
||||||
|
<a href="/">Retry</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
window.addEventListener('online', () => {
|
||||||
|
window.location.reload();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -1,3 +1,14 @@
|
||||||
|
const OFFLINE_CACHE_NAME = "offline";
|
||||||
|
// Bumping this version will force an update of the service worker
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
const OFFLINE_PAGE_VERSION = 1;
|
||||||
|
const OFFLINE_CACHE_PATHS = [
|
||||||
|
"/pwa_offline.html",
|
||||||
|
"/images/errors/small/404.png",
|
||||||
|
"/images/errors/medium/404.png",
|
||||||
|
"/images/errors/original/404.png"
|
||||||
|
];
|
||||||
|
|
||||||
self.addEventListener('push', function (event) {
|
self.addEventListener('push', function (event) {
|
||||||
if (event.data) {
|
if (event.data) {
|
||||||
const notification = event.data.json();
|
const notification = event.data.json();
|
||||||
|
@ -23,3 +34,31 @@ self.addEventListener('notificationclick', async event => {
|
||||||
console.warn(`Unhandled notification tag: ${event.notification.tag}`);
|
console.warn(`Unhandled notification tag: ${event.notification.tag}`);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
self.addEventListener('install', function (event) {
|
||||||
|
event.waitUntil(
|
||||||
|
(async () => {
|
||||||
|
const cache = await caches.open(OFFLINE_CACHE_NAME);
|
||||||
|
await cache.addAll(OFFLINE_CACHE_PATHS);
|
||||||
|
})()
|
||||||
|
);
|
||||||
|
// Immediately activate new versions of the service worker instead of waiting
|
||||||
|
self.skipWaiting();
|
||||||
|
});
|
||||||
|
|
||||||
|
self.addEventListener('fetch', function (event) {
|
||||||
|
event.respondWith(
|
||||||
|
(async () => {
|
||||||
|
try {
|
||||||
|
// Try to load the resource
|
||||||
|
return await fetch(event.request);
|
||||||
|
} catch (error) {
|
||||||
|
// Show an error page if offline
|
||||||
|
console.log("Fetch failed; returning offline page instead.", error);
|
||||||
|
|
||||||
|
const cache = await caches.open(OFFLINE_CACHE_NAME);
|
||||||
|
return await cache.match(OFFLINE_CACHE_PATHS[0]);
|
||||||
|
}
|
||||||
|
})()
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
Loading…
Reference in New Issue