From 4155cd0963b549e30096130fd32b1924cff896e7 Mon Sep 17 00:00:00 2001 From: jeffvli Date: Sat, 17 Jan 2026 19:57:12 -0800 Subject: [PATCH] optimize ND/JF list fetch - no longer requires 2 separate fetches for count and data - the list count includes the first page so we set the query data directly --- src/renderer/api/utils-list-count.ts | 68 +++++++++++++++++++ src/renderer/features/albums/api/album-api.ts | 25 ++++++- .../components/album-list-infinite-grid.tsx | 2 +- .../components/album-list-infinite-table.tsx | 2 +- .../components/album-list-paginated-grid.tsx | 6 +- .../components/album-list-paginated-table.tsx | 6 +- .../features/artists/api/artists-api.ts | 48 +++++++++++-- .../album-artist-list-infinite-grid.tsx | 2 +- .../album-artist-list-infinite-table.tsx | 2 +- .../album-artist-list-paginated-grid.tsx | 6 +- .../album-artist-list-paginated-table.tsx | 6 +- .../components/artist-list-infinite-grid.tsx | 2 +- .../components/artist-list-infinite-table.tsx | 2 +- .../components/artist-list-paginated-grid.tsx | 6 +- .../artist-list-paginated-table.tsx | 6 +- .../features/genres/api/genres-api.ts | 4 +- .../features/playlists/api/playlists-api.ts | 4 +- src/renderer/features/songs/api/songs-api.ts | 24 ++++++- .../components/song-list-infinite-grid.tsx | 2 +- .../components/song-list-infinite-table.tsx | 2 +- .../components/song-list-paginated-grid.tsx | 6 +- .../components/song-list-paginated-table.tsx | 6 +- src/shared/types/domain-types.ts | 2 +- 23 files changed, 190 insertions(+), 49 deletions(-) create mode 100644 src/renderer/api/utils-list-count.ts diff --git a/src/renderer/api/utils-list-count.ts b/src/renderer/api/utils-list-count.ts new file mode 100644 index 000000000..4f9d92c4b --- /dev/null +++ b/src/renderer/api/utils-list-count.ts @@ -0,0 +1,68 @@ +import { QueryClient } from '@tanstack/react-query'; + +import { getServerById } from '/@/renderer/store'; +import { ServerType } from '/@/shared/types/domain-types'; + +interface OptimizedListCountOptions { + client: QueryClient; + listQueryFn: (args: { + apiClientProps: { serverId: string; signal?: AbortSignal }; + query: TListQuery; + }) => Promise; + listQueryKeyFn: (serverId: string, query: TListQuery) => readonly unknown[]; + query: TQuery; + serverId: string; + signal?: AbortSignal; +} + +export const getOptimizedListCount = async < + TQuery, + TListQuery extends { limit?: number; startIndex?: number }, + TResponse extends { totalRecordCount: null | number }, +>({ + client, + listQueryFn, + listQueryKeyFn, + query, + serverId, + signal, +}: OptimizedListCountOptions): Promise => { + const server = getServerById(serverId); + + if (server?.type !== ServerType.NAVIDROME && server?.type !== ServerType.JELLYFIN) { + return null; + } + + const limit = + typeof query === 'object' && + query !== null && + 'limit' in query && + typeof (query as any).limit === 'number' && + (query as any).limit > 0 + ? (query as any).limit + : 100; + + // In most cases, the list count is called when entering the first page, so we fetch from the first page + // This optimization will only help in this case, otherwise we still need 2 requests to get both the count and the data + const pageQuery = { + ...query, + limit, + startIndex: 0, + } as unknown as TListQuery; + + const pageQueryKey = listQueryKeyFn(serverId, pageQuery); + const cachedPage = client.getQueryData(pageQueryKey); + + if (cachedPage && typeof cachedPage === 'object' && 'totalRecordCount' in cachedPage) { + return (cachedPage as TResponse).totalRecordCount ?? 0; + } + + const pageResult = await listQueryFn({ + apiClientProps: { serverId, signal }, + query: pageQuery, + }); + + client.setQueryData(pageQueryKey, pageResult); + + return pageResult.totalRecordCount ?? 0; +}; diff --git a/src/renderer/features/albums/api/album-api.ts b/src/renderer/features/albums/api/album-api.ts index fc556cedb..c0a2fc2b9 100644 --- a/src/renderer/features/albums/api/album-api.ts +++ b/src/renderer/features/albums/api/album-api.ts @@ -1,7 +1,9 @@ import { queryOptions } from '@tanstack/react-query'; import { api } from '/@/renderer/api'; +import { controller } from '/@/renderer/api/controller'; import { queryKeys } from '/@/renderer/api/query-keys'; +import { getOptimizedListCount } from '/@/renderer/api/utils-list-count'; import { QueryHookArgs } from '/@/renderer/lib/react-query'; import { AlbumDetailQuery, AlbumListQuery, ListCountQuery } from '/@/shared/types/domain-types'; @@ -36,8 +38,25 @@ export const albumQueries = { }, listCount: (args: QueryHookArgs>) => { return queryOptions({ - gcTime: 1000 * 60 * 60 * 12, - queryFn: ({ signal }) => { + gcTime: 1000 * 60 * 60, + queryFn: async ({ client, signal }) => { + const optimizedCount = await getOptimizedListCount< + ListCountQuery, + AlbumListQuery, + { totalRecordCount: null | number } + >({ + client, + listQueryFn: controller.getAlbumList, + listQueryKeyFn: (serverId, query) => queryKeys.albums.list(serverId, query), + query: args.query, + serverId: args.serverId, + signal, + }); + + if (optimizedCount !== null) { + return optimizedCount; + } + return api.controller.getAlbumListCount({ apiClientProps: { serverId: args.serverId, signal }, query: args.query, @@ -48,7 +67,7 @@ export const albumQueries = { args.query, args.query?.artistIds?.length === 1 ? args.query?.artistIds[0] : undefined, ), - staleTime: 1000 * 60 * 60 * 12, + staleTime: 1000 * 60 * 60, ...args.options, }); }, diff --git a/src/renderer/features/albums/components/album-list-infinite-grid.tsx b/src/renderer/features/albums/components/album-list-infinite-grid.tsx index db50474b7..ae65ce588 100644 --- a/src/renderer/features/albums/components/album-list-infinite-grid.tsx +++ b/src/renderer/features/albums/components/album-list-infinite-grid.tsx @@ -30,7 +30,7 @@ export const AlbumListInfiniteGrid = ({ size, }: AlbumListInfiniteGridProps) => { const listCountQuery = albumQueries.listCount({ - query: { ...query }, + query: { ...query, limit: itemsPerPage }, serverId: serverId, }) as UseSuspenseQueryOptions; diff --git a/src/renderer/features/albums/components/album-list-infinite-table.tsx b/src/renderer/features/albums/components/album-list-infinite-table.tsx index 04bec9cda..2d3f4aa30 100644 --- a/src/renderer/features/albums/components/album-list-infinite-table.tsx +++ b/src/renderer/features/albums/components/album-list-infinite-table.tsx @@ -37,7 +37,7 @@ export const AlbumListInfiniteTable = ({ size = 'default', }: AlbumListInfiniteTableProps) => { const listCountQuery = albumQueries.listCount({ - query: { ...query }, + query: { ...query, limit: itemsPerPage }, serverId: serverId, }) as UseSuspenseQueryOptions; diff --git a/src/renderer/features/albums/components/album-list-paginated-grid.tsx b/src/renderer/features/albums/components/album-list-paginated-grid.tsx index 31207f8e7..ab359c7b2 100644 --- a/src/renderer/features/albums/components/album-list-paginated-grid.tsx +++ b/src/renderer/features/albums/components/album-list-paginated-grid.tsx @@ -31,15 +31,15 @@ export const AlbumListPaginatedGrid = ({ serverId, size, }: AlbumListPaginatedGridProps) => { + const { currentPage, onChange } = useItemListPagination(); + const listCountQuery = albumQueries.listCount({ - query: { ...query }, + query: { ...query, limit: itemsPerPage }, serverId: serverId, }) as UseSuspenseQueryOptions; const listQueryFn = api.controller.getAlbumList; - const { currentPage, onChange } = useItemListPagination(); - const { data, pageCount, totalItemCount } = useItemListPaginatedLoader({ currentPage, eventKey: ItemListKey.ALBUM, diff --git a/src/renderer/features/albums/components/album-list-paginated-table.tsx b/src/renderer/features/albums/components/album-list-paginated-table.tsx index dc9e172a9..fff993342 100644 --- a/src/renderer/features/albums/components/album-list-paginated-table.tsx +++ b/src/renderer/features/albums/components/album-list-paginated-table.tsx @@ -38,15 +38,15 @@ export const AlbumListPaginatedTable = ({ serverId, size = 'default', }: AlbumListPaginatedTableProps) => { + const { currentPage, onChange } = useItemListPagination(); + const listCountQuery = albumQueries.listCount({ - query: { ...query }, + query: { ...query, limit: itemsPerPage }, serverId: serverId, }) as UseSuspenseQueryOptions; const listQueryFn = api.controller.getAlbumList; - const { currentPage, onChange } = useItemListPagination(); - const { data, pageCount, totalItemCount } = useItemListPaginatedLoader({ currentPage, eventKey: ItemListKey.ALBUM, diff --git a/src/renderer/features/artists/api/artists-api.ts b/src/renderer/features/artists/api/artists-api.ts index f72625fc7..539217bae 100644 --- a/src/renderer/features/artists/api/artists-api.ts +++ b/src/renderer/features/artists/api/artists-api.ts @@ -1,7 +1,9 @@ import { queryOptions } from '@tanstack/react-query'; import { api } from '/@/renderer/api'; +import { controller } from '/@/renderer/api/controller'; import { queryKeys } from '/@/renderer/api/query-keys'; +import { getOptimizedListCount } from '/@/renderer/api/utils-list-count'; import { QueryHookArgs } from '/@/renderer/lib/react-query'; import { AlbumArtistDetailQuery, @@ -38,8 +40,25 @@ export const artistsQueries = { }, albumArtistListCount: (args: QueryHookArgs>) => { return queryOptions({ - gcTime: 1000 * 60 * 60 * 12, - queryFn: ({ signal }) => { + gcTime: 1000 * 60 * 60, + queryFn: async ({ client, signal }) => { + const optimizedCount = await getOptimizedListCount< + ListCountQuery, + AlbumArtistListQuery, + { totalRecordCount: null | number } + >({ + client, + listQueryFn: controller.getAlbumArtistList, + listQueryKeyFn: queryKeys.albumArtists.list, + query: args.query, + serverId: args.serverId, + signal, + }); + + if (optimizedCount !== null) { + return optimizedCount; + } + return api.controller.getAlbumArtistListCount({ apiClientProps: { serverId: args.serverId, signal }, query: args.query, @@ -49,7 +68,7 @@ export const artistsQueries = { args.serverId, Object.keys(args.query).length === 0 ? undefined : args.query, ), - staleTime: 1000 * 60 * 60 * 12, + staleTime: 1000 * 60 * 60, ...args.options, }); }, @@ -67,8 +86,25 @@ export const artistsQueries = { }, artistListCount: (args: QueryHookArgs>) => { return queryOptions({ - gcTime: 1000 * 60 * 60 * 12, - queryFn: ({ signal }) => { + gcTime: 1000 * 60 * 60, + queryFn: async ({ client, signal }) => { + const optimizedCount = await getOptimizedListCount< + ListCountQuery, + ArtistListQuery, + { totalRecordCount: null | number } + >({ + client, + listQueryFn: controller.getArtistList, + listQueryKeyFn: queryKeys.artists.list, + query: args.query, + serverId: args.serverId, + signal, + }); + + if (optimizedCount !== null) { + return optimizedCount; + } + return api.controller .getArtistList({ apiClientProps: { serverId: args.serverId, signal }, @@ -80,7 +116,7 @@ export const artistsQueries = { args.serverId, Object.keys(args.query).length === 0 ? undefined : args.query, ), - staleTime: 1000 * 60 * 60 * 12, + staleTime: 1000 * 60 * 60, ...args.options, }); }, diff --git a/src/renderer/features/artists/components/album-artist-list-infinite-grid.tsx b/src/renderer/features/artists/components/album-artist-list-infinite-grid.tsx index 7a56f0b2f..298f4104a 100644 --- a/src/renderer/features/artists/components/album-artist-list-infinite-grid.tsx +++ b/src/renderer/features/artists/components/album-artist-list-infinite-grid.tsx @@ -31,7 +31,7 @@ export const AlbumArtistListInfiniteGrid = ({ size, }: AlbumArtistListInfiniteGridProps) => { const listCountQuery = artistsQueries.albumArtistListCount({ - query: { ...query }, + query: { ...query, limit: itemsPerPage }, serverId: serverId, }) as UseSuspenseQueryOptions; diff --git a/src/renderer/features/artists/components/album-artist-list-infinite-table.tsx b/src/renderer/features/artists/components/album-artist-list-infinite-table.tsx index 62aeb5384..89c179a67 100644 --- a/src/renderer/features/artists/components/album-artist-list-infinite-table.tsx +++ b/src/renderer/features/artists/components/album-artist-list-infinite-table.tsx @@ -38,7 +38,7 @@ export const AlbumArtistListInfiniteTable = ({ size = 'default', }: AlbumArtistListInfiniteTableProps) => { const listCountQuery = artistsQueries.albumArtistListCount({ - query: { ...query }, + query: { ...query, limit: itemsPerPage }, serverId: serverId, }) as UseSuspenseQueryOptions; diff --git a/src/renderer/features/artists/components/album-artist-list-paginated-grid.tsx b/src/renderer/features/artists/components/album-artist-list-paginated-grid.tsx index d224ee37d..936d64597 100644 --- a/src/renderer/features/artists/components/album-artist-list-paginated-grid.tsx +++ b/src/renderer/features/artists/components/album-artist-list-paginated-grid.tsx @@ -32,15 +32,15 @@ export const AlbumArtistListPaginatedGrid = ({ serverId, size, }: AlbumArtistListPaginatedGridProps) => { + const { currentPage, onChange } = useItemListPagination(); + const listCountQuery = artistsQueries.albumArtistListCount({ - query: { ...query }, + query: { ...query, limit: itemsPerPage }, serverId: serverId, }) as UseSuspenseQueryOptions; const listQueryFn = api.controller.getAlbumArtistList; - const { currentPage, onChange } = useItemListPagination(); - const { data, pageCount, totalItemCount } = useItemListPaginatedLoader({ currentPage, eventKey: ItemListKey.ALBUM_ARTIST, diff --git a/src/renderer/features/artists/components/album-artist-list-paginated-table.tsx b/src/renderer/features/artists/components/album-artist-list-paginated-table.tsx index a26ec766f..288a22766 100644 --- a/src/renderer/features/artists/components/album-artist-list-paginated-table.tsx +++ b/src/renderer/features/artists/components/album-artist-list-paginated-table.tsx @@ -39,15 +39,15 @@ export const AlbumArtistListPaginatedTable = ({ serverId, size = 'default', }: AlbumArtistListPaginatedTableProps) => { + const { currentPage, onChange } = useItemListPagination(); + const listCountQuery = artistsQueries.albumArtistListCount({ - query: { ...query }, + query: { ...query, limit: itemsPerPage }, serverId: serverId, }) as UseSuspenseQueryOptions; const listQueryFn = api.controller.getAlbumArtistList; - const { currentPage, onChange } = useItemListPagination(); - const { data, pageCount, totalItemCount } = useItemListPaginatedLoader({ currentPage, eventKey: ItemListKey.ALBUM_ARTIST, diff --git a/src/renderer/features/artists/components/artist-list-infinite-grid.tsx b/src/renderer/features/artists/components/artist-list-infinite-grid.tsx index 08e36e08e..3ae0a52aa 100644 --- a/src/renderer/features/artists/components/artist-list-infinite-grid.tsx +++ b/src/renderer/features/artists/components/artist-list-infinite-grid.tsx @@ -30,7 +30,7 @@ export const ArtistListInfiniteGrid = ({ size, }: ArtistListInfiniteGridProps) => { const listCountQuery = artistsQueries.artistListCount({ - query: { ...query }, + query: { ...query, limit: itemsPerPage }, serverId: serverId, }) as UseSuspenseQueryOptions; diff --git a/src/renderer/features/artists/components/artist-list-infinite-table.tsx b/src/renderer/features/artists/components/artist-list-infinite-table.tsx index 58116cb92..a01c39048 100644 --- a/src/renderer/features/artists/components/artist-list-infinite-table.tsx +++ b/src/renderer/features/artists/components/artist-list-infinite-table.tsx @@ -37,7 +37,7 @@ export const ArtistListInfiniteTable = ({ size = 'default', }: ArtistListInfiniteTableProps) => { const listCountQuery = artistsQueries.artistListCount({ - query: { ...query }, + query: { ...query, limit: itemsPerPage }, serverId: serverId, }) as UseSuspenseQueryOptions; diff --git a/src/renderer/features/artists/components/artist-list-paginated-grid.tsx b/src/renderer/features/artists/components/artist-list-paginated-grid.tsx index c8f25d639..540933ff0 100644 --- a/src/renderer/features/artists/components/artist-list-paginated-grid.tsx +++ b/src/renderer/features/artists/components/artist-list-paginated-grid.tsx @@ -31,15 +31,15 @@ export const ArtistListPaginatedGrid = ({ serverId, size, }: ArtistListPaginatedGridProps) => { + const { currentPage, onChange } = useItemListPagination(); + const listCountQuery = artistsQueries.artistListCount({ - query: { ...query }, + query: { ...query, limit: itemsPerPage }, serverId: serverId, }) as UseSuspenseQueryOptions; const listQueryFn = api.controller.getArtistList; - const { currentPage, onChange } = useItemListPagination(); - const { data, pageCount, totalItemCount } = useItemListPaginatedLoader({ currentPage, eventKey: ItemListKey.ARTIST, diff --git a/src/renderer/features/artists/components/artist-list-paginated-table.tsx b/src/renderer/features/artists/components/artist-list-paginated-table.tsx index 048f95529..c639fe5fe 100644 --- a/src/renderer/features/artists/components/artist-list-paginated-table.tsx +++ b/src/renderer/features/artists/components/artist-list-paginated-table.tsx @@ -38,15 +38,15 @@ export const ArtistListPaginatedTable = ({ serverId, size = 'default', }: ArtistListPaginatedTableProps) => { + const { currentPage, onChange } = useItemListPagination(); + const listCountQuery = artistsQueries.artistListCount({ - query: { ...query }, + query: { ...query, limit: itemsPerPage }, serverId: serverId, }) as UseSuspenseQueryOptions; const listQueryFn = api.controller.getArtistList; - const { currentPage, onChange } = useItemListPagination(); - const { data, pageCount, totalItemCount } = useItemListPaginatedLoader({ currentPage, eventKey: ItemListKey.ARTIST, diff --git a/src/renderer/features/genres/api/genres-api.ts b/src/renderer/features/genres/api/genres-api.ts index 2b9e1d050..7cf06c79d 100644 --- a/src/renderer/features/genres/api/genres-api.ts +++ b/src/renderer/features/genres/api/genres-api.ts @@ -28,7 +28,7 @@ export const genresQueries = { }, listCount: (args: QueryHookArgs>) => { return queryOptions({ - gcTime: 1000 * 60 * 60 * 12, + gcTime: 1000 * 60 * 60, queryFn: ({ signal }) => { return api.controller .getGenreList({ @@ -41,7 +41,7 @@ export const genresQueries = { args.serverId, Object.keys(args.query).length === 0 ? undefined : args.query, ), - staleTime: 1000 * 60 * 60 * 12, + staleTime: 1000 * 60 * 60, ...args.options, }); }, diff --git a/src/renderer/features/playlists/api/playlists-api.ts b/src/renderer/features/playlists/api/playlists-api.ts index a6e6ff1fa..63fe8a9f8 100644 --- a/src/renderer/features/playlists/api/playlists-api.ts +++ b/src/renderer/features/playlists/api/playlists-api.ts @@ -38,7 +38,7 @@ export const playlistsQueries = { }, listCount: (args: QueryHookArgs>) => { return queryOptions({ - gcTime: 1000 * 60 * 60 * 12, + gcTime: 1000 * 60 * 60, queryFn: ({ signal }) => { return api.controller.getPlaylistListCount({ apiClientProps: { serverId: args.serverId, signal }, @@ -49,7 +49,7 @@ export const playlistsQueries = { args.serverId || '', Object.keys(args.query).length === 0 ? undefined : args.query, ), - staleTime: 1000 * 60 * 60 * 12, + staleTime: 1000 * 60 * 60, ...args.options, }); }, diff --git a/src/renderer/features/songs/api/songs-api.ts b/src/renderer/features/songs/api/songs-api.ts index 57b87e39b..88eea79f9 100644 --- a/src/renderer/features/songs/api/songs-api.ts +++ b/src/renderer/features/songs/api/songs-api.ts @@ -3,6 +3,7 @@ import { queryOptions } from '@tanstack/react-query'; import { api } from '/@/renderer/api'; import { controller } from '/@/renderer/api/controller'; import { queryKeys } from '/@/renderer/api/query-keys'; +import { getOptimizedListCount } from '/@/renderer/api/utils-list-count'; import { QueryHookArgs } from '/@/renderer/lib/react-query'; import { ArtistRadioQuery, @@ -53,8 +54,25 @@ export const songsQueries = { }, listCount: (args: QueryHookArgs>) => { return queryOptions({ - gcTime: 1000 * 60 * 60 * 12, - queryFn: ({ signal }) => { + gcTime: 1000 * 60 * 60, + queryFn: async ({ client, signal }) => { + const optimizedCount = await getOptimizedListCount< + ListCountQuery, + SongListQuery, + { totalRecordCount: null | number } + >({ + client, + listQueryFn: controller.getSongList, + listQueryKeyFn: queryKeys.songs.list, + query: args.query, + serverId: args.serverId, + signal, + }); + + if (optimizedCount !== null) { + return optimizedCount; + } + return api.controller.getSongListCount({ apiClientProps: { serverId: args.serverId, signal }, query: args.query, @@ -64,7 +82,7 @@ export const songsQueries = { args.serverId, Object.keys(args.query).length === 0 ? undefined : args.query, ), - staleTime: 1000 * 60 * 60 * 12, + staleTime: 1000 * 60 * 60, ...args.options, }); }, diff --git a/src/renderer/features/songs/components/song-list-infinite-grid.tsx b/src/renderer/features/songs/components/song-list-infinite-grid.tsx index 7db2aca6e..d2b126a5a 100644 --- a/src/renderer/features/songs/components/song-list-infinite-grid.tsx +++ b/src/renderer/features/songs/components/song-list-infinite-grid.tsx @@ -25,7 +25,7 @@ export const SongListInfiniteGrid = ({ size, }: SongListInfiniteGridProps) => { const listCountQuery = songsQueries.listCount({ - query: { ...query }, + query: { ...query, limit: itemsPerPage }, serverId: serverId, }) as UseSuspenseQueryOptions; diff --git a/src/renderer/features/songs/components/song-list-infinite-table.tsx b/src/renderer/features/songs/components/song-list-infinite-table.tsx index 3a93450a9..ab3837df8 100644 --- a/src/renderer/features/songs/components/song-list-infinite-table.tsx +++ b/src/renderer/features/songs/components/song-list-infinite-table.tsx @@ -33,7 +33,7 @@ export const SongListInfiniteTable = ({ size = 'default', }: SongListInfiniteTableProps) => { const listCountQuery = songsQueries.listCount({ - query: { ...query }, + query: { ...query, limit: itemsPerPage }, serverId: serverId, }) as UseSuspenseQueryOptions; diff --git a/src/renderer/features/songs/components/song-list-paginated-grid.tsx b/src/renderer/features/songs/components/song-list-paginated-grid.tsx index b2ec286b8..700b20005 100644 --- a/src/renderer/features/songs/components/song-list-paginated-grid.tsx +++ b/src/renderer/features/songs/components/song-list-paginated-grid.tsx @@ -24,15 +24,15 @@ export const SongListPaginatedGrid = ({ serverId, size, }: SongListPaginatedGridProps) => { + const { currentPage, onChange } = useItemListPagination(); + const listCountQuery = songsQueries.listCount({ - query: { ...query }, + query: { ...query, limit: itemsPerPage }, serverId: serverId, }) as UseSuspenseQueryOptions; const listQueryFn = api.controller.getSongList; - const { currentPage, onChange } = useItemListPagination(); - const { data, pageCount, totalItemCount } = useItemListPaginatedLoader({ currentPage, eventKey: ItemListKey.SONG, diff --git a/src/renderer/features/songs/components/song-list-paginated-table.tsx b/src/renderer/features/songs/components/song-list-paginated-table.tsx index 6d990b78b..c8cd82cbf 100644 --- a/src/renderer/features/songs/components/song-list-paginated-table.tsx +++ b/src/renderer/features/songs/components/song-list-paginated-table.tsx @@ -34,15 +34,15 @@ export const SongListPaginatedTable = ({ serverId, size = 'default', }: SongListPaginatedTableProps) => { + const { currentPage, onChange } = useItemListPagination(); + const listCountQuery = songsQueries.listCount({ - query: { ...query }, + query: { ...query, limit: itemsPerPage }, serverId: serverId, }) as UseSuspenseQueryOptions; const listQueryFn = api.controller.getSongList; - const { currentPage, onChange } = useItemListPagination(); - const { data, pageCount, totalItemCount } = useItemListPaginatedLoader({ currentPage, eventKey: ItemListKey.SONG, diff --git a/src/shared/types/domain-types.ts b/src/shared/types/domain-types.ts index 2be1d84fa..8b36a3277 100644 --- a/src/shared/types/domain-types.ts +++ b/src/shared/types/domain-types.ts @@ -487,7 +487,7 @@ export interface AlbumListQuery extends AlbumListNavidromeQuery, BaseQuery; -export type ListCountQuery = Omit; +export type ListCountQuery = Omit; interface AlbumListNavidromeQuery { hasRating?: boolean;