Files
Sheep-Service/web/lib/components/webPush.js
2025-09-09 00:10:53 +03:00

104 lines
4.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const webPush = {
async init() {
if (!('serviceWorker' in navigator) || !('PushManager' in window)) {
console.error('Push уведомления не поддерживаются');
return;
}
try {
// Получаем публичный ключ VAPID с сервера
const uuid = localStorage.getItem('uuid');
const res = await fetch(`${CONFIG.api}push/key`, {
method: 'GET',
headers: {
"Content-Type": "application/json",
"Authorization": uuid
}
});
const { publicKey } = await res.json();
// Преобразуем ключ
function urlBase64ToUint8Array(base64String) {
const padding = '='.repeat((4 - (base64String.length % 4)) % 4);
const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
const raw = atob(base64);
return Uint8Array.from([...raw].map(ch => ch.charCodeAt(0)));
}
// Берем уже зарегистрированный Service Worker
const registration = await navigator.serviceWorker.ready;
// Проверяем, есть ли уже подписка
let subscription = await registration.pushManager.getSubscription();
if (!subscription) {
// Запрашиваем разрешение
const permission = await Notification.requestPermission();
if (permission !== 'granted') {
console.warn('Пуш уведомления запрещены пользователем');
return;
}
// Подписка на push
subscription = await registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array(publicKey)
});
// данные устройства
const deviceInfo = {
name: navigator.userAgent,
model: navigator.platform || "unknown"
};
// Отправка на сервер
await fetch(`${CONFIG.api}push/subscribe`, {
method: 'POST',
headers: {
"Content-Type": "application/json",
"Authorization": uuid
},
body: JSON.stringify({ subscription, device: deviceInfo })
});
console.log('Push подписка готова:', subscription);
console.log('Создана новая подписка');
} else {
console.log('Подписка уже существует');
}
} catch (err) {
console.error('Ошибка инициализации push:', err);
}
},
async unsubscribe() {
const uuid = localStorage.getItem('uuid');
const registration = await navigator.serviceWorker.ready;
const subscription = await registration.pushManager.getSubscription();
if (subscription) {
// удаляем подписку в браузере
const success = await subscription.unsubscribe();
if (success) {
console.log("Локальная подписка отменена");
// уведомляем сервер
await fetch(`${CONFIG.api}push//unsubscribe`, {
method: "DELETE",
headers: {
"Content-Type": "application/json",
"Authorization": uuid
},
body: JSON.stringify({ endpoint: subscription.endpoint })
});
}
} else {
console.log("Подписки нет");
}
}
}