aboutsummaryrefslogtreecommitdiff
path: root/src/routes
diff options
context:
space:
mode:
authorFuwn <[email protected]>2024-07-24 21:24:09 -0700
committerFuwn <[email protected]>2024-07-24 21:24:09 -0700
commit8a94bbfba322f8011017980e4362d46c4d51bb55 (patch)
tree4d861cd7f1d9304e6297e1b52fe759674fd5df1a /src/routes
parentfeat(layout): browser notifications (diff)
downloaddue.moe-8a94bbfba322f8011017980e4362d46c4d51bb55.tar.xz
due.moe-8a94bbfba322f8011017980e4362d46c4d51bb55.zip
feat: background notifications
Diffstat (limited to 'src/routes')
-rw-r--r--src/routes/+layout.svelte41
-rw-r--r--src/routes/api/notifications/subscribe/+server.ts26
-rw-r--r--src/routes/api/trigger/+server.ts8
3 files changed, 45 insertions, 30 deletions
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;