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>
47 lines
1.7 KiB
JavaScript
47 lines
1.7 KiB
JavaScript
/**
|
|
* Mærket på appens ikon — tallet i Dock'en på en Mac, på proceslinjen på en pc.
|
|
*
|
|
* Klokken i hovedet siger det samme, 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.
|
|
*
|
|
* Sat to steder, fordi der er to tilstande: her, mens appen er åben og selv ved
|
|
* hvor mange ulæste der er, og i service-workeren, når den ikke er — se `push`-
|
|
* lytteren i service-worker.js, som får tallet med i beskeden.
|
|
*
|
|
* Ét tal, ikke en optælling. Mærket sættes til hvad der *er*, aldrig til hvad der
|
|
* lige er kommet, så det kommer ned igen af sig selv, når beskederne bliver læst.
|
|
*/
|
|
|
|
/**
|
|
* Kan browseren mærke sit ikon? Safari og Chrome kan, når appen er lagt i Dock'en
|
|
* eller installeret; en almindelig fane har intet ikon at mærke, og kaldet gør
|
|
* ingenting. Firefox kan ikke endnu.
|
|
*/
|
|
export function supported() {
|
|
return typeof navigator !== 'undefined' && 'setAppBadge' in navigator;
|
|
}
|
|
|
|
/**
|
|
* Sætter mærket til `n`, eller fjerner det ved nul.
|
|
*
|
|
* Tavs, når det ikke kan lade sig gøre. Et mærke er en venlighed oven på klokken,
|
|
* der allerede står i fladen — ikke noget at afbryde nogen med, hvis browseren
|
|
* siger nej.
|
|
*/
|
|
export function setBadge(n) {
|
|
if (!supported()) return;
|
|
const count = Number(n) || 0;
|
|
try {
|
|
const done = count > 0 ? navigator.setAppBadge(count) : navigator.clearAppBadge();
|
|
done?.catch?.(() => {});
|
|
} catch {
|
|
// Nogle browsere kaster i stedet for at afvise. Det er det samme svar.
|
|
}
|
|
}
|
|
|
|
/** Fjerner mærket helt. Brugt ved log ud: den næste, der lander her, er en anden. */
|
|
export function clearBadge() {
|
|
setBadge(0);
|
|
}
|