diff options
| author | Kit La Touche <kit@transneptune.net> | 2025-11-30 22:59:21 -0500 |
|---|---|---|
| committer | Kit La Touche <kit@transneptune.net> | 2025-11-30 22:59:21 -0500 |
| commit | 663dcb13a5b5085b58ebb10ee5f5eff4bb3d07ce (patch) | |
| tree | 957e310b190e5454bfc3301481bb6ff2a8def539 /ui/service-worker.js | |
| parent | 91c33501a315abe04aeed54aa27388ce0ad241ce (diff) | |
Show number of unread conversations in app badgenotifs-controls
Diffstat (limited to 'ui/service-worker.js')
| -rw-r--r-- | ui/service-worker.js | 44 |
1 files changed, 44 insertions, 0 deletions
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; + } }); |
