diff --git a/main.go b/main.go index e2027ca..d95158b 100644 --- a/main.go +++ b/main.go @@ -63,6 +63,11 @@ type registeredSubscription struct { Locations []string `json:"locations"` } +type webpushNotificationPayload struct { + Summary string `json:"summary"` + Location string `json:"location"` +} + type state struct { ctx context.Context db *sql.DB @@ -621,12 +626,22 @@ func listenForSummaryUpdates(state *state, locKey string) { case summary := <-c: log.Printf("sending summary for %v to subscribers...\n", locKey) + payload := webpushNotificationPayload{ + Summary: summary, + Location: locKey, + } + b, err := json.Marshal(&payload) + if err != nil { + log.Printf("error creating notification payload: %e\n", err) + continue + } + var wg sync.WaitGroup for _, sub := range state.subscriptions[locKey] { wg.Add(1) go func() { defer wg.Done() - _, err := webpush.SendNotificationWithContext(state.ctx, []byte(summary), sub.Subscription, &opts) + _, err := webpush.SendNotificationWithContext(state.ctx, b, sub.Subscription, &opts) if err != nil { log.Printf("failed to send summary for %v to sub id %v: %e\n", locKey, sub.ID, err) } diff --git a/web/sw.js b/web/sw.js index adc12d9..0aa4153 100644 --- a/web/sw.js +++ b/web/sw.js @@ -8,10 +8,26 @@ self.addEventListener('activate', function (event) { self.addEventListener("push", (event) => { if (event.data) { + const { summary, location } = event.data.json() event.waitUntil( self.registration.showNotification("7am weather summary", { - body: event.data.text() + data: location, + body: summary, }) ) } }) + +self.addEventListener("notificationclick", (event) => { + event.notification.close() + event.waitUntil( + self.clients.matchAll({ type: "window" }) + .then((clientList) => { + const loc = event.notification.data + for (const client of clientList) { + if (client.url === `/${loc}` && "focus" in client) return client.focus(); + } + if (self.clients.openWindow) return self.clients.openWindow(`/${loc}`); + }) + ) +})