Commit de007f5d authored by Igor Stuev's avatar Igor Stuev Committed by GitHub

Merge pull request #2160 from blockscout/fe-2077

check redirect only on search bar submit
parents 2fb91698 acecd9b3
...@@ -7,6 +7,8 @@ import type { SearchResultItem } from 'types/client/search'; ...@@ -7,6 +7,8 @@ import type { SearchResultItem } from 'types/client/search';
import config from 'configs/app'; import config from 'configs/app';
import * as regexp from 'lib/regexp'; import * as regexp from 'lib/regexp';
import getQueryParamString from 'lib/router/getQueryParamString';
import removeQueryParam from 'lib/router/removeQueryParam';
import useMarketplaceApps from 'ui/marketplace/useMarketplaceApps'; import useMarketplaceApps from 'ui/marketplace/useMarketplaceApps';
import SearchResultListItem from 'ui/searchResults/SearchResultListItem'; import SearchResultListItem from 'ui/searchResults/SearchResultListItem';
import SearchResultsInput from 'ui/searchResults/SearchResultsInput'; import SearchResultsInput from 'ui/searchResults/SearchResultsInput';
...@@ -28,9 +30,10 @@ import useSearchQuery from 'ui/snippets/searchBar/useSearchQuery'; ...@@ -28,9 +30,10 @@ import useSearchQuery from 'ui/snippets/searchBar/useSearchQuery';
const SearchResultsPageContent = () => { const SearchResultsPageContent = () => {
const router = useRouter(); const router = useRouter();
const { query, redirectCheckQuery, searchTerm, debouncedSearchTerm, handleSearchTermChange } = useSearchQuery(); const withRedirectCheck = getQueryParamString(router.query.redirect) === 'true';
const { query, redirectCheckQuery, searchTerm, debouncedSearchTerm, handleSearchTermChange } = useSearchQuery(withRedirectCheck);
const { data, isError, isPlaceholderData, pagination } = query; const { data, isError, isPlaceholderData, pagination } = query;
const [ showContent, setShowContent ] = React.useState(false); const [ showContent, setShowContent ] = React.useState(!withRedirectCheck);
const marketplaceApps = useMarketplaceApps(debouncedSearchTerm); const marketplaceApps = useMarketplaceApps(debouncedSearchTerm);
...@@ -75,13 +78,18 @@ const SearchResultsPageContent = () => { ...@@ -75,13 +78,18 @@ const SearchResultsPageContent = () => {
} }
} }
!redirectCheckQuery.isPending && setShowContent(true); if (!redirectCheckQuery.isPending) {
setShowContent(true);
removeQueryParam(router, 'redirect');
}
}, [ redirectCheckQuery, router, debouncedSearchTerm, showContent ]); }, [ redirectCheckQuery, router, debouncedSearchTerm, showContent ]);
const handleSubmit = React.useCallback((event: FormEvent<HTMLFormElement>) => { const handleSubmit = React.useCallback((event: FormEvent<HTMLFormElement>) => {
event.preventDefault(); event.preventDefault();
}, [ ]); }, [ ]);
const isLoading = marketplaceApps.isPlaceholderData || isPlaceholderData;
const displayedItems: Array<SearchResultItem | SearchResultAppItem> = React.useMemo(() => { const displayedItems: Array<SearchResultItem | SearchResultAppItem> = React.useMemo(() => {
const apiData = (data?.items || []).filter((item) => { const apiData = (data?.items || []).filter((item) => {
if (!config.features.userOps.isEnabled && item.type === 'user_operation') { if (!config.features.userOps.isEnabled && item.type === 'user_operation') {
...@@ -111,12 +119,12 @@ const SearchResultsPageContent = () => { ...@@ -111,12 +119,12 @@ const SearchResultsPageContent = () => {
} : undefined; } : undefined;
return [ return [
...(pagination.page === 1 && !isPlaceholderData ? marketplaceApps.displayedApps.map((item) => ({ type: 'app' as const, app: item })) : []), ...(pagination.page === 1 && !isLoading ? marketplaceApps.displayedApps.map((item) => ({ type: 'app' as const, app: item })) : []),
futureBlockItem, futureBlockItem,
...apiData, ...apiData,
].filter(Boolean); ].filter(Boolean);
}, [ data?.items, data?.next_page_params, isPlaceholderData, pagination.page, debouncedSearchTerm, marketplaceApps.displayedApps ]); }, [ data?.items, data?.next_page_params, isPlaceholderData, pagination.page, debouncedSearchTerm, marketplaceApps.displayedApps, isLoading ]);
const content = (() => { const content = (() => {
if (isError) { if (isError) {
...@@ -132,10 +140,10 @@ const SearchResultsPageContent = () => { ...@@ -132,10 +140,10 @@ const SearchResultsPageContent = () => {
<Show below="lg" ssr={ false }> <Show below="lg" ssr={ false }>
{ displayedItems.map((item, index) => ( { displayedItems.map((item, index) => (
<SearchResultListItem <SearchResultListItem
key={ (isPlaceholderData ? 'placeholder_' : 'actual_') + index } key={ (isLoading ? 'placeholder_' : 'actual_') + index }
data={ item } data={ item }
searchTerm={ debouncedSearchTerm } searchTerm={ debouncedSearchTerm }
isLoading={ isPlaceholderData } isLoading={ isLoading }
/> />
)) } )) }
</Show> </Show>
...@@ -152,10 +160,10 @@ const SearchResultsPageContent = () => { ...@@ -152,10 +160,10 @@ const SearchResultsPageContent = () => {
<Tbody> <Tbody>
{ displayedItems.map((item, index) => ( { displayedItems.map((item, index) => (
<SearchResultTableItem <SearchResultTableItem
key={ (isPlaceholderData ? 'placeholder_' : 'actual_') + index } key={ (isLoading ? 'placeholder_' : 'actual_') + index }
data={ item } data={ item }
searchTerm={ debouncedSearchTerm } searchTerm={ debouncedSearchTerm }
isLoading={ isPlaceholderData } isLoading={ isLoading }
/> />
)) } )) }
</Tbody> </Tbody>
...@@ -172,7 +180,7 @@ const SearchResultsPageContent = () => { ...@@ -172,7 +180,7 @@ const SearchResultsPageContent = () => {
const resultsCount = pagination.page === 1 && !data?.next_page_params ? displayedItems.length : '50+'; const resultsCount = pagination.page === 1 && !data?.next_page_params ? displayedItems.length : '50+';
const text = isPlaceholderData && pagination.page === 1 ? ( const text = isLoading && pagination.page === 1 ? (
<Skeleton h={ 6 } w="280px" borderRadius="full" mb={ pagination.isVisible ? 0 : 6 }/> <Skeleton h={ 6 } w="280px" borderRadius="full" mb={ pagination.isVisible ? 0 : 6 }/>
) : ( ) : (
( (
......
...@@ -14,6 +14,7 @@ import type { FormEvent } from 'react'; ...@@ -14,6 +14,7 @@ import type { FormEvent } from 'react';
import React from 'react'; import React from 'react';
import { Element } from 'react-scroll'; import { Element } from 'react-scroll';
import type { Route } from 'nextjs-routes';
import { route } from 'nextjs-routes'; import { route } from 'nextjs-routes';
import useIsMobile from 'lib/hooks/useIsMobile'; import useIsMobile from 'lib/hooks/useIsMobile';
...@@ -50,14 +51,15 @@ const SearchBar = ({ isHomepage }: Props) => { ...@@ -50,14 +51,15 @@ const SearchBar = ({ isHomepage }: Props) => {
const handleSubmit = React.useCallback((event: FormEvent<HTMLFormElement>) => { const handleSubmit = React.useCallback((event: FormEvent<HTMLFormElement>) => {
event.preventDefault(); event.preventDefault();
if (searchTerm) { if (searchTerm) {
const url = route({ pathname: '/search-results', query: { q: searchTerm } }); const resultRoute: Route = { pathname: '/search-results', query: { q: searchTerm, redirect: 'true' } };
const url = route(resultRoute);
mixpanel.logEvent(mixpanel.EventTypes.SEARCH_QUERY, { mixpanel.logEvent(mixpanel.EventTypes.SEARCH_QUERY, {
'Search query': searchTerm, 'Search query': searchTerm,
'Source page type': mixpanel.getPageType(pathname), 'Source page type': mixpanel.getPageType(pathname),
'Result URL': url, 'Result URL': url,
}); });
saveToRecentKeywords(searchTerm); saveToRecentKeywords(searchTerm);
router.push({ pathname: '/search-results', query: { q: searchTerm } }, undefined, { shallow: true }); router.push(resultRoute, undefined, { shallow: true });
} }
}, [ searchTerm, pathname, router ]); }, [ searchTerm, pathname, router ]);
......
...@@ -9,7 +9,7 @@ import { SEARCH_RESULT_ITEM, SEARCH_RESULT_NEXT_PAGE_PARAMS } from 'stubs/search ...@@ -9,7 +9,7 @@ import { SEARCH_RESULT_ITEM, SEARCH_RESULT_NEXT_PAGE_PARAMS } from 'stubs/search
import { generateListStub } from 'stubs/utils'; import { generateListStub } from 'stubs/utils';
import useQueryWithPages from 'ui/shared/pagination/useQueryWithPages'; import useQueryWithPages from 'ui/shared/pagination/useQueryWithPages';
export default function useSearchQuery() { export default function useSearchQuery(withRedirectCheck?: boolean) {
const router = useRouter(); const router = useRouter();
const q = React.useRef(getQueryParamString(router.query.q)); const q = React.useRef(getQueryParamString(router.query.q));
const initialValue = q.current; const initialValue = q.current;
...@@ -31,7 +31,7 @@ export default function useSearchQuery() { ...@@ -31,7 +31,7 @@ export default function useSearchQuery() {
const redirectCheckQuery = useApiQuery('search_check_redirect', { const redirectCheckQuery = useApiQuery('search_check_redirect', {
// on search result page we check redirect only once on mount // on search result page we check redirect only once on mount
queryParams: { q: q.current }, queryParams: { q: q.current },
queryOptions: { enabled: Boolean(q.current) }, queryOptions: { enabled: Boolean(q.current) && withRedirectCheck },
}); });
useUpdateValueEffect(() => { useUpdateValueEffect(() => {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment