diff --git a/public/src/service-worker.js b/public/src/service-worker.js index bcd3370ee0..63cb1704e5 100644 --- a/public/src/service-worker.js +++ b/public/src/service-worker.js @@ -40,10 +40,21 @@ self.addEventListener('fetch', function (event) { // Register event listener for the 'push' event. self.addEventListener('push', function (event) { // Keep the service worker alive until the notification is created. - const { title, body, data } = event.data.json(); - event.waitUntil( - self.registration.showNotification(title, { body, data }) - ); + const { title, body, tag, data } = event.data.json(); + + if (title && body) { + event.waitUntil( + self.registration.showNotification(title, { body, tag, data }) + ); + } else if (tag) { + event.waitUntil( + self.registration.getNotifications({ tag }).then((notifications) => { + notifications.forEach((notification) => { + notification.close(); + }); + }) + ); + } }); self.addEventListener('notificationclick', (event) => { diff --git a/src/notifications.js b/src/notifications.js index 8d80abf0b1..ce4245fba7 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -317,10 +317,13 @@ Notifications.pushGroups = async function (notification, groupNames) { Notifications.rescind = async function (nids) { nids = Array.isArray(nids) ? nids : [nids]; + + await plugins.hooks.fire('static:notifications.rescind', { nids }); await Promise.all([ db.sortedSetRemove('notifications', nids), db.deleteAll(nids.map(nid => `notifications:${nid}`)), ]); + plugins.hooks.fire('action:notifications.rescind', { nids }); }; Notifications.markRead = async function (nid, uid) {