Merge pull request #1895 from thelounge/xpaw/sw-notification-focus
Open and focus correct channel when clicking on push notifications
This commit is contained in:
commit
3c8fcadfe8
@ -8,6 +8,14 @@ let pushNotificationsButton;
|
|||||||
let clientSubscribed = null;
|
let clientSubscribed = null;
|
||||||
let applicationServerKey;
|
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.hasServiceWorker = false;
|
||||||
|
|
||||||
module.exports.configurePushNotifications = (subscribedOnServer, key) => {
|
module.exports.configurePushNotifications = (subscribedOnServer, key) => {
|
||||||
|
@ -45,17 +45,38 @@ self.addEventListener("notificationclick", function(event) {
|
|||||||
event.notification.close();
|
event.notification.close();
|
||||||
|
|
||||||
event.waitUntil(clients.matchAll({
|
event.waitUntil(clients.matchAll({
|
||||||
|
includeUncontrolled: true,
|
||||||
type: "window",
|
type: "window",
|
||||||
}).then(function(clientList) {
|
}).then((clientList) => {
|
||||||
for (var i = 0; i < clientList.length; i++) {
|
if (clientList.length === 0) {
|
||||||
var client = clientList[i];
|
if (clients.openWindow) {
|
||||||
if ("focus" in client) {
|
return clients.openWindow(`.#${event.notification.tag}`);
|
||||||
return client.focus();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (clients.openWindow) {
|
return;
|
||||||
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];
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user