Open and focus correct channel when clicking on push notifications

Affects all notifications sent via service workers

Fixes #1550
This commit is contained in:
Pavel Djundik 2017-12-24 16:06:23 +02:00
parent 7d49730bad
commit f81f083b24
2 changed files with 36 additions and 7 deletions

View file

@ -8,6 +8,14 @@ let pushNotificationsButton;
let clientSubscribed = null;
let applicationServerKey;
if ("serviceWorker" in navigator) {
navigator.serviceWorker.addEventListener("message", (event) => {
if (event.data && event.data.type === "open") {
$("#sidebar").find(`.chan[data-target="#${event.data.channel}"]`).click();
}
});
}
module.exports.hasServiceWorker = false;
module.exports.configurePushNotifications = (subscribedOnServer, key) => {

View file

@ -45,17 +45,38 @@ self.addEventListener("notificationclick", function(event) {
event.notification.close();
event.waitUntil(clients.matchAll({
includeUncontrolled: true,
type: "window",
}).then(function(clientList) {
for (var i = 0; i < clientList.length; i++) {
var client = clientList[i];
if ("focus" in client) {
return client.focus();
}).then((clientList) => {
if (clientList.length === 0) {
if (clients.openWindow) {
return clients.openWindow(`.#${event.notification.tag}`);
}
return;
}
if (clients.openWindow) {
return clients.openWindow(".");
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];
}