96 lines
2.4 KiB
JavaScript
96 lines
2.4 KiB
JavaScript
// Service Worker for Push Notifications
|
|
const CACHE_NAME = "cs-association-v1"
|
|
const urlsToCache = [
|
|
"/",
|
|
"/static/css/styles.css",
|
|
"/static/js/scripts.js",
|
|
"/static/images/icon-192x192.png",
|
|
"/static/images/icon-512x512.png",
|
|
]
|
|
|
|
// Install event
|
|
self.addEventListener("install", (event) => {
|
|
event.waitUntil(
|
|
caches.open(CACHE_NAME).then((cache) => {
|
|
return cache.addAll(urlsToCache)
|
|
}),
|
|
)
|
|
})
|
|
|
|
// Fetch event
|
|
self.addEventListener("fetch", (event) => {
|
|
event.respondWith(
|
|
caches.match(event.request).then((response) => {
|
|
// Return cached version or fetch from network
|
|
return response || fetch(event.request)
|
|
}),
|
|
)
|
|
})
|
|
|
|
// Push event
|
|
self.addEventListener("push", (event) => {
|
|
if (event.data) {
|
|
const data = event.data.json()
|
|
const options = {
|
|
body: data.body,
|
|
icon: data.icon || "/static/images/icon-192x192.png",
|
|
badge: data.badge || "/static/images/badge-72x72.png",
|
|
data: data.data || {},
|
|
actions: data.actions || [],
|
|
dir: data.dir || "ltr",
|
|
lang: data.lang || "en",
|
|
requireInteraction: data.data && data.data.priority === "urgent",
|
|
silent: false,
|
|
tag: data.data ? `${data.data.type}-${data.data.announcement_id || data.data.event_id}` : "default",
|
|
renotify: true,
|
|
vibrate: data.data && data.data.priority === "urgent" ? [200, 100, 200] : [100, 50, 100],
|
|
}
|
|
|
|
event.waitUntil(self.registration.showNotification(data.title, options))
|
|
}
|
|
})
|
|
|
|
// Notification click event
|
|
self.addEventListener("notificationclick", (event) => {
|
|
event.notification.close()
|
|
|
|
if (event.action === "dismiss") {
|
|
return
|
|
}
|
|
|
|
const data = event.notification.data
|
|
let url = "/"
|
|
|
|
if (data && data.url) {
|
|
url = data.url
|
|
}
|
|
|
|
event.waitUntil(
|
|
clients.matchAll({ type: "window" }).then((clientList) => {
|
|
// Check if there's already a window/tab open with the target URL
|
|
for (const client of clientList) {
|
|
if (client.url === url && "focus" in client) {
|
|
return client.focus()
|
|
}
|
|
}
|
|
|
|
// If not, open a new window/tab
|
|
if (clients.openWindow) {
|
|
return clients.openWindow(url)
|
|
}
|
|
}),
|
|
)
|
|
})
|
|
|
|
// Background sync (for offline functionality)
|
|
self.addEventListener("sync", (event) => {
|
|
if (event.tag === "background-sync") {
|
|
event.waitUntil(doBackgroundSync())
|
|
}
|
|
})
|
|
|
|
function doBackgroundSync() {
|
|
// Implement background sync logic here
|
|
return Promise.resolve()
|
|
}
|