98 lines
2.9 KiB
JavaScript
98 lines
2.9 KiB
JavaScript
// Service Worker personnalisé pour gérer les notifications push
|
|
// Ce fichier sera fusionné avec le service worker généré par vite-plugin-pwa
|
|
|
|
// Écouter les événements de notification
|
|
self.addEventListener('notificationclick', (event) => {
|
|
console.log('Notification clicked:', event.notification)
|
|
|
|
event.notification.close()
|
|
|
|
// Récupérer le lien depuis les données de la notification
|
|
const link = event.notification.data?.link || event.notification.data?.url || '/'
|
|
|
|
// Ouvrir ou focus la fenêtre/clients
|
|
event.waitUntil(
|
|
clients.matchAll({ type: 'window', includeUncontrolled: true }).then((clientList) => {
|
|
// Si une fenêtre est déjà ouverte, la focus
|
|
for (let i = 0; i < clientList.length; i++) {
|
|
const client = clientList[i]
|
|
if (client.url && 'focus' in client) {
|
|
// Naviguer vers le lien si nécessaire
|
|
if (link && !client.url.includes(link.split('/')[1])) {
|
|
return client.navigate(link).then(() => client.focus())
|
|
}
|
|
return client.focus()
|
|
}
|
|
}
|
|
|
|
// Sinon, ouvrir une nouvelle fenêtre
|
|
if (clients.openWindow) {
|
|
return clients.openWindow(link || '/')
|
|
}
|
|
})
|
|
)
|
|
})
|
|
|
|
// Écouter les messages du client pour afficher des notifications
|
|
self.addEventListener('message', (event) => {
|
|
console.log('Service Worker received message:', event.data)
|
|
|
|
if (event.data && event.data.type === 'SHOW_NOTIFICATION') {
|
|
const { title, options } = event.data
|
|
|
|
event.waitUntil(
|
|
self.registration.showNotification(title, {
|
|
icon: '/icon-192x192.png',
|
|
badge: '/icon-96x96.png',
|
|
tag: 'lediscord-notification',
|
|
requireInteraction: false,
|
|
vibrate: [200, 100, 200],
|
|
data: {
|
|
link: options.link || '/',
|
|
notificationId: options.data?.notificationId
|
|
},
|
|
...options
|
|
})
|
|
)
|
|
}
|
|
})
|
|
|
|
// Écouter les push events (pour les vraies push notifications depuis le serveur)
|
|
self.addEventListener('push', (event) => {
|
|
console.log('Push event received:', event)
|
|
|
|
let notificationData = {
|
|
title: 'LeDiscord',
|
|
body: 'Vous avez une nouvelle notification',
|
|
icon: '/icon-192x192.png',
|
|
badge: '/icon-96x96.png',
|
|
tag: 'lediscord-notification',
|
|
data: {
|
|
link: '/'
|
|
}
|
|
}
|
|
|
|
// Si des données sont envoyées avec le push
|
|
if (event.data) {
|
|
try {
|
|
const data = event.data.json()
|
|
notificationData = {
|
|
...notificationData,
|
|
title: data.title || notificationData.title,
|
|
body: data.body || data.message || notificationData.body,
|
|
data: {
|
|
link: data.link || '/',
|
|
notificationId: data.notificationId
|
|
}
|
|
}
|
|
} catch (e) {
|
|
console.error('Error parsing push data:', e)
|
|
}
|
|
}
|
|
|
|
event.waitUntil(
|
|
self.registration.showNotification(notificationData.title, notificationData)
|
|
)
|
|
})
|
|
|