56 lines
2.1 KiB
JavaScript
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', {});
|
|
}
|