51 lines
1.6 KiB
JavaScript
51 lines
1.6 KiB
JavaScript
/* Service Worker de mensajería (Web Push) para Sky Balloons México.
|
|
No hace caché de la app: solo escucha 'push' y 'notificationclick'. */
|
|
|
|
self.addEventListener("install", () => self.skipWaiting());
|
|
self.addEventListener("activate", (event) => event.waitUntil(self.clients.claim()));
|
|
|
|
self.addEventListener("push", (event) => {
|
|
let payload = {};
|
|
try {
|
|
payload = event.data ? event.data.json() : {};
|
|
} catch {
|
|
payload = { title: "Sky Balloons México", body: event.data ? event.data.text() : "" };
|
|
}
|
|
|
|
const titulo = payload.title || payload.titulo || "Sky Balloons México";
|
|
const opciones = {
|
|
body: payload.body || payload.cuerpo || "",
|
|
icon: payload.icon || "/icons/icon-192.png",
|
|
badge: payload.badge || "/icons/icon-192.png",
|
|
tag: payload.tag,
|
|
data: { url: payload.url || (payload.data && payload.data.url) || "/" },
|
|
};
|
|
|
|
event.waitUntil(self.registration.showNotification(titulo, opciones));
|
|
});
|
|
|
|
self.addEventListener("notificationclick", (event) => {
|
|
event.notification.close();
|
|
const destino = (event.notification.data && event.notification.data.url) || "/";
|
|
|
|
event.waitUntil(
|
|
(async () => {
|
|
const clientes = await self.clients.matchAll({ type: "window", includeUncontrolled: true });
|
|
for (const cliente of clientes) {
|
|
if ("focus" in cliente) {
|
|
await cliente.focus();
|
|
if ("navigate" in cliente) {
|
|
try {
|
|
await cliente.navigate(destino);
|
|
} catch {
|
|
/* ignorar */
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
await self.clients.openWindow(destino);
|
|
})(),
|
|
);
|
|
});
|