From 4336d175ab7199368084f846806f319a696ad145 Mon Sep 17 00:00:00 2001 From: Kit La Touche Date: Wed, 11 Feb 2026 14:24:07 -0500 Subject: Add service worker behaviour back --- ui/service-worker.js | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/ui/service-worker.js b/ui/service-worker.js index 446fbc8..56bfca9 100644 --- a/ui/service-worker.js +++ b/ui/service-worker.js @@ -11,11 +11,56 @@ self.addEventListener('activate', (event) => { event.waitUntil(self.clients.claim()); }); +// ###### Handle unread badge: +const conversationReadStatus = { + // Format: + // conversationId: { lastRead: Optional(Datetime), lastMessage: Datetime } +}; + +function countUnreadChannels() { + return Object.values(conversationReadStatus) + .map(({ lastRead, lastMessage }) => { + return !lastRead || lastRead < lastMessage ? 1 : 0; + }) + .reduce((total, current) => total + current, 0); +} + self.addEventListener('push', (event) => { + // Let's show a notification right away so Safari doesn't tell Apple to be + // mad at us: event.waitUntil( self.registration.showNotification('Test notification', { actions: [], body: event.data.text(), }), ); + // Now we can do slower things that might fail: + conversationReadStatus[event.conversationId] ||= { lastRead: null, lastMessage: null }; + conversationReadStatus[event.conversationId].lastMessage = new Date(); + event.waitUntil( + (async () => { + if (navigator.setAppBadge) { + navigator.setAppBadge(countUnreadChannels()); + } + })(), + ); +}); + +// The client has to tell us when it has read a conversation: +self.addEventListener('message', (event) => { + switch (event.data?.type) { + case 'CONVERSATION_READ': + conversationReadStatus[event.data.conversationId] ||= { lastRead: null, lastMessage: null }; + conversationReadStatus[event.data.conversationId].lastMessage = event.data.at || new Date(); + event.waitUntil( + (async () => { + if (navigator.setAppBadge) { + navigator.setAppBadge(countUnreadChannels()); + } + })(), + ); + break; + default: + break; + } }); -- cgit v1.2.3