From de696d030050ffcd267586e4c363b3f86f7e0d5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Tue, 10 Jan 2023 20:29:16 +0800 Subject: [PATCH] refactor: move notification to masto composables --- composables/masto/notification.ts | 66 ++++++++++++++++++++++++++++++ composables/users.ts | 67 +------------------------------ 2 files changed, 67 insertions(+), 66 deletions(-) create mode 100644 composables/masto/notification.ts diff --git a/composables/masto/notification.ts b/composables/masto/notification.ts new file mode 100644 index 00000000..add42b3e --- /dev/null +++ b/composables/masto/notification.ts @@ -0,0 +1,66 @@ +import type { WsEvents } from 'masto' + +const notifications = reactive, string[]]>>({}) + +export const useNotifications = () => { + const id = currentUser.value?.account.id + const masto = useMasto() + + async function clearNotifications() { + if (!id || !notifications[id]) + return + const lastReadId = notifications[id]![1][0] + notifications[id]![1] = [] + + await masto.v1.markers.create({ + notifications: { lastReadId }, + }) + } + + async function connect(): Promise { + if (!isMastoInitialised.value || !id || notifications[id] || !currentUser.value?.token) + return + + const stream = masto.v1.stream.streamUser() + notifications[id] = [stream, []] + stream.then(s => s.on('notification', (n) => { + if (notifications[id]) + notifications[id]![1].unshift(n.id) + })) + + const position = await masto.v1.markers.fetch({ timeline: ['notifications'] }) + const paginator = masto.v1.notifications.list({ limit: 30 }) + do { + const result = await paginator.next() + if (!result.done && result.value.length) { + for (const notification of result.value) { + if (notification.id === position.notifications.lastReadId) + return + notifications[id]![1].push(notification.id) + } + } + else { + break + } + } while (true) + } + + function disconnect(): void { + if (!id || !notifications[id]) + return + notifications[id]![0].then(stream => stream.disconnect()) + notifications[id] = undefined + } + + watch(currentUser, disconnect) + if (isMastoInitialised.value) + connect() + else + watchOnce(isMastoInitialised, connect) + + return { + notifications: computed(() => id ? notifications[id]?.[1].length ?? 0 : 0), + disconnect, + clearNotifications, + } +} diff --git a/composables/users.ts b/composables/users.ts index d250a12b..1b44db3f 100644 --- a/composables/users.ts +++ b/composables/users.ts @@ -1,5 +1,5 @@ import { login as loginMasto } from 'masto' -import type { WsEvents, mastodon } from 'masto' +import type { mastodon } from 'masto' import type { Ref } from 'vue' import type { MaybeComputedRef, RemovableRef } from '@vueuse/core' import type { ElkMasto, UserLogin } from '~/types' @@ -259,71 +259,6 @@ export async function signout() { await masto.loginTo(currentUser.value) } -const notifications = reactive, string[]]>>({}) - -export const useNotifications = () => { - const id = currentUser.value?.account.id - const masto = useMasto() - - async function clearNotifications() { - if (!id || !notifications[id]) - return - const lastReadId = notifications[id]![1][0] - notifications[id]![1] = [] - - await masto.v1.markers.create({ - notifications: { lastReadId }, - }) - } - - async function connect(): Promise { - if (!isMastoInitialised.value || !id || notifications[id] || !currentUser.value?.token) - return - - const stream = masto.v1.stream.streamUser() - notifications[id] = [stream, []] - stream.then(s => s.on('notification', (n) => { - if (notifications[id]) - notifications[id]![1].unshift(n.id) - })) - - const position = await masto.v1.markers.fetch({ timeline: ['notifications'] }) - const paginator = masto.v1.notifications.list({ limit: 30 }) - do { - const result = await paginator.next() - if (result.value?.length) { - for (const notification of result.value as mastodon.v1.Notification[]) { - if (notification.id === position.notifications.lastReadId) - return - notifications[id]![1].push(notification.id) - } - } - else { - break - } - } while (true) - } - - function disconnect(): void { - if (!id || !notifications[id]) - return - notifications[id]![0].then(stream => stream.disconnect()) - notifications[id] = undefined - } - - watch(currentUser, disconnect) - if (isMastoInitialised.value) - connect() - else - watchOnce(isMastoInitialised, connect) - - return { - notifications: computed(() => id ? notifications[id]?.[1].length ?? 0 : 0), - disconnect, - clearNotifications, - } -} - export function checkLogin() { if (!currentUser.value) { openSigninDialog()