groupe-meditation/frontend/src/utils/pushNotifications.js
2026-05-25 17:39:38 -04:00

56 lines
2.1 KiB
JavaScript

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', {});
}