Files
sistem-desa-mandiri/public/wibu-push-worker.js
amel d847c97bec upd: webpush
Deskripsi:
- database push notification
- update package
- memasang webpush

NO Issues
2024-11-18 17:12:58 +08:00

121 lines
3.9 KiB
JavaScript

const log = false; // Ganti ke true untuk debugging
function printLog(text) {
if (log) {
const stack = new Error().stack;
const lineInfo = stack.split('\n')[2];
const match = lineInfo.match(/(\/.*:\d+:\d+)/);
const lineNumber = match ? match[1] : 'unknown line';
console.log(`[${lineNumber}] ==>`, text);
}
}
self.addEventListener('install', (event) => {
event.waitUntil(self.skipWaiting());
printLog('Service Worker installing...');
});
self.addEventListener('activate', (event) => {
event.waitUntil(self.clients.claim());
printLog('Service Worker activating...');
});
self.addEventListener('push', async function (event) {
let title = "Default Title";
let options = {
body: "Default notification body",
icon: '/icon-192x192.png',
badge: '/icon-192x192.png',
image: '/icon-192x192.png',
vibrate: [100, 50, 100],
data: {
dateOfArrival: Date.now(),
primaryKey: '2',
},
};
if (event.data) {
try {
const data = event.data.json();
title = data.title || title;
options.body = data.body || options.body;
options.data = {
...options.data,
...data,
};
printLog(`Push event data: ${JSON.stringify(options, null, 2)}`);
} catch (e) {
console.error("Error parsing push event data:", e);
}
} else {
console.warn("Push event has no data.");
}
event.waitUntil(
(async () => {
try {
const eventData = (options.data);
const clientList = await clients.matchAll({ type: 'window', includeUncontrolled: true });
let isClientFocused = false;
for (const client of clientList) {
client.postMessage({
type: 'PUSH_RECEIVED',
title: eventData.title,
body: eventData.body,
variant: eventData.variant,
createdAt: eventData.createdAt,
acceptedAt: Date.now(),
});
if (client.focused) {
isClientFocused = true;
break;
}
}
const subscription = await self.registration.pushManager.getSubscription();
const myEndpoint = subscription ? subscription.endpoint : null;
if (myEndpoint && eventData.endpoint === myEndpoint) {
printLog("Notification sent to self, skipping display.");
return;
}
if (eventData.variant === 'data') {
printLog('Type is data, skipping display.');
return;
}
if (!isClientFocused) {
await self.registration.showNotification(title, options);
} else {
printLog('Client is focused, notification not shown.');
}
} catch (err) {
console.error("Error displaying notification:", err);
}
})()
);
});
self.addEventListener('notificationclick', function (event) {
const clickedLink = event.notification.data.link;
event.notification.close();
event.waitUntil(
clients.matchAll({ type: 'window', includeUncontrolled: true }).then((clientList) => {
for (const client of clientList) {
if (client.url.includes(clickedLink) && 'focus' in client) {
return client.focus();
}
}
if (clients.openWindow) {
return clients.openWindow(clickedLink);
}
}).catch(err => {
console.error("Error handling notification click:", err);
})
);
});
// wibu:1.0.87