f81f083b24
Affects all notifications sent via service workers Fixes #1550
83 lines
1.7 KiB
JavaScript
83 lines
1.7 KiB
JavaScript
// The Lounge - https://github.com/thelounge/lounge
|
|
/* global clients */
|
|
"use strict";
|
|
|
|
self.addEventListener("message", function(event) {
|
|
showNotification(event, event.data);
|
|
});
|
|
|
|
self.addEventListener("push", function(event) {
|
|
if (!event.data) {
|
|
return;
|
|
}
|
|
|
|
showNotification(event, event.data.json());
|
|
});
|
|
|
|
function showNotification(event, payload) {
|
|
if (payload.type !== "notification") {
|
|
return;
|
|
}
|
|
|
|
// get current notification, close it, and draw new
|
|
event.waitUntil(
|
|
self.registration
|
|
.getNotifications({
|
|
tag: `chan-${payload.chanId}`,
|
|
})
|
|
.then((notifications) => {
|
|
for (const notification of notifications) {
|
|
notification.close();
|
|
}
|
|
|
|
return self.registration.showNotification(payload.title, {
|
|
tag: `chan-${payload.chanId}`,
|
|
badge: "img/logo-64.png",
|
|
icon: "img/touch-icon-192x192.png",
|
|
body: payload.body,
|
|
timestamp: payload.timestamp,
|
|
});
|
|
})
|
|
);
|
|
}
|
|
|
|
self.addEventListener("notificationclick", function(event) {
|
|
event.notification.close();
|
|
|
|
event.waitUntil(clients.matchAll({
|
|
includeUncontrolled: true,
|
|
type: "window",
|
|
}).then((clientList) => {
|
|
if (clientList.length === 0) {
|
|
if (clients.openWindow) {
|
|
return clients.openWindow(`.#${event.notification.tag}`);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
const client = findSuitableClient(clientList);
|
|
|
|
client.postMessage({
|
|
type: "open",
|
|
channel: event.notification.tag,
|
|
});
|
|
|
|
if ("focus" in client) {
|
|
client.focus();
|
|
}
|
|
}));
|
|
});
|
|
|
|
function findSuitableClient(clientList) {
|
|
for (let i = 0; i < clientList.length; i++) {
|
|
const client = clientList[i];
|
|
|
|
if (client.focused || client.visibilityState === "visible") {
|
|
return client;
|
|
}
|
|
}
|
|
|
|
return clientList[0];
|
|
}
|