logo

mastofe

My custom branche(s) on git.pleroma.social/pleroma/mastofe
commit: 719ab720a7286c4968f1b42e1be385f5580de13e
parent: b11ac88692ad7a8765b0b15e6d7a882d171ffe81
Author: Sorin Davidoi <sorin.davidoi@gmail.com>
Date:   Tue, 18 Jul 2017 00:19:17 +0200

feat(push-notifications): Open link in current tab if possible (#4228)

* fix(push-notification): Open link in current tab if possible

* feat(sw): Skip waiting and claim clients

Diffstat:

Mapp/javascript/mastodon/service_worker/entry.js9+++++++++
Mapp/javascript/mastodon/service_worker/web_push_notifications.js20+++++++++++++++++++-
2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/app/javascript/mastodon/service_worker/entry.js b/app/javascript/mastodon/service_worker/entry.js @@ -1 +1,10 @@ import './web_push_notifications'; + +// Cause a new version of a registered Service Worker to replace an existing one +// that is already installed, and replace the currently active worker on open pages. +self.addEventListener('install', function(event) { + event.waitUntil(self.skipWaiting()); +}); +self.addEventListener('activate', function(event) { + event.waitUntil(self.clients.claim()); +}); diff --git a/app/javascript/mastodon/service_worker/web_push_notifications.js b/app/javascript/mastodon/service_worker/web_push_notifications.js @@ -50,6 +50,24 @@ const makeRequest = (notification, action) => credentials: 'include', }); +const openUrl = url => + self.clients.matchAll({ type: 'window' }).then(clientList => { + if (clientList.length !== 0 && 'navigate' in clientList[0]) { // Chrome 42-48 does not support navigate + const webClients = clientList + .filter(client => /\/web\//.test(client.url)) + .sort(client => client !== 'visible'); + + const visibleClient = clientList.find(client => client.visibilityState === 'visible'); + const focusedClient = clientList.find(client => client.focused); + + const client = webClients[0] || visibleClient || focusedClient || clientList[0]; + + return client.navigate(url).then(client => client.focus()); + } else { + return self.clients.openWindow(url); + } + }); + const removeActionFromNotification = (notification, action) => { const actions = notification.actions.filter(act => act.action !== action.action); @@ -75,7 +93,7 @@ const handleNotificationClick = (event) => { } } else { event.notification.close(); - resolve(self.clients.openWindow(event.notification.data.url)); + resolve(openUrl(event.notification.data.url)); } });