Commit 3a2979aa authored by tom's avatar tom

refactor

parent 3bd5b6cd
import { Box, chakra, Table, Tbody, Tr, Th, Skeleton } from '@chakra-ui/react'; import { Box, chakra, Table, Tbody, Tr, Th, Skeleton } from '@chakra-ui/react';
import { useRouter } from 'next/router'; import type { FormEvent } from 'react';
import React from 'react'; import React from 'react';
import useQueryWithPages from 'lib/hooks/useQueryWithPages'; import link from 'lib/link/link';
import useUpdateValueEffect from 'lib/hooks/useUpdateValueEffect';
import SearchResultTableItem from 'ui/searchResults/SearchResultTableItem'; import SearchResultTableItem from 'ui/searchResults/SearchResultTableItem';
import ActionBar from 'ui/shared/ActionBar'; import ActionBar from 'ui/shared/ActionBar';
import DataFetchAlert from 'ui/shared/DataFetchAlert'; import DataFetchAlert from 'ui/shared/DataFetchAlert';
...@@ -12,6 +11,9 @@ import PageTitle from 'ui/shared/Page/PageTitle'; ...@@ -12,6 +11,9 @@ import PageTitle from 'ui/shared/Page/PageTitle';
import Pagination from 'ui/shared/Pagination'; import Pagination from 'ui/shared/Pagination';
import SkeletonTable from 'ui/shared/skeletons/SkeletonTable'; import SkeletonTable from 'ui/shared/skeletons/SkeletonTable';
import { default as Thead } from 'ui/shared/TheadSticky'; import { default as Thead } from 'ui/shared/TheadSticky';
import Header from 'ui/snippets/header/Header';
import SearchBarInput from 'ui/snippets/searchBar/SearchBarInput';
import useSearchQuery from 'ui/snippets/searchBar/useSearchQuery';
// const data = { // const data = {
// items: [ // items: [
...@@ -59,18 +61,16 @@ import { default as Thead } from 'ui/shared/TheadSticky'; ...@@ -59,18 +61,16 @@ import { default as Thead } from 'ui/shared/TheadSticky';
// }; // };
const SearchResultsPageContent = () => { const SearchResultsPageContent = () => {
const router = useRouter(); const { query, searchTerm, handleSearchTermChange } = useSearchQuery(true);
const searchTerm = String(router.query.q || ''); const { data, isError, isLoading, pagination, isPaginationVisible } = query;
const { data, isError, isLoading, pagination, isPaginationVisible, onFilterChange } = useQueryWithPages({
resourceName: 'search',
filters: { q: searchTerm },
options: { enabled: Boolean(searchTerm) },
});
useUpdateValueEffect(() => { const handleSubmit = React.useCallback((event: FormEvent<HTMLFormElement>) => {
onFilterChange({ q: searchTerm }); event.preventDefault();
// eslint-disable-next-line react-hooks/exhaustive-deps if (searchTerm) {
}, searchTerm); const url = link('search_results', undefined, { q: searchTerm });
window.location.assign(url);
}
}, [ searchTerm ]);
const content = (() => { const content = (() => {
if (isError) { if (isError) {
...@@ -122,8 +122,22 @@ const SearchResultsPageContent = () => { ...@@ -122,8 +122,22 @@ const SearchResultsPageContent = () => {
); );
})(); })();
const renderSearchBar = React.useCallback(() => {
return (
<SearchBarInput
onChange={ handleSearchTermChange }
onSubmit={ handleSubmit }
value={ searchTerm }
/>
);
}, [ handleSearchTermChange, handleSubmit, searchTerm ]);
const renderHeader = React.useCallback(() => {
return <Header renderSearchBar={ renderSearchBar }/>;
}, [ renderSearchBar ]);
return ( return (
<Page isSearchPage> <Page renderHeader={ renderHeader }>
<PageTitle text="Search results"/> <PageTitle text="Search results"/>
{ content } { content }
</Page> </Page>
......
...@@ -15,7 +15,7 @@ interface Props { ...@@ -15,7 +15,7 @@ interface Props {
wrapChildren?: boolean; wrapChildren?: boolean;
hideMobileHeaderOnScrollDown?: boolean; hideMobileHeaderOnScrollDown?: boolean;
isHomePage?: boolean; isHomePage?: boolean;
isSearchPage?: boolean; renderHeader?: () => React.ReactNode;
} }
const Page = ({ const Page = ({
...@@ -23,7 +23,7 @@ const Page = ({ ...@@ -23,7 +23,7 @@ const Page = ({
wrapChildren = true, wrapChildren = true,
hideMobileHeaderOnScrollDown, hideMobileHeaderOnScrollDown,
isHomePage, isHomePage,
isSearchPage, renderHeader,
}: Props) => { }: Props) => {
const fetch = useFetch(); const fetch = useFetch();
...@@ -45,7 +45,10 @@ const Page = ({ ...@@ -45,7 +45,10 @@ const Page = ({
<Flex w="100%" minH="100vh" alignItems="stretch"> <Flex w="100%" minH="100vh" alignItems="stretch">
<NavigationDesktop/> <NavigationDesktop/>
<Flex flexDir="column" flexGrow={ 1 } w={{ base: '100%', lg: 'auto' }}> <Flex flexDir="column" flexGrow={ 1 } w={{ base: '100%', lg: 'auto' }}>
<Header isHomePage={ isHomePage } isSearchPage={ isSearchPage } hideOnScrollDown={ hideMobileHeaderOnScrollDown }/> { renderHeader ?
renderHeader() :
<Header isHomePage={ isHomePage } hideOnScrollDown={ hideMobileHeaderOnScrollDown }/>
}
<ErrorBoundary renderErrorScreen={ renderErrorScreen }> <ErrorBoundary renderErrorScreen={ renderErrorScreen }>
{ renderedChildren } { renderedChildren }
</ErrorBoundary> </ErrorBoundary>
......
...@@ -13,14 +13,16 @@ import ColorModeToggler from './ColorModeToggler'; ...@@ -13,14 +13,16 @@ import ColorModeToggler from './ColorModeToggler';
type Props = { type Props = {
isHomePage?: boolean; isHomePage?: boolean;
isSearchPage?: boolean;
hideOnScrollDown?: boolean; hideOnScrollDown?: boolean;
renderSearchBar?: () => React.ReactNode;
} }
const Header = ({ hideOnScrollDown, isHomePage, isSearchPage }: Props) => { const Header = ({ hideOnScrollDown, isHomePage, renderSearchBar }: Props) => {
const bgColor = useColorModeValue('white', 'black'); const bgColor = useColorModeValue('white', 'black');
const scrollDirection = useScrollDirection(); const scrollDirection = useScrollDirection();
const searchBar = renderSearchBar ? renderSearchBar() : <SearchBar withShadow={ !hideOnScrollDown }/>;
return ( return (
<> <>
<Box bgColor={ bgColor } display={{ base: 'block', lg: 'none' }}> <Box bgColor={ bgColor } display={{ base: 'block', lg: 'none' }}>
...@@ -44,7 +46,7 @@ const Header = ({ hideOnScrollDown, isHomePage, isSearchPage }: Props) => { ...@@ -44,7 +46,7 @@ const Header = ({ hideOnScrollDown, isHomePage, isSearchPage }: Props) => {
<NetworkLogo/> <NetworkLogo/>
<ProfileMenuMobile/> <ProfileMenuMobile/>
</Flex> </Flex>
{ !isHomePage && <SearchBar withShadow={ !hideOnScrollDown } isSearchPage={ isSearchPage }/> } { !isHomePage && searchBar }
</Box> </Box>
<Box <Box
paddingX={ 12 } paddingX={ 12 }
...@@ -62,7 +64,7 @@ const Header = ({ hideOnScrollDown, isHomePage, isSearchPage }: Props) => { ...@@ -62,7 +64,7 @@ const Header = ({ hideOnScrollDown, isHomePage, isSearchPage }: Props) => {
paddingBottom="52px" paddingBottom="52px"
> >
<Box width="100%"> <Box width="100%">
<SearchBar isSearchPage={ isSearchPage }/> { searchBar }
</Box> </Box>
<ColorModeToggler/> <ColorModeToggler/>
<ProfileMenuDesktop/> <ProfileMenuDesktop/>
......
...@@ -12,17 +12,16 @@ import useSearchQuery from './useSearchQuery'; ...@@ -12,17 +12,16 @@ import useSearchQuery from './useSearchQuery';
type Props = { type Props = {
withShadow?: boolean; withShadow?: boolean;
isHomepage?: boolean; isHomepage?: boolean;
isSearchPage?: boolean;
} }
const SearchBar = ({ isHomepage, isSearchPage, withShadow }: Props) => { const SearchBar = ({ isHomepage, withShadow }: Props) => {
const { isOpen, onClose, onOpen } = useDisclosure(); const { isOpen, onClose, onOpen } = useDisclosure();
const inputRef = React.useRef<HTMLFormElement>(null); const inputRef = React.useRef<HTMLFormElement>(null);
const menuRef = React.useRef<HTMLDivElement>(null); const menuRef = React.useRef<HTMLDivElement>(null);
const menuWidth = React.useRef<number>(0); const menuWidth = React.useRef<number>(0);
const isMobile = useIsMobile(); const isMobile = useIsMobile();
const { searchTerm, handleSearchTermChange, query } = useSearchQuery(isSearchPage); const { searchTerm, handleSearchTermChange, query } = useSearchQuery();
const handleSubmit = React.useCallback((event: FormEvent<HTMLFormElement>) => { const handleSubmit = React.useCallback((event: FormEvent<HTMLFormElement>) => {
event.preventDefault(); event.preventDefault();
...@@ -58,7 +57,7 @@ const SearchBar = ({ isHomepage, isSearchPage, withShadow }: Props) => { ...@@ -58,7 +57,7 @@ const SearchBar = ({ isHomepage, isSearchPage, withShadow }: Props) => {
return ( return (
<Popover <Popover
isOpen={ isOpen && searchTerm.trim().length > 0 && !isSearchPage } isOpen={ isOpen && searchTerm.trim().length > 0 }
autoFocus={ false } autoFocus={ false }
onClose={ onClose } onClose={ onClose }
placement="bottom-start" placement="bottom-start"
......
...@@ -10,8 +10,8 @@ import useIsMobile from 'lib/hooks/useIsMobile'; ...@@ -10,8 +10,8 @@ import useIsMobile from 'lib/hooks/useIsMobile';
interface Props { interface Props {
onChange: (event: ChangeEvent<HTMLInputElement>) => void; onChange: (event: ChangeEvent<HTMLInputElement>) => void;
onSubmit: (event: FormEvent<HTMLFormElement>) => void; onSubmit: (event: FormEvent<HTMLFormElement>) => void;
onBlur: (event: FocusEvent<HTMLFormElement>) => void; onBlur?: (event: FocusEvent<HTMLFormElement>) => void;
onFocus: () => void; onFocus?: () => void;
isHomepage?: boolean; isHomepage?: boolean;
withShadow?: boolean; withShadow?: boolean;
value: string; value: string;
......
...@@ -69,9 +69,9 @@ export default function useSearchQuery(isSearchPage = false) { ...@@ -69,9 +69,9 @@ export default function useSearchQuery(isSearchPage = false) {
}, []); }, []);
useUpdateValueEffect(() => { useUpdateValueEffect(() => {
query.onFilterChange({ q: debouncedSearchTerm }); if (isSearchPage) {
// should run only when debouncedSearchTerm updates query.onFilterChange({ q: debouncedSearchTerm });
// eslint-disable-next-line react-hooks/exhaustive-deps }
}, debouncedSearchTerm); }, debouncedSearchTerm);
return { return {
......
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