import { env } from '$env/dynamic/public'; import { isNotificationQueued, notifications, updateLastNotificationID } from '$lib/Data/AniList/notifications'; import { database } from '$lib/Database/IDB/user'; import { getFingerprint } from './fingerprint'; import root from './root'; export const requestNotifications = async () => { if ('Notification' in window && navigator.serviceWorker) { const registration = await navigator.serviceWorker.getRegistration(); if (registration) { try { const pushSubscription = await registration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: env.PUBLIC_VAPID_PUBLIC_KEY }); await fetch(root(`/api/notifications/subscribe?p=${getFingerprint()}`), { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(pushSubscription) }); } catch { await fetch(`/api/notifications/unsubscribe?p=${getFingerprint()}`, { method: 'POST' }); await updateLocalNotifications(); setInterval(async () => await updateLocalNotifications(), 1000 * 60); } } } }; const updateLocalNotifications = async () => { const user = (await database.users.toArray()).at(0); if (!user) return; const recentNotifications = await notifications(user.user.accessToken); if ((await window.Notification.requestPermission()) == 'granted') if (recentNotifications && isNotificationQueued(recentNotifications, user.lastNotificationID)) { await updateLastNotificationID(user.id, recentNotifications); new Notification('due.moe', { body: `${recentNotifications[0].user.name}${recentNotifications[0].context}`, icon: recentNotifications[0].user.avatar.large || '/favicon-196x196.png', tag: 'notification-1' }); } };