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
This commit is contained in:
		
				
					committed by
					
						
						Eugen Rochko
					
				
			
			
				
	
			
			
			
						parent
						
							b11ac88692
						
					
				
				
					commit
					719ab720a7
				
			@@ -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());
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -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));
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user