diff --git a/src/assets/graphicarts/favicon-144.png b/src/assets/graphicarts/favicon-144.png
new file mode 100644
index 0000000..9555059
Binary files /dev/null and b/src/assets/graphicarts/favicon-144.png differ
diff --git a/src/assets/index.html b/src/assets/index.html
index 33e44c0..c63bd75 100644
--- a/src/assets/index.html
+++ b/src/assets/index.html
@@ -3,16 +3,22 @@
yarr!
-
-
-
-
-
+
+
+
+
+
diff --git a/src/assets/javascripts/sw.js b/src/assets/javascripts/sw.js
new file mode 100644
index 0000000..1ab5f90
--- /dev/null
+++ b/src/assets/javascripts/sw.js
@@ -0,0 +1,34 @@
+const VERSION = "v2.4"
+const APP_STATIC_RESOURCES = [
+ "/",
+ "/static/stylesheets/bootstrap.min.css",
+ "/static/stylesheets/app.css",
+ "/static/graphicarts/favicon.svg",
+ "/static/graphicarts/favicon.png",
+]
+const CACHE_NAME = `yarr-${VERSION}`;
+
+self.addEventListener("install", (e) => {
+ e.waitUntil((async () => {
+ const cache = await caches.open(CACHE_NAME)
+ await cache.addAll(APP_STATIC_RESOURCES)
+ })()
+ )
+})
+
+// delete old caches on activate
+self.addEventListener("activate", (event) => {
+ event.waitUntil(
+ (async () => {
+ const names = await caches.keys()
+ await Promise.all(
+ names.map((name) => {
+ if (name !== CACHE_NAME) {
+ return caches.delete(name)
+ }
+ }),
+ )
+ await clients.claim()
+ })(),
+ )
+})
diff --git a/src/server/routes.go b/src/server/routes.go
index ee4b6c6..f22f161 100644
--- a/src/server/routes.go
+++ b/src/server/routes.go
@@ -41,6 +41,7 @@ func (s *Server) handler() http.Handler {
r.For("/", s.handleIndex)
r.For("/manifest.json", s.handleManifest)
+ r.For("/sw.js", s.handleServiceWorker)
r.For("/static/*path", s.handleStatic)
r.For("/api/status", s.handleStatus)
r.For("/api/folders", s.handleFolderList)
@@ -93,10 +94,24 @@ func (s *Server) handleManifest(c *router.Context) {
"sizes": "64x64",
"type": "image/png",
},
+ {
+ "src": s.BasePath + "/static/graphicarts/favicon-144.png",
+ "sizes": "144x144",
+ "type": "image/png",
+ },
+ {
+ "src": s.BasePath + "/static/graphicarts/favicon.svg",
+ "sizes": "any",
+ "type": "image/svg",
+ },
},
})
}
+func (s *Server) handleServiceWorker(c *router.Context) {
+ http.ServeFile(c.Out, c.Req, "src/assets/javascripts/sw.js")
+}
+
func (s *Server) handleStatus(c *router.Context) {
c.JSON(http.StatusOK, map[string]interface{}{
"running": s.worker.FeedsPending(),