feat(beskeder): appens ikon bærer tallet på ulæste

Klokken i hovedet siger, hvad der er nyt — men kun til den, der kigger på
fanen. Det halve af pointen med at få besked er at få den, mens man laver
noget andet, og det eneste sted, appen kan sige noget dér, er på sit eget
ikon: mærket i Dock'en på en Mac, på proceslinjen på en pc.

Sat to steder, fordi der er to tilstande. Appen selv, mens den er åben og
kender tallet, og service-workeren, når den ikke er — og det er netop
dér, mærket er det, der siger, at der er sket noget.

Tallet kommer med i push-beskeden frem for at blive talt op af
service-workeren. Den husker ingenting mellem to opvågninger og kunne
derfor kun lægge én til noget, den ikke ved hvad er: et mærke, der tæller
sig selv op og aldrig kommer ned igen. Serveren ved det i forvejen, og en
tælling, der fejler, udelader feltet frem for at sende et nul — så står
mærket, som det stod, i stedet for at blive tørret af en optælling, der
ikke lykkedes.

Ét tal, aldrig en optælling: mærket sættes til hvad der *er*, så det går
ned af sig selv, når beskederne bliver læst. Og det ryddes ved log ud —
det står i Dock'en, også når ingen er logget ind.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
kristianwind
2026-09-08 12:12:54 +02:00
co-authored by Claude Opus 5
parent 61634a6bb5
commit b041b32aa2
7 changed files with 111 additions and 1 deletions
+13
View File
@@ -145,6 +145,19 @@ self.addEventListener('push', (event) => {
}
const title = payload.title || 'verdande';
// Mærket på appens ikon — i Dock'en på en Mac, på proceslinjen på en pc.
//
// Sat her, fordi det her er det eneste, der kører, når appen ikke er åben: det
// er netop dér, et tal på ikonet er det, der siger, at der er noget nyt. Tallet
// kommer med beskeden frem for at blive talt op her; en service-worker husker
// ingenting mellem to opvågninger, så et mærke, den selv talte, ville kun kunne
// gå opad.
//
// Kan browseren ikke sætte mærker, sker der ingenting. Det er ikke en fejl at
// melde om: beskeden selv kom frem, og den er hovedsagen.
if (typeof payload.unread === 'number' && 'setAppBadge' in self.navigator) {
self.navigator.setAppBadge(payload.unread).catch(() => {});
}
event.waitUntil(
self.registration.showNotification(title, {
body: payload.body || '',