thelounge/client/service-worker.js

83 lines
1.7 KiB
JavaScript
Raw Normal View History

// The Lounge - https://github.com/thelounge/thelounge
2017-07-10 19:47:03 +00:00
/* global clients */
"use strict";
self.addEventListener("message", function(event) {
showNotification(event, event.data);
});
2017-07-10 19:47:03 +00:00
self.addEventListener("push", function(event) {
if (!event.data) {
return;
}
showNotification(event, event.data.json());
});
2017-07-10 19:47:03 +00:00
function showNotification(event, payload) {
2017-09-03 15:57:07 +00:00
if (payload.type !== "notification") {
return;
2017-07-10 19:47:03 +00:00
}
2017-09-03 15:57:07 +00:00
// get current notification, close it, and draw new
event.waitUntil(
self.registration
.getNotifications({
tag: `chan-${payload.chanId}`,
2017-09-03 15:57:07 +00:00
})
.then((notifications) => {
for (const notification of notifications) {
notification.close();
}
return self.registration.showNotification(payload.title, {
tag: `chan-${payload.chanId}`,
badge: "img/icon-alerted-black-transparent-bg-72x72px.png",
icon: "img/icon-alerted-grey-bg-192x192px.png",
2017-09-03 15:57:07 +00:00
body: payload.body,
timestamp: payload.timestamp,
});
})
);
}
2017-07-10 19:47:03 +00:00
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}`);
2017-07-10 19:47:03 +00:00
}
return;
2017-07-10 19:47:03 +00:00
}
const client = findSuitableClient(clientList);
client.postMessage({
type: "open",
channel: event.notification.tag,
});
if ("focus" in client) {
client.focus();
2017-07-10 19:47:03 +00:00
}
}));
});
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];
}