From 598db5a814544e3c627de9bd19424f23f10f43b7 Mon Sep 17 00:00:00 2001 From: Gauthier Roebroeck Date: Tue, 20 May 2025 15:16:47 +0800 Subject: [PATCH] announcements --- .../mutations/mark-announcements-read.ts | 16 +++ next-ui/src/colada/queries/actuator-info.ts | 6 +- next-ui/src/colada/queries/announcements.ts | 21 ++++ next-ui/src/colada/queries/app-releases.ts | 6 +- next-ui/src/colada/queries/current-user.ts | 6 +- next-ui/src/components.d.ts | 1 + .../{BuidVersion.vue => BuildVersion.vue} | 0 .../components/app/drawer/AppDrawerFooter.vue | 2 +- .../app/drawer/AppDrawerMenuServer.vue | 37 +++++- next-ui/src/composables/latest-version.ts | 2 +- next-ui/src/pages/server/announcements.vue | 107 +++++++++++++++++- next-ui/src/pages/server/updates.vue | 8 +- 12 files changed, 192 insertions(+), 20 deletions(-) create mode 100644 next-ui/src/colada/mutations/mark-announcements-read.ts create mode 100644 next-ui/src/colada/queries/announcements.ts rename next-ui/src/components/{BuidVersion.vue => BuildVersion.vue} (100%) diff --git a/next-ui/src/colada/mutations/mark-announcements-read.ts b/next-ui/src/colada/mutations/mark-announcements-read.ts new file mode 100644 index 000000000..c6de7fb72 --- /dev/null +++ b/next-ui/src/colada/mutations/mark-announcements-read.ts @@ -0,0 +1,16 @@ +import {defineMutation, useMutation, useQueryCache} from '@pinia/colada' +import {komgaClient} from '@/api/komga-client' + +export const useMarkAnnouncementsRead = defineMutation(() => { + const queryCache = useQueryCache() + return useMutation({ + mutation: (announcementIds: string[]) => + komgaClient.PUT('/api/v1/announcements', {body: announcementIds}), + onSuccess: () => { + queryCache.invalidateQueries({key: ['announcements']}) + }, + onError: (error) => { + console.log('announcements mark read error', error) + }, + }) +}) diff --git a/next-ui/src/colada/queries/actuator-info.ts b/next-ui/src/colada/queries/actuator-info.ts index 61586390e..b35e4e599 100644 --- a/next-ui/src/colada/queries/actuator-info.ts +++ b/next-ui/src/colada/queries/actuator-info.ts @@ -1,8 +1,8 @@ -import {useQuery} from '@pinia/colada' +import {defineQuery, useQuery} from '@pinia/colada' import {komgaClient} from '@/api/komga-client' import type {ActuatorInfo} from '@/types/Actuator' -export function useActuatorInfo() { +export const useActuatorInfo = defineQuery(() => { return useQuery({ key: () => ['actuator-info'], query: () => komgaClient.GET('/actuator/info') @@ -12,4 +12,4 @@ export function useActuatorInfo() { staleTime: 60 * 60 * 1000, gcTime: false, }) -} +}) diff --git a/next-ui/src/colada/queries/announcements.ts b/next-ui/src/colada/queries/announcements.ts new file mode 100644 index 000000000..78d431ddc --- /dev/null +++ b/next-ui/src/colada/queries/announcements.ts @@ -0,0 +1,21 @@ +import {defineQuery, useQuery} from '@pinia/colada' +import {komgaClient} from '@/api/komga-client' + +export const useAnnouncements = defineQuery(() => { + const {data, ...rest} = useQuery({ + key: () => ['announcements'], + query: () => komgaClient.GET('/api/v1/announcements') + // unwrap the openapi-fetch structure on success + .then((res) => res.data), + // 1 hour + staleTime: 60 * 60 * 1000, + gcTime: false, + }) + + const unreadCount = computed(() => data.value?.items + ?.filter((x) => false == x._komga?.read) + ?.length || 0 + ) + + return {...rest, data, unreadCount} +}) diff --git a/next-ui/src/colada/queries/app-releases.ts b/next-ui/src/colada/queries/app-releases.ts index b8208314e..7819a81a3 100644 --- a/next-ui/src/colada/queries/app-releases.ts +++ b/next-ui/src/colada/queries/app-releases.ts @@ -1,7 +1,7 @@ -import {useQuery} from '@pinia/colada' +import {defineQuery, useQuery} from '@pinia/colada' import {komgaClient} from '@/api/komga-client' -export function useAppReleases() { +export const useAppReleases = defineQuery(() => { return useQuery({ key: () => ['app-releases'], query: () => komgaClient.GET('/api/v1/releases') @@ -11,4 +11,4 @@ export function useAppReleases() { staleTime: 60 * 60 * 1000, gcTime: false, }) -} +}) diff --git a/next-ui/src/colada/queries/current-user.ts b/next-ui/src/colada/queries/current-user.ts index 7c2599c7f..9d6dd1846 100644 --- a/next-ui/src/colada/queries/current-user.ts +++ b/next-ui/src/colada/queries/current-user.ts @@ -1,7 +1,7 @@ -import {useQuery} from '@pinia/colada' +import {defineQuery, useQuery} from '@pinia/colada' import {komgaClient} from '@/api/komga-client' -export function useCurrentUser() { +export const useCurrentUser = defineQuery(() => { return useQuery({ key: () => ['current-user'], query: () => komgaClient.GET('/api/v2/users/me') @@ -12,4 +12,4 @@ export function useCurrentUser() { gcTime: false, autoRefetch: true, }) -} +}) diff --git a/next-ui/src/components.d.ts b/next-ui/src/components.d.ts index 1ef4f89cd..8ec317856 100644 --- a/next-ui/src/components.d.ts +++ b/next-ui/src/components.d.ts @@ -21,6 +21,7 @@ declare module 'vue' { AppFooter: typeof import('./components/AppFooter.vue')['default'] BuidVersion: typeof import('./components/BuidVersion.vue')['default'] BuildCommit: typeof import('./components/BuildCommit.vue')['default'] + BuildVersion: typeof import('./components/BuildVersion.vue')['default'] HelloWorld: typeof import('./components/HelloWorld.vue')['default'] LoginForm: typeof import('./components/LoginForm.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] diff --git a/next-ui/src/components/BuidVersion.vue b/next-ui/src/components/BuildVersion.vue similarity index 100% rename from next-ui/src/components/BuidVersion.vue rename to next-ui/src/components/BuildVersion.vue diff --git a/next-ui/src/components/app/drawer/AppDrawerFooter.vue b/next-ui/src/components/app/drawer/AppDrawerFooter.vue index c525ee1aa..bc884c6f0 100644 --- a/next-ui/src/components/app/drawer/AppDrawerFooter.vue +++ b/next-ui/src/components/app/drawer/AppDrawerFooter.vue @@ -4,7 +4,7 @@
- +
diff --git a/next-ui/src/components/app/drawer/AppDrawerMenuServer.vue b/next-ui/src/components/app/drawer/AppDrawerMenuServer.vue index 922ded162..eac5a29c3 100644 --- a/next-ui/src/components/app/drawer/AppDrawerMenuServer.vue +++ b/next-ui/src/components/app/drawer/AppDrawerMenuServer.vue @@ -1,11 +1,25 @@ + + diff --git a/next-ui/src/composables/latest-version.ts b/next-ui/src/composables/latest-version.ts index a7b5d266e..1457d7376 100644 --- a/next-ui/src/composables/latest-version.ts +++ b/next-ui/src/composables/latest-version.ts @@ -2,7 +2,7 @@ import {useAppReleases} from '@/colada/queries/app-releases.ts' import {useBuildVersion} from '@/composables/buid-version.ts' export function useLatestVersion() { - const {data, } = useAppReleases() + const {data } = useAppReleases() const {buildVersion} = useBuildVersion() const latestRelease = computed(() => data.value?.find(x => x.latest)) diff --git a/next-ui/src/pages/server/announcements.vue b/next-ui/src/pages/server/announcements.vue index c347fec72..f91f50f06 100644 --- a/next-ui/src/pages/server/announcements.vue +++ b/next-ui/src/pages/server/announcements.vue @@ -1,11 +1,114 @@ + + meta: requiresRole: ADMIN diff --git a/next-ui/src/pages/server/updates.vue b/next-ui/src/pages/server/updates.vue index 7bcd7307c..7d0a50f1b 100644 --- a/next-ui/src/pages/server/updates.vue +++ b/next-ui/src/pages/server/updates.vue @@ -75,7 +75,7 @@
@@ -103,15 +103,15 @@ const {isLatestVersion, latestRelease: latest} = useLatestVersion()