From 8a94bbfba322f8011017980e4362d46c4d51bb55 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Wed, 24 Jul 2024 21:24:09 -0700 Subject: feat: background notifications --- src/routes/+layout.svelte | 41 ++++++----------------- src/routes/api/notifications/subscribe/+server.ts | 26 ++++++++++++++ src/routes/api/trigger/+server.ts | 8 +++++ 3 files changed, 45 insertions(+), 30 deletions(-) create mode 100644 src/routes/api/notifications/subscribe/+server.ts create mode 100644 src/routes/api/trigger/+server.ts (limited to 'src/routes') diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index d6575ded..e1381ff0 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -29,6 +29,8 @@ import Announcement from '$lib/Announcement.svelte'; import Message from '$lib/Loading/Message.svelte'; import { notifications } from '$lib/Data/AniList/notifications'; + import { requestNotifications } from '$lib/Utility/notifications'; + import { database as userDatabase } from '$lib/Database/user'; injectSpeedInsights(); @@ -110,36 +112,15 @@ }); }); - if ($settings.displayAniListNotifications && data.user !== undefined) { - if ('Notification' in window && navigator.serviceWorker) - if ((await Notification.requestPermission()) === 'granted') - notificationInterval = setInterval(async () => { - try { - const recentNotifications = await notifications(data.user.accessToken); - - if ( - recentNotifications && - recentNotifications.length > 0 && - recentNotifications[0].id > lastNotificationId && - new Date(recentNotifications[0].createdAt * 1000).getTime() + 30000 > - new Date().getTime() - ) { - lastNotificationId = recentNotifications[0].id; - - if ('serviceWorker' in navigator && navigator.serviceWorker.controller) { - navigator.serviceWorker.ready.then((registration) => { - registration.showNotification('due.moe', { - body: `${recentNotifications[0].user.name}${recentNotifications[0].context}`, - icon: recentNotifications[0].user.avatar.large || '/favicon-196x196.png' - }); - }); - } - } - } catch (error) { - console.error(error); - } - }, 15000); - } + if (!(await userDatabase.users.get($userIdentity.id))) + userDatabase.users.put({ + id: $userIdentity.id, + user: data.user, + lastNotificationID: null + }); + + if ($settings.displayAniListNotifications && data.user !== undefined) + if ('Notification' in window && navigator.serviceWorker) requestNotifications(); }); onDestroy(() => { diff --git a/src/routes/api/notifications/subscribe/+server.ts b/src/routes/api/notifications/subscribe/+server.ts new file mode 100644 index 00000000..98bd5c4d --- /dev/null +++ b/src/routes/api/notifications/subscribe/+server.ts @@ -0,0 +1,26 @@ +import { userIdentity } from '$lib/Data/AniList/identity'; +import { setUserSubscription } from '$lib/Database/userNotifications'; + +const unauthorised = new Response('Unauthorised', { status: 401 }); + +export const POST = async ({ cookies, request }) => { + const userCookie = cookies.get('user'); + + if (!userCookie) return unauthorised; + + const user = JSON.parse(userCookie); + const userId = ( + await userIdentity({ + tokenType: user['token_type'], + expiresIn: user['expires_in'], + accessToken: user['access_token'], + refreshToken: user['refresh_token'] + }) + ).id; + + if (!userId) return unauthorised; + + await setUserSubscription(userId, await request.json()); + + return new Response(null, { status: 200 }); +}; diff --git a/src/routes/api/trigger/+server.ts b/src/routes/api/trigger/+server.ts new file mode 100644 index 00000000..aff75d9c --- /dev/null +++ b/src/routes/api/trigger/+server.ts @@ -0,0 +1,8 @@ +import { createSvelteRoute } from '@trigger.dev/sveltekit'; +import { client } from '../../../trigger'; + +import '../../../jobs'; + +const svelteRoute = createSvelteRoute(client); + +export const POST = svelteRoute.POST; -- cgit v1.2.3