fix(#548): moved store higher to share search results btw pages (#216)

keep-around/af30b88d367751c9e05a735e4a0467a96238ef47
Mirlan 5 years ago committed by GitHub
parent 9b37149cb4
commit 0b0d6d4644
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 46
      src/features/App/AuthenticatedApp.tsx
  2. 12
      src/features/ExtendedSearchPage/index.tsx
  3. 9
      src/features/ExtendedSearchPage/store/hooks/index.tsx
  4. 81
      src/features/Search/hooks/index.tsx
  5. 10
      src/features/Search/index.tsx

@ -15,7 +15,7 @@ import { TeamPage } from 'features/TeamPage'
import { MatchPage } from 'features/MatchPage'
import { PlayerPage } from 'features/PlayerPage'
import { TournamentPage } from 'features/TournamentPage'
import { ExtendedSearchPage } from 'features/ExtendedSearchPage'
import { ExtendedSearchStore, ExtendedSearchPage } from 'features/ExtendedSearchPage'
import { LanguageSelect } from 'features/LanguageSelect'
import { UserAccount } from 'features/UserAccount'
import { ScoreStore, ToggleScore } from 'features/ToggleScore'
@ -45,29 +45,31 @@ export const AuthenticatedApp = () => {
<UserAccountForm />
</Route>
<UserFavoritesStore>
<MainWrapper>
{!isMobile && <UserFavorites />}
<Route exact path={PAGES.home}>
<HomePage />
</Route>
<ExtendedSearchStore>
<MainWrapper>
{!isMobile && <UserFavorites />}
<Route exact path={PAGES.home}>
<HomePage />
</Route>
<Route path={`/:sportName${PAGES.tournament}/:pageId`}>
<TournamentPage />
</Route>
<Route path={`/:sportName${PAGES.tournament}/:pageId`}>
<TournamentPage />
</Route>
<Route path={`/:sportName${PAGES.team}/:pageId`}>
<TeamPage />
</Route>
<Route path={`/:sportName${PAGES.player}/:pageId`}>
<PlayerPage />
</Route>
<Route path={`/:sportName${PAGES.match}/:pageId`}>
<MatchPage />
</Route>
<Route path={PAGES.extendedSearch}>
<ExtendedSearchPage />
</Route>
</MainWrapper>
<Route path={`/:sportName${PAGES.team}/:pageId`}>
<TeamPage />
</Route>
<Route path={`/:sportName${PAGES.player}/:pageId`}>
<PlayerPage />
</Route>
<Route path={`/:sportName${PAGES.match}/:pageId`}>
<MatchPage />
</Route>
<Route path={PAGES.extendedSearch}>
<ExtendedSearchPage />
</Route>
</MainWrapper>
</ExtendedSearchStore>
</UserFavoritesStore>
<Redirect to={PAGES.home} />
</Switch>

@ -7,11 +7,13 @@ import { useMediaQuery } from 'features/MediaQuery'
import { MobileHeader } from './components/MobileHeader'
import { DesktopHeader } from './components/DesktopHeader'
import { Results } from './components/Results'
import { ExtendedSearchStore, useExtendedSearchStore } from './store'
import { useExtendedSearchStore } from './store'
import { Main } from './styled'
const ExtendedSearch = () => {
export { ExtendedSearchStore } from './store'
export const ExtendedSearchPage = () => {
const { searchItems } = useExtendedSearchStore()
const isMobile = useMediaQuery({ query: devices.tablet })
return (
@ -27,9 +29,3 @@ const ExtendedSearch = () => {
</Fragment>
)
}
export const ExtendedSearchPage = () => (
<ExtendedSearchStore>
<ExtendedSearch />
</ExtendedSearchStore>
)

@ -72,6 +72,14 @@ export const useExtendedSearch = () => {
cancelSearch,
])
const reset = useCallback(() => {
setSearchItems(initialState)
setQuery('')
setSelectedSport(null)
setSelectedGender(null)
setSelectedProfile(null)
}, [])
return {
isFetching,
onGenderChange,
@ -79,6 +87,7 @@ export const useExtendedSearch = () => {
onQueryChange,
onSportChange: setSelectedSport,
query,
reset,
searchItems,
selectedGender,
selectedProfile,

@ -1,27 +1,18 @@
import type { FormEvent, ChangeEvent } from 'react'
import {
useState,
useRef,
useCallback,
} from 'react'
import type { FormEvent } from 'react'
import { useCallback, useEffect } from 'react'
import trim from 'lodash/trim'
import debounce from 'lodash/debounce'
import size from 'lodash/size'
import { useToggle } from 'hooks'
import type { SearchItems } from 'requests'
import { getSearchItems } from 'requests'
import {
useRequest,
useToggle,
} from 'hooks'
import { SEARCH_DELAY, MIN_CHARACTERS_LENGTH } from '../config'
import { normalizeItems } from '../helpers'
import { useExtendedSearchStore } from 'features/ExtendedSearchPage/store'
export const useSearch = () => {
const [searchItems, setSearchItems] = useState<SearchItems>({})
const abortControllerRef = useRef<AbortController | null>(null)
const {
isFetching,
onQueryChange,
query,
reset,
searchItems,
} = useExtendedSearchStore()
const {
close,
@ -29,58 +20,22 @@ export const useSearch = () => {
open,
} = useToggle()
const {
isFetching,
request: searchItemsRequest,
} = useRequest(getSearchItems)
const fetchSearchItems = useCallback(debounce((searchString: string) => {
const abortController = new window.AbortController()
abortControllerRef.current = abortController
searchItemsRequest(searchString, abortController.signal).then((data) => {
setSearchItems(data)
abortControllerRef.current = null
})
}, SEARCH_DELAY), [])
const cancelRequest = useCallback(() => {
const abortController = abortControllerRef.current
if (abortController) {
abortController.abort()
abortControllerRef.current = null
}
}, [])
const onChange = useCallback(({ target: { value } }: ChangeEvent<HTMLInputElement>) => {
const trimmedValue = trim(value)
if (size(trimmedValue) >= MIN_CHARACTERS_LENGTH) {
cancelRequest()
setSearchItems({})
fetchSearchItems(trimmedValue)
open()
} else {
close()
}
}, [
cancelRequest,
close,
fetchSearchItems,
open,
])
const onSubmit = useCallback((e: FormEvent<HTMLFormElement>) => {
e.preventDefault()
}, [])
useEffect(() => {
reset()
}, [reset])
return {
close,
isFetching,
normalizedItems: normalizeItems(searchItems),
onChange,
onChange: onQueryChange,
onFocus: open,
onSubmit,
query,
searchItems,
showResults: isOpen,
}
}

@ -26,14 +26,15 @@ export const Search = () => {
const {
close,
isFetching,
normalizedItems: {
onChange,
onFocus,
onSubmit,
query,
searchItems: {
players,
teams,
tournaments,
},
onChange,
onFocus,
onSubmit,
showResults,
} = useSearch()
@ -45,6 +46,7 @@ export const Search = () => {
<Input
autoComplete='off'
type='search'
value={query}
onChange={onChange}
onFocus={onFocus}
/>

Loading…
Cancel
Save