54 lines
1.3 KiB
TypeScript
54 lines
1.3 KiB
TypeScript
import { Routes } from "blitz";
|
|
|
|
const worker = self as unknown as ServiceWorkerGlobalScope & typeof globalThis;
|
|
|
|
worker.addEventListener("push", function (event) {
|
|
if (!event.data) {
|
|
return;
|
|
}
|
|
|
|
console.log("event.data.text()", event.data.text());
|
|
const data = JSON.parse(event.data.text());
|
|
event.waitUntil(
|
|
worker.registration.showNotification(data.title, {
|
|
body: data.message,
|
|
icon: "/icons/android-chrome-192x192.png",
|
|
actions: [
|
|
{ title: "Open", action: "open" },
|
|
{ title: "Mark as read", action: "mark-as-read" },
|
|
],
|
|
}),
|
|
);
|
|
});
|
|
|
|
worker.addEventListener("notificationclick", (event) => {
|
|
event.notification.close();
|
|
event.waitUntil(
|
|
worker.clients.matchAll({ type: "window", includeUncontrolled: true }).then((clientList) => {
|
|
if (!event.notification.data) {
|
|
return;
|
|
}
|
|
|
|
switch (event.action) {
|
|
case "mark-as-read":
|
|
// TODO
|
|
return;
|
|
case "open":
|
|
default: {
|
|
const data = JSON.parse(event.notification.data.text());
|
|
const route = Routes.ConversationPage({ recipient: data.recipient });
|
|
const url = `${route.pathname}${route.query}`;
|
|
|
|
if (clientList.length > 0) {
|
|
const client = clientList.find((client) => client.focused) ?? clientList[0]!;
|
|
|
|
client.navigate(url);
|
|
return client.focus();
|
|
}
|
|
return worker.clients.openWindow(url);
|
|
}
|
|
}
|
|
}),
|
|
);
|
|
});
|