summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ui/service-worker.js45
1 files changed, 45 insertions, 0 deletions
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;
+ }
});