From f81db395ef9a333bd966a62a7d899d2a080daf56 Mon Sep 17 00:00:00 2001 From: Anthony LC Date: Fri, 9 Jan 2026 16:56:32 +0100 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F(frontend)=20use=20dedicated?= =?UTF-8?q?=20favorite=5Flist=20route?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It exists a dedicated endpoint to list favorite documents. Better use it to avoid relying on the general documents listing endpoint. --- .../docs/doc-header/components/DocToolBox.tsx | 5 +- .../features/docs/doc-management/api/index.ts | 1 + .../doc-management/api/useDocsFavorite.tsx | 72 +++++++++++++++++++ .../docs-grid/components/DocsGridActions.tsx | 5 +- .../components/LeftPanelFavorites.tsx | 5 +- 5 files changed, 81 insertions(+), 7 deletions(-) create mode 100644 src/frontend/apps/impress/src/features/docs/doc-management/api/useDocsFavorite.tsx diff --git a/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx b/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx index 378b66e3..8c571d49 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-header/components/DocToolBox.tsx @@ -19,6 +19,7 @@ import { Doc, KEY_DOC, KEY_LIST_DOC, + KEY_LIST_FAVORITE_DOC, ModalRemoveDoc, getEmojiAndTitle, useCopyDocLink, @@ -67,10 +68,10 @@ export const DocToolBox = ({ doc }: DocToolBoxProps) => { }, }); const removeFavoriteDoc = useDeleteFavoriteDoc({ - listInvalidQueries: [KEY_LIST_DOC, KEY_DOC], + listInvalidQueries: [KEY_LIST_DOC, KEY_DOC, KEY_LIST_FAVORITE_DOC], }); const makeFavoriteDoc = useCreateFavoriteDoc({ - listInvalidQueries: [KEY_LIST_DOC, KEY_DOC], + listInvalidQueries: [KEY_LIST_DOC, KEY_DOC, KEY_LIST_FAVORITE_DOC], }); useEffect(() => { diff --git a/src/frontend/apps/impress/src/features/docs/doc-management/api/index.ts b/src/frontend/apps/impress/src/features/docs/doc-management/api/index.ts index e04d79f3..88c4b028 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-management/api/index.ts +++ b/src/frontend/apps/impress/src/features/docs/doc-management/api/index.ts @@ -5,6 +5,7 @@ export * from './useDeleteFavoriteDoc'; export * from './useDoc'; export * from './useDocOptions'; export * from './useDocs'; +export * from './useDocsFavorite'; export * from './useDuplicateDoc'; export * from './useRestoreDoc'; export * from './useSubDocs'; diff --git a/src/frontend/apps/impress/src/features/docs/doc-management/api/useDocsFavorite.tsx b/src/frontend/apps/impress/src/features/docs/doc-management/api/useDocsFavorite.tsx new file mode 100644 index 00000000..3baa4510 --- /dev/null +++ b/src/frontend/apps/impress/src/features/docs/doc-management/api/useDocsFavorite.tsx @@ -0,0 +1,72 @@ +import { UseQueryOptions, useQuery } from '@tanstack/react-query'; + +import { + APIError, + APIList, + InfiniteQueryConfig, + errorCauses, + fetchAPI, + useAPIInfiniteQuery, +} from '@/api'; + +import { Doc } from '../types'; + +export type DocsFavoriteParams = { + page: number; +}; + +export type DocsFavoriteResponse = APIList; +export const getDocsFavorite = async ( + params: DocsFavoriteParams, +): Promise => { + const searchParams = new URLSearchParams(); + + if (params.page) { + searchParams.set('page', params.page.toString()); + } + + const response = await fetchAPI( + `documents/favorite_list/?${searchParams.toString()}`, + ); + + if (!response.ok) { + throw new APIError( + 'Failed to get the favorite docs', + await errorCauses(response), + ); + } + + return response.json() as Promise; +}; + +export const KEY_LIST_FAVORITE_DOC = 'docs_favorite_list'; + +type UseDocsOptions = UseQueryOptions< + DocsFavoriteResponse, + APIError, + DocsFavoriteResponse +>; +type UseInfiniteDocsOptions = InfiniteQueryConfig; + +export function useDocsFavorite( + params: DocsFavoriteParams, + queryConfig?: UseDocsOptions, +) { + return useQuery({ + queryKey: [KEY_LIST_FAVORITE_DOC, params], + queryFn: () => getDocsFavorite(params), + ...queryConfig, + }); +} + +export const useInfiniteDocsFavorite = ( + params: DocsFavoriteParams, + queryConfig?: UseInfiniteDocsOptions, +) => { + return useAPIInfiniteQuery( + KEY_LIST_FAVORITE_DOC, + getDocsFavorite, + params, + queryConfig, + ); +}; diff --git a/src/frontend/apps/impress/src/features/docs/docs-grid/components/DocsGridActions.tsx b/src/frontend/apps/impress/src/features/docs/docs-grid/components/DocsGridActions.tsx index 94720b12..2758cd3b 100644 --- a/src/frontend/apps/impress/src/features/docs/docs-grid/components/DocsGridActions.tsx +++ b/src/frontend/apps/impress/src/features/docs/docs-grid/components/DocsGridActions.tsx @@ -6,6 +6,7 @@ import { DropdownMenu, DropdownMenuOption, Icon } from '@/components'; import { Doc, KEY_LIST_DOC, + KEY_LIST_FAVORITE_DOC, ModalRemoveDoc, useCreateFavoriteDoc, useDeleteFavoriteDoc, @@ -27,10 +28,10 @@ export const DocsGridActions = ({ const { mutate: duplicateDoc } = useDuplicateDoc(); const removeFavoriteDoc = useDeleteFavoriteDoc({ - listInvalidQueries: [KEY_LIST_DOC], + listInvalidQueries: [KEY_LIST_DOC, KEY_LIST_FAVORITE_DOC], }); const makeFavoriteDoc = useCreateFavoriteDoc({ - listInvalidQueries: [KEY_LIST_DOC], + listInvalidQueries: [KEY_LIST_DOC, KEY_LIST_FAVORITE_DOC], }); const options: DropdownMenuOption[] = [ diff --git a/src/frontend/apps/impress/src/features/left-panel/components/LeftPanelFavorites.tsx b/src/frontend/apps/impress/src/features/left-panel/components/LeftPanelFavorites.tsx index 7710bfbe..01111027 100644 --- a/src/frontend/apps/impress/src/features/left-panel/components/LeftPanelFavorites.tsx +++ b/src/frontend/apps/impress/src/features/left-panel/components/LeftPanelFavorites.tsx @@ -2,7 +2,7 @@ import { useTranslation } from 'react-i18next'; import { Box, HorizontalSeparator, InfiniteScroll, Text } from '@/components'; import { useCunninghamTheme } from '@/cunningham'; -import { useInfiniteDocs } from '@/docs/doc-management'; +import { useInfiniteDocsFavorite } from '@/docs/doc-management'; import { LeftPanelFavoriteItem } from './LeftPanelFavoriteItem'; @@ -11,9 +11,8 @@ export const LeftPanelFavorites = () => { const { spacingsTokens } = useCunninghamTheme(); - const docs = useInfiniteDocs({ + const docs = useInfiniteDocsFavorite({ page: 1, - is_favorite: true, }); const favoriteDocs = docs.data?.pages.flatMap((page) => page.results) || [];