diff --git a/src/renderer/api/genres.api.ts b/src/renderer/api/genres.api.ts new file mode 100644 index 000000000..cf90654ac --- /dev/null +++ b/src/renderer/api/genres.api.ts @@ -0,0 +1,22 @@ +import { BaseResponse, Genre } from '@/renderer/api/types'; +import { ax } from '@/renderer/lib/axios'; + +export type GenreListResponse = BaseResponse; + +const getGenreList = async ( + query: { serverId: string }, + signal?: AbortSignal +) => { + const { data } = await ax.get( + `/servers/${query.serverId}/genres`, + { + signal, + } + ); + + return data; +}; + +export const genresApi = { + getGenreList, +}; diff --git a/src/renderer/api/index.ts b/src/renderer/api/index.ts index d405f37f8..74028d568 100644 --- a/src/renderer/api/index.ts +++ b/src/renderer/api/index.ts @@ -1,14 +1,16 @@ +import { albumsApi } from '@/renderer/api/albums.api'; +import { authApi } from '@/renderer/api/auth.api'; +import { genresApi } from '@/renderer/api/genres.api'; +import { serversApi } from '@/renderer/api/servers.api'; import { tasksApi } from '@/renderer/api/tasks.api'; -import { albumsApi } from './albums.api'; -import { authApi } from './auth.api'; -import { serversApi } from './servers.api'; -import { usersApi } from './users.api'; +import { usersApi } from '@/renderer/api/users.api'; export * from './sockets.api'; export const api = { albums: albumsApi, auth: authApi, + genres: genresApi, servers: serversApi, tasks: tasksApi, users: usersApi, diff --git a/src/renderer/api/query-keys.ts b/src/renderer/api/query-keys.ts index 25f9d27ea..a8a073662 100644 --- a/src/renderer/api/query-keys.ts +++ b/src/renderer/api/query-keys.ts @@ -4,11 +4,18 @@ export const queryKeys = { albums: { detail: (albumId: string) => ['albums', albumId] as const, list: (serverId: string, params: AlbumListParams) => - ['albums', 'list', serverId, params] as const, + [serverId, 'albums', 'list', params] as const, root: ['albums'], songList: (albumId: string) => ['albums', albumId, 'songs'] as const, }, + genres: { + list: (serverId: string) => [serverId, 'genres', 'list'] as const, + root: (serverId: string) => [serverId, 'genres'] as const, + }, ping: (url: string) => ['ping', url] as const, + server: { + root: (serverId: string) => [serverId] as const, + }, servers: { list: (params?: any) => ['servers', 'list', params] as const, root: ['servers'], diff --git a/src/renderer/api/types.ts b/src/renderer/api/types.ts index 70c9aea49..b731255c7 100644 --- a/src/renderer/api/types.ts +++ b/src/renderer/api/types.ts @@ -174,10 +174,13 @@ export type Ping = { }; export type Genre = { - createdAt: string; + albumArtistCount: number; + albumCount: number; + artistCount: number; id: string; name: string; - updatedAt: string; + songCount: number; + totalCount: number; }; export type RelatedGenre = { diff --git a/src/renderer/features/genres/index.ts b/src/renderer/features/genres/index.ts new file mode 100644 index 000000000..956d1d695 --- /dev/null +++ b/src/renderer/features/genres/index.ts @@ -0,0 +1 @@ +export * from './queries/genre-list'; diff --git a/src/renderer/features/genres/queries/genre-list.ts b/src/renderer/features/genres/queries/genre-list.ts new file mode 100644 index 000000000..e081625de --- /dev/null +++ b/src/renderer/features/genres/queries/genre-list.ts @@ -0,0 +1,22 @@ +import { useQuery } from '@tanstack/react-query'; +import { AxiosError } from 'axios'; +import { api } from '@/renderer/api'; +import { GenreListResponse } from '@/renderer/api/genres.api'; +import { queryKeys } from '@/renderer/api/query-keys'; +import { ApiError } from '@/renderer/api/types'; +import { QueryOptions } from '@/renderer/lib/react-query'; +import { useAuthStore } from '@/renderer/store'; + +export const useGenreList = (options?: QueryOptions) => { + const serverId = useAuthStore((state) => state.currentServer?.id) || ''; + + const query = useQuery>({ + enabled: !!serverId, + queryFn: ({ signal }) => api.genres.getGenreList({ serverId }, signal), + queryKey: queryKeys.genres.list(serverId), + staleTime: Infinity, + ...options, + }); + + return query; +};