From 663dcb13a5b5085b58ebb10ee5f5eff4bb3d07ce Mon Sep 17 00:00:00 2001 From: Kit La Touche Date: Sun, 30 Nov 2025 22:59:21 -0500 Subject: Show number of unread conversations in app badge --- ui/service-worker.js | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) (limited to 'ui/service-worker.js') diff --git a/ui/service-worker.js b/ui/service-worker.js index cb32d0d..eee3397 100644 --- a/ui/service-worker.js +++ b/ui/service-worker.js @@ -53,11 +53,55 @@ self.addEventListener('fetch', (event) => { event.respondWith(cacheFirst(event.request)); }); +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