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