import { api } from '../stores/api'; function urlBase64ToUint8Array(base64String) { const padding = '='.repeat((4 - (base64String.length % 4)) % 4); const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/'); const rawData = window.atob(base64); const outputArray = new Uint8Array(rawData.length); for (let i = 0; i < rawData.length; i += 1) { outputArray[i] = rawData.charCodeAt(i); } return outputArray; } export function pushSupported() { return 'serviceWorker' in navigator && 'PushManager' in window && 'Notification' in window; } export async function getPushSubscription() { if (!pushSupported()) return null; const registration = await navigator.serviceWorker.getRegistration('/push/'); if (!registration) return null; return registration.pushManager.getSubscription(); } export async function enablePushNotifications() { if (!pushSupported()) { throw new Error("Ce navigateur ne supporte pas les notifications push"); } const config = await api.get('/notifications/configuration'); if (!config.enabled || !config.public_key) { throw new Error("Les notifications ne sont pas configurées sur ce serveur"); } const permission = await Notification.requestPermission(); if (permission !== 'granted') { throw new Error("La permission de notification a été refusée"); } const registration = await navigator.serviceWorker.register('/push-sw.js', { scope: '/push/' }); const existing = await registration.pushManager.getSubscription(); const subscription = existing || await registration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: urlBase64ToUint8Array(config.public_key), }); await api.post('/notifications/abonnement', subscription.toJSON()); return subscription; } export async function disablePushNotifications() { const subscription = await getPushSubscription(); if (!subscription) return; await api.request('DELETE', `/notifications/abonnement?endpoint=${encodeURIComponent(subscription.endpoint)}`); await subscription.unsubscribe(); } export async function sendTestNotification() { return api.post('/notifications/test', {}); }