From a51f922bdce0ec52d6ff322dd9c0754c30a1aeda Mon Sep 17 00:00:00 2001 From: charles Date: Tue, 10 Feb 2026 11:11:48 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8(frontend)=20add=20useSearch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit frontend is now calling the search endpoint Signed-off-by: charles --- .../docs/doc-management/api/searchDocs.tsx | 43 +++++++++++++++++++ .../docs/doc-management/api/useDocs.tsx | 4 -- .../components/DocSearchContent.tsx | 21 +++------ 3 files changed, 50 insertions(+), 18 deletions(-) create mode 100644 src/frontend/apps/impress/src/features/docs/doc-management/api/searchDocs.tsx diff --git a/src/frontend/apps/impress/src/features/docs/doc-management/api/searchDocs.tsx b/src/frontend/apps/impress/src/features/docs/doc-management/api/searchDocs.tsx new file mode 100644 index 00000000..68660f77 --- /dev/null +++ b/src/frontend/apps/impress/src/features/docs/doc-management/api/searchDocs.tsx @@ -0,0 +1,43 @@ +import { useQuery } from '@tanstack/react-query'; + +import { APIError, APIList, errorCauses, fetchAPI } from '@/api'; +import { KEY_LIST_DOC } from '@/docs/doc-management'; + +import { Doc } from '../types'; + +export type DocsParams = { + q: string; +}; + +export const constructParams = (params: DocsParams): URLSearchParams => { + const searchParams = new URLSearchParams(); + + if (params.q.length > 0) { + searchParams.set('q', params.q); + } else { + searchParams.set('q', '*'); + } + + return searchParams; +}; + +export type DocsResponse = APIList; +export const getDocs = async (params: DocsParams): Promise => { + const searchParams = constructParams(params); + const response = await fetchAPI( + `documents/search/?${searchParams.toString()}`, + ); + + if (!response.ok) { + throw new APIError('Failed to get the docs', await errorCauses(response)); + } + + return response.json() as Promise; +}; + +export const useSearchDocs = (params: DocsParams) => { + return useQuery({ + queryKey: [KEY_LIST_DOC, 'search', params], + queryFn: () => getDocs(params), + }); +}; diff --git a/src/frontend/apps/impress/src/features/docs/doc-management/api/useDocs.tsx b/src/frontend/apps/impress/src/features/docs/doc-management/api/useDocs.tsx index 90e1461e..911e52ba 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-management/api/useDocs.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-management/api/useDocs.tsx @@ -15,7 +15,6 @@ export type DocsParams = { page: number; ordering?: DocsOrdering; is_creator_me?: boolean; - title?: string; is_favorite?: boolean; }; @@ -31,9 +30,6 @@ export const constructParams = (params: DocsParams): URLSearchParams => { if (params.is_creator_me !== undefined) { searchParams.set('is_creator_me', params.is_creator_me.toString()); } - if (params.title && params.title.length > 0) { - searchParams.set('title', params.title); - } if (params.is_favorite !== undefined) { searchParams.set('is_favorite', params.is_favorite.toString()); } diff --git a/src/frontend/apps/impress/src/features/docs/doc-search/components/DocSearchContent.tsx b/src/frontend/apps/impress/src/features/docs/doc-search/components/DocSearchContent.tsx index 1fde46d6..08408392 100644 --- a/src/frontend/apps/impress/src/features/docs/doc-search/components/DocSearchContent.tsx +++ b/src/frontend/apps/impress/src/features/docs/doc-search/components/DocSearchContent.tsx @@ -1,11 +1,14 @@ import { t } from 'i18next'; -import { useEffect, useState } from 'react'; +import { useEffect, useMemo } from 'react'; import { InView } from 'react-intersection-observer'; import { Box } from '@/components/'; import { QuickSearchData, QuickSearchGroup } from '@/components/quick-search'; -import { Doc, useInfiniteDocs } from '@/docs/doc-management'; +import { useSearchDocs } from '@/docs/doc-management/api/searchDocs'; +import { Doc } from '../../doc-management'; + +import { DocSearchFiltersValues } from './DocSearchFilters'; import { DocSearchItem } from './DocSearchItem'; type DocSearchContentProps = { @@ -27,16 +30,8 @@ export const DocSearchContent = ({ renderSearchElement, isSearchNotMandatory, }: DocSearchContentProps) => { - const { - data, - isFetching, - isRefetching, - isLoading, - fetchNextPage, - hasNextPage, - } = useInfiniteDocs({ - page: 1, - ...(search ? { title: search } : {}), + const { data, isFetching, isRefetching, isLoading } = useSearchDocs({ + q: search, }); const loading = isFetching || isRefetching || isLoading; @@ -79,8 +74,6 @@ export const DocSearchContent = ({ }, [ search, data?.pages, - fetchNextPage, - hasNextPage, filterResults, groupName, isSearchNotMandatory,