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:
co-authored by
Claude Opus 5
parent
61634a6bb5
commit
b041b32aa2
@@ -4,6 +4,7 @@ import (
|
||||
"context"
|
||||
"crypto/ecdh"
|
||||
"crypto/rand"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"strings"
|
||||
@@ -64,3 +65,25 @@ func testVAPID(t *testing.T) VAPID {
|
||||
}
|
||||
return VAPID{Public: pub, Private: priv, Subject: "mailto:kristian@example.dk"}
|
||||
}
|
||||
|
||||
// Tallet til mærket på ikonet skal med i beskeden — og skal blive væk, når der
|
||||
// ikke er noget at sige. Service-workeren læser netop det: er `unread` ikke et
|
||||
// tal, står mærket, som det stod, frem for at blive nulstillet af en tælling, der
|
||||
// ikke lykkedes.
|
||||
func TestPayloadCarriesTheUnreadCount(t *testing.T) {
|
||||
with, err := json.Marshal(Payload{Title: "hej", Unread: 3})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !strings.Contains(string(with), `"unread":3`) {
|
||||
t.Errorf("payload = %s, want the unread count in it", with)
|
||||
}
|
||||
|
||||
without, err := json.Marshal(Payload{Title: "hej"})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if strings.Contains(string(without), "unread") {
|
||||
t.Errorf("payload = %s, want no count when there is none to send", without)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user