diff --git a/src/common/hooks/useLoadSearchResults.ts b/src/common/hooks/useLoadSearchResults.ts index 396e1d09c..54de61c48 100644 --- a/src/common/hooks/useLoadSearchResults.ts +++ b/src/common/hooks/useLoadSearchResults.ts @@ -44,12 +44,6 @@ export const useLoadSearchResults = ( setQuery(queryParam); } - await fetchData({ - query: queryParam, - searchBy: searchByParam as SearchIdentifiers, - offset: offsetParam ? parseInt(offsetParam) * SEARCH_RESULTS_LIMIT : 0, - }); - setForceRefresh(false); prevSearchParams.current = { query: queryParam, searchBy: searchByParam, offset: offsetParam }; } @@ -66,8 +60,20 @@ export const useLoadSearchResults = ( await getSearchSourceData?.(); await getSearchFacetsData?.(); - if (defaultSearchBy && defaultQuery) { - await fetchData({ query: defaultQuery, searchBy: defaultSearchBy, offset: 0 }); + const query = hasSearchParams ? queryParam : defaultQuery; + const searchBy = hasSearchParams ? searchByParam : defaultSearchBy; + const offset = offsetParam ? parseInt(offsetParam) * SEARCH_RESULTS_LIMIT : 0; + + if (searchByParam) { + setSearchBy(searchByParam); + } + + if (searchByParam && queryParam) { + setQuery(queryParam); + } + + if (query) { + await fetchData({ query, searchBy, offset }); } setIsLoading(false); diff --git a/src/common/hooks/useSearch.ts b/src/common/hooks/useSearch.ts index 58ecfea21..7d503f3d0 100644 --- a/src/common/hooks/useSearch.ts +++ b/src/common/hooks/useSearch.ts @@ -2,7 +2,7 @@ import { useCallback, useEffect } from 'react'; import { useSearchParams } from 'react-router-dom'; import { SearchableIndexQuerySelector } from '@common/constants/complexLookup.constants'; import { DEFAULT_PAGES_METADATA } from '@common/constants/api.constants'; -import { SearchIdentifiers, SearchSegment } from '@common/constants/search.constants'; +import { SEARCH_RESULTS_LIMIT, SearchIdentifiers, SearchSegment } from '@common/constants/search.constants'; import { generateSearchParamsState } from '@common/helpers/search.helper'; import { usePagination } from '@common/hooks/usePagination'; import { useSearchContext } from '@common/hooks/useSearchContext'; @@ -78,10 +78,10 @@ export const useSearch = () => { if (hasSearchParams) { setSearchParams(generateSearchParamsState(query, searchBy) as unknown as URLSearchParams); - } else { - fetchData({ query, searchBy }); } + fetchData({ query, searchBy, offset: 0 }); + setForceRefreshSearch(true); }, [fetchData, hasSearchParams, query, searchBy, selectedNavigationSegment, facets]); @@ -161,39 +161,42 @@ export const useSearch = () => { }); }; - const onPrevPageClick = hasCustomPagination - ? async () => { - const pageNumber = onPrevPageClickBase(); - - await handlePaginationClick({ - pageNumber, - query, - pageMetadata, - isBrowseSearch, - searchBy, - navigationSegment, - baseQuerySelectorType: SearchableIndexQuerySelector.Prev, - pageMetadataSelectorType: 'prev', - }); - } - : onPrevPageClickBase; - - const onNextPageClick = hasCustomPagination - ? async () => { - const pageNumber = onNextPageClickBase(); - - await handlePaginationClick({ - pageNumber, - query, - pageMetadata, - isBrowseSearch, - searchBy, - navigationSegment, - baseQuerySelectorType: SearchableIndexQuerySelector.Next, - pageMetadataSelectorType: 'next', - }); - } - : onNextPageClickBase; + const handlePageChange = async ( + pageNumber: number, + querySelector: SearchableIndexQuerySelector, + metadataSelector: 'prev' | 'next', + ) => { + if (hasCustomPagination) { + await handlePaginationClick({ + pageNumber, + query, + pageMetadata, + isBrowseSearch, + searchBy, + navigationSegment, + baseQuerySelectorType: querySelector, + pageMetadataSelectorType: metadataSelector, + }); + } else { + await fetchData({ + query, + searchBy, + offset: pageNumber * SEARCH_RESULTS_LIMIT, + }); + } + }; + + const onPrevPageClick = async () => { + const pageNumber = onPrevPageClickBase(); + + await handlePageChange(pageNumber, SearchableIndexQuerySelector.Prev, 'prev'); + }; + + const onNextPageClick = async () => { + const pageNumber = onNextPageClickBase(); + + await handlePageChange(pageNumber, SearchableIndexQuerySelector.Next, 'next'); + }; useEffect(() => { setSearchBy(defaultSearchBy); diff --git a/src/components/AdvancedSearchModal/AdvancedSearchModal.tsx b/src/components/AdvancedSearchModal/AdvancedSearchModal.tsx index 332cb90b7..c9db3eb88 100644 --- a/src/components/AdvancedSearchModal/AdvancedSearchModal.tsx +++ b/src/components/AdvancedSearchModal/AdvancedSearchModal.tsx @@ -10,6 +10,7 @@ import { SELECT_QUALIFIERS, } from '@common/constants/search.constants'; import { formatRawQuery, generateSearchParamsState } from '@common/helpers/search.helper'; +import { useFetchSearchData } from '@common/hooks/useFetchSearchData'; import { Select } from '@components/Select'; import { useSearchState, useUIState } from '@src/store'; import { AriaModalKind } from '@common/constants/uiElements.constants'; @@ -31,6 +32,7 @@ export const AdvancedSearchModal: FC = memo(({ clearValues }) => { const { formatMessage } = useIntl(); const { isAdvancedSearchOpen: isOpen, setIsAdvancedSearchOpen: setIsOpen } = useUIState(); const { setForceRefresh: setForceRefreshSearch } = useSearchState(); + const { fetchData } = useFetchSearchData(); const [rawQuery, setRawQuery] = useState(DEFAULT_ADVANCED_SEARCH_QUERY); const closeModal = () => { @@ -52,10 +54,18 @@ export const AdvancedSearchModal: FC = memo(({ clearValues }) => { ); }; - const onDoSearch = () => { + const onDoSearch = async () => { clearValues(); - setSearchParams(generateSearchParamsState(formatRawQuery(rawQuery)) as unknown as URLSearchParams); + + const formattedQuery = formatRawQuery(rawQuery); + setSearchParams(generateSearchParamsState(formattedQuery) as unknown as URLSearchParams); setForceRefreshSearch(true); + + await fetchData({ + query: formattedQuery, + searchBy: undefined, + }); + closeModal(); }; diff --git a/src/test/__tests__/common/hooks/useLoadSearchResults.test.ts b/src/test/__tests__/common/hooks/useLoadSearchResults.test.ts index 622b71c15..040687f83 100644 --- a/src/test/__tests__/common/hooks/useLoadSearchResults.test.ts +++ b/src/test/__tests__/common/hooks/useLoadSearchResults.test.ts @@ -31,7 +31,7 @@ describe('useLoadSearchResults', () => { ]); }); - it('fetches data and updates state with query and searchBy', async () => { + it('updates state with query and searchBy', async () => { Object.defineProperty(window, 'location', { value: { search: '?query=test%20query&searchBy=title', @@ -39,7 +39,6 @@ describe('useLoadSearchResults', () => { writable: true, }); - fetchData.mockResolvedValue([{ test: ['test value'] }]); act(() => setUpdatedGlobalState([ { @@ -53,7 +52,6 @@ describe('useLoadSearchResults', () => { expect(setSearchBy).toHaveBeenCalledWith('title'); expect(setQuery).toHaveBeenCalledWith('test query'); - expect(fetchData).toHaveBeenCalledWith({ query: 'test query', searchBy: 'title', offset: 0 }); }); it('clears data when no query param', () => {