73 lines
2.3 KiB
JavaScript
73 lines
2.3 KiB
JavaScript
/* eslint-disable no-undef */
|
||
importScripts('https://www.gstatic.com/firebasejs/11.6.0/firebase-app-compat.js');
|
||
importScripts('https://www.gstatic.com/firebasejs/11.6.0/firebase-messaging-compat.js');
|
||
|
||
const API_PREFIX = '/idp-api';
|
||
|
||
async function loadPublicSettings() {
|
||
const response = await fetch(`${API_PREFIX}/settings/public`, { credentials: 'same-origin' });
|
||
if (!response.ok) {
|
||
throw new Error('Не удалось загрузить публичные настройки Firebase');
|
||
}
|
||
const payload = await response.json();
|
||
const map = Object.fromEntries((payload.settings ?? []).map((item) => [item.key, item.value]));
|
||
return map;
|
||
}
|
||
|
||
function isEnabled(value) {
|
||
return ['true', '1', 'yes'].includes(String(value ?? '').trim().toLowerCase());
|
||
}
|
||
|
||
async function initFirebaseMessaging() {
|
||
const settings = await loadPublicSettings();
|
||
if (!isEnabled(settings.FIREBASE_PUSH_ENABLED)) return;
|
||
|
||
const projectId = settings.FIREBASE_PROJECT_ID?.trim();
|
||
const apiKey = settings.FIREBASE_WEB_API_KEY?.trim();
|
||
const appId = settings.FIREBASE_WEB_APP_ID?.trim();
|
||
const messagingSenderId = settings.FIREBASE_WEB_MESSAGING_SENDER_ID?.trim();
|
||
|
||
if (!projectId || !apiKey || !appId || !messagingSenderId) return;
|
||
|
||
firebase.initializeApp({
|
||
apiKey,
|
||
authDomain: `${projectId}.firebaseapp.com`,
|
||
projectId,
|
||
messagingSenderId,
|
||
appId
|
||
});
|
||
|
||
const messaging = firebase.messaging();
|
||
messaging.onBackgroundMessage((payload) => {
|
||
const title = payload.notification?.title || payload.data?.title || 'Уведомление';
|
||
const options = {
|
||
body: payload.notification?.body || payload.data?.message || '',
|
||
data: payload.data ?? {}
|
||
};
|
||
self.registration.showNotification(title, options);
|
||
});
|
||
}
|
||
|
||
self.addEventListener('install', (event) => {
|
||
event.waitUntil(self.skipWaiting());
|
||
});
|
||
|
||
self.addEventListener('activate', (event) => {
|
||
event.waitUntil(self.clients.claim());
|
||
});
|
||
|
||
self.addEventListener('notificationclick', (event) => {
|
||
event.notification.close();
|
||
event.waitUntil(
|
||
self.clients.matchAll({ type: 'window', includeUncontrolled: true }).then((clients) => {
|
||
const existing = clients.find((client) => 'focus' in client);
|
||
if (existing) {
|
||
return existing.focus();
|
||
}
|
||
return self.clients.openWindow('/');
|
||
})
|
||
);
|
||
});
|
||
|
||
initFirebaseMessaging().catch(() => undefined);
|