summaryrefslogtreecommitdiff
path: root/ui/service-worker.js
diff options
context:
space:
mode:
authorKit La Touche <kit@transneptune.net>2025-11-30 22:59:21 -0500
committerKit La Touche <kit@transneptune.net>2025-11-30 22:59:21 -0500
commit663dcb13a5b5085b58ebb10ee5f5eff4bb3d07ce (patch)
tree957e310b190e5454bfc3301481bb6ff2a8def539 /ui/service-worker.js
parent91c33501a315abe04aeed54aa27388ce0ad241ce (diff)
Show number of unread conversations in app badgenotifs-controls
Diffstat (limited to 'ui/service-worker.js')
-rw-r--r--ui/service-worker.js44
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;
+ }
});