Skip to content
Snippets Groups Projects
sw.ts 1.47 KiB
Newer Older
insert's avatar
insert committed
/// <reference lib="webworker" />
insert's avatar
insert committed
import { precacheAndRoute } from "workbox-precaching";
insert's avatar
insert committed

insert's avatar
insert committed
declare let self: ServiceWorkerGlobalScope;
insert's avatar
insert committed

insert's avatar
insert committed
self.addEventListener("message", (event) => {
    if (event.data && event.data.type === "SKIP_WAITING") self.skipWaiting();
insert's avatar
insert committed
});

precacheAndRoute(self.__WB_MANIFEST);
insert's avatar
insert committed
self.addEventListener("push", (event) => {
    async function process() {
        if (event.data === null) return;
insert's avatar
insert committed
        // Need to write notification generator on server.
    }

    event.waitUntil(process());
});

// ? Open the app on notification click.
// https://stackoverflow.com/a/39457287
self.addEventListener("notificationclick", (event) => {
    const url = event.notification.data;
    event.notification.close();
    event.waitUntil(
        self.clients
            .matchAll({ includeUncontrolled: true, type: "window" })
            .then((windowClients) => {
                // Check if there is already a window/tab open with the target URL
                for (let i = 0; i < windowClients.length; i++) {
                    const client = windowClients[i];
                    // If so, just focus it.
                    if (client.url === url && "focus" in client) {
                        return client.focus();
                    }
                }

                // If not, then open the target URL in a new window/tab.
                if (self.clients.openWindow) {
                    return self.clients.openWindow(url);
                }
            }),
    );