Merge pull request #65 from kristianwind/maerket-paa-ikonet
feat(beskeder): appens ikon bærer tallet på ulæste
This commit is contained in:
@@ -237,7 +237,16 @@ func (s *Server) pushToUser(userID, title, body, projectID string) pushOutcome {
|
||||
if projectID == "" {
|
||||
target = "/"
|
||||
}
|
||||
payload := push.Payload{Title: title, Body: body, URL: target}
|
||||
// Mærket på ikonet følger med beskeden. Talt her frem for i service-workeren,
|
||||
// som ikke har nogen hukommelse mellem to opvågninger og derfor kun kunne lægge
|
||||
// én til noget, den ikke kender — et mærke, der tæller sig selv op og aldrig
|
||||
// ned. Fejler tællingen, sendes beskeden alligevel: en besked uden et tal er
|
||||
// stadig en besked.
|
||||
unread, err := s.db.UnreadNotificationCount(ctx, userID)
|
||||
if err != nil {
|
||||
s.log.Warn("unread count for push", "err", err)
|
||||
}
|
||||
payload := push.Payload{Title: title, Body: body, URL: target, Unread: unread}
|
||||
subject := s.vapidSubject()
|
||||
for _, sub := range subs {
|
||||
err := push.Send(ctx, push.Subscription{
|
||||
|
||||
@@ -56,6 +56,13 @@ type Payload struct {
|
||||
Body string `json:"body,omitempty"`
|
||||
URL string `json:"url,omitempty"`
|
||||
Tag string `json:"tag,omitempty"`
|
||||
// Unread er tallet, mærket på appens ikon skal stå på, når beskeden lander.
|
||||
//
|
||||
// Sendt med frem for talt i service-workeren. Den har ingen hukommelse mellem
|
||||
// to opvågninger, så den kan kun lægge én til noget, den ikke ved hvad er — og
|
||||
// et mærke, der tæller sig selv op, kommer aldrig ned igen af sig selv. Tallet
|
||||
// er serverens, og serveren ved det i forvejen.
|
||||
Unread int `json:"unread,omitempty"`
|
||||
}
|
||||
|
||||
var b64 = base64.RawURLEncoding
|
||||
|
||||
@@ -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