121 lines
3.9 KiB
JavaScript
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
|