From aed3f74be14e8c22a7514dfe2106f5bfcb5da2fd Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Fri, 18 Jun 2021 18:41:34 +0200 Subject: [PATCH] Don't show notification if the client is already focused Signed-off-by: Thomas Citharel --- js/src/service-worker.ts | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/js/src/service-worker.ts b/js/src/service-worker.ts index ee8ae6179..a3378a824 100644 --- a/js/src/service-worker.ts +++ b/js/src/service-worker.ts @@ -83,6 +83,24 @@ registerRoute( }) ); +async function isClientFocused(): Promise { + const windowClients = await self.clients.matchAll({ + type: "window", + includeUncontrolled: true, + }); + + let clientIsFocused = false; + for (let i = 0; i < windowClients.length; i++) { + const windowClient = windowClients[i] as WindowClient; + if (windowClient.focused) { + clientIsFocused = true; + break; + } + } + + return clientIsFocused; +} + self.addEventListener("push", async (event: PushEvent) => { if (!event.data) return; const payload = event.data.json(); @@ -99,7 +117,15 @@ self.addEventListener("push", async (event: PushEvent) => { }, }; - event.waitUntil(self.registration.showNotification(payload.title, options)); + event.waitUntil( + (async () => { + if (await isClientFocused()) { + // No need to show a notification, client already focused + return; + } + self.registration.showNotification(payload.title, options); + })() + ); }); self.addEventListener("notificationclick", function (event: NotificationEvent) {