Spaces:
Running
Running
File size: 2,561 Bytes
1e2158c | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | // Service Worker for Push Notifications
// Place this file in public/sw.js
self.addEventListener('install', (event) => {
console.log('Service Worker installed');
self.skipWaiting();
});
self.addEventListener('activate', (event) => {
console.log('Service Worker activated');
event.waitUntil(self.clients.claim());
});
// Handle push notification
self.addEventListener('push', (event) => {
console.log('Push notification received:', event);
if (!event.data) {
console.log('No data in push event');
return;
}
try {
const data = event.data.json();
const options = {
body: data.body || '',
icon: data.icon || '/logo.png',
badge: data.badge || '/badge.png',
data: data.data || {},
actions: data.actions || [
{
action: 'open',
title: 'View Dashboard',
},
{
action: 'dismiss',
title: 'Dismiss',
},
],
tag: data.tag || 'ai-insight',
requireInteraction: false,
vibrate: [200, 100, 200],
};
event.waitUntil(
self.registration.showNotification(data.title || 'AI Insight', options)
);
} catch (error) {
console.error('Error handling push:', error);
}
});
// Handle notification click
self.addEventListener('notificationclick', (event) => {
console.log('Notification clicked:', event);
event.notification.close();
if (event.action === 'dismiss') {
return;
}
// Open dashboard or specific insight
const urlToOpen = event.notification.data.insight_id
? `/chat?insight_id=${event.notification.data.insight_id}`
: '/dashboard';
event.waitUntil(
self.clients.matchAll({ type: 'window', includeUncontrolled: true }).then((clientList) => {
// Check if there's already an open window
for (const client of clientList) {
if (client.url === urlToOpen && 'focus' in client) {
return client.focus();
}
}
// Open new window
if (self.clients.openWindow) {
return self.clients.openWindow(urlToOpen);
}
})
);
});
// Handle notification close
self.addEventListener('notificationclose', (event) => {
console.log('Notification closed:', event);
// Optional: Track notification dismissals
});
|