Ott 577 replace react responsive lib (#229)

* refactor(577): added useMediaQuery and removed react-responsive lib

* feat(577): added MediaQuery component

* refactor(577): replaced useMediaQuery hook usage to MediaQuery component

* refactor(577): simplified useMediaQuery arg type
keep-around/af30b88d367751c9e05a735e4a0467a96238ef47
Mirlan 5 years ago committed by GitHub
parent 0bdd1af5f5
commit feb8f69b46
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      package.json
  2. 3
      src/config/devices.tsx
  3. 19
      src/features/ExtendedSearchPage/index.tsx
  4. 55
      src/features/HomePage/index.tsx
  5. 10
      src/features/MatchPage/index.tsx
  6. 16
      src/features/MediaQuery/helpers.tsx
  7. 23
      src/features/MediaQuery/hooks.tsx
  8. 38
      src/features/MediaQuery/index.tsx
  9. 9
      src/features/PlayerPage/index.tsx
  10. 19
      src/features/ProfileHeader/index.tsx
  11. 9
      src/features/TeamPage/index.tsx
  12. 9
      src/features/TournamentPage/index.tsx

@ -20,7 +20,6 @@
"react": "^16.13.1", "react": "^16.13.1",
"react-datepicker": "^3.1.3", "react-datepicker": "^3.1.3",
"react-dom": "^16.13.1", "react-dom": "^16.13.1",
"react-responsive": "^8.1.0",
"react-router": "^5.2.0", "react-router": "^5.2.0",
"react-router-dom": "^5.2.0", "react-router-dom": "^5.2.0",
"react-scripts": "^4.0.1", "react-scripts": "^4.0.1",

@ -5,3 +5,6 @@ export const devices = {
mobile: '(max-width: 640px)', mobile: '(max-width: 640px)',
tablet: '(max-width: 1024px)', tablet: '(max-width: 1024px)',
} }
export type MediaQueryConfig = typeof devices
export type Devices = keyof MediaQueryConfig

@ -1,8 +1,6 @@
import React from 'react' import React from 'react'
import { devices } from 'config' import { MediaQuery } from 'features/MediaQuery'
import { useMediaQuery } from 'features/MediaQuery'
import { UserFavorites } from 'features/UserFavorites' import { UserFavorites } from 'features/UserFavorites'
import { MainWrapper } from 'features/MainWrapper' import { MainWrapper } from 'features/MainWrapper'
@ -17,15 +15,16 @@ export { ExtendedSearchStore } from './store'
export const ExtendedSearchPage = () => { export const ExtendedSearchPage = () => {
const { searchItems } = useExtendedSearchStore() const { searchItems } = useExtendedSearchStore()
const isMobile = useMediaQuery({ query: devices.tablet })
return ( return (
<MainWrapper> <MainWrapper>
{!isMobile && <UserFavorites />} <MediaQuery minDevice='laptop'>
{ <DesktopHeader />
isMobile <UserFavorites />
? <MobileHeader /> </MediaQuery>
: <DesktopHeader />
} <MediaQuery maxDevice='tablet'>
<MobileHeader />
</MediaQuery>
<Main> <Main>
<Results results={searchItems} /> <Results results={searchItems} />
</Main> </Main>

@ -1,8 +1,6 @@
import React, { Fragment } from 'react' import React from 'react'
import { useMediaQuery } from 'react-responsive'
import { devices } from 'config'
import { MediaQuery } from 'features/MediaQuery'
import { HeaderMobile } from 'features/HeaderMobile' import { HeaderMobile } from 'features/HeaderMobile'
import { Matches } from 'features/Matches' import { Matches } from 'features/Matches'
import { import {
@ -25,39 +23,34 @@ import { Header } from './components/Header'
import { Content } from './styled' import { Content } from './styled'
const Home = () => { const Home = () => {
const isMobile = useMediaQuery({ query: devices.tablet })
const { fetchMatches } = useHomePage() const { fetchMatches } = useHomePage()
return ( return (
<MainWrapper> <MainWrapper>
{ <MediaQuery maxDevice='tablet'>
isMobile <HeaderMobile />
? <HeaderMobile /> <HeaderMobileMidle>
: <Header /> <DateFilter />
} </HeaderMobileMidle>
{ <HeaderMobileBottom>
isMobile && ( <MatchStatusFilter />
<Fragment> </HeaderMobileBottom>
<HeaderMobileMidle> </MediaQuery>
<DateFilter />
</HeaderMobileMidle> <MediaQuery minDevice='laptop'>
<HeaderMobileBottom> <Header />
<MatchStatusFilter /> <UserFavorites />
</HeaderMobileBottom> </MediaQuery>
</Fragment>
)
}
{!isMobile && <UserFavorites />}
<Content> <Content>
<Matches fetch={fetchMatches} /> <Matches fetch={fetchMatches} />
</Content> </Content>
{
isMobile && ( <MediaQuery maxDevice='tablet'>
<SportFilterWrapper> <SportFilterWrapper>
<SportTypeFilter /> <SportTypeFilter />
<TournamentFilter /> <TournamentFilter />
</SportFilterWrapper> </SportFilterWrapper>
) </MediaQuery>
}
</MainWrapper> </MainWrapper>
) )
} }

@ -2,14 +2,12 @@ import React from 'react'
import isEmpty from 'lodash/isEmpty' import isEmpty from 'lodash/isEmpty'
import { devices } from 'config'
import { StreamPlayer } from 'features/StreamPlayer' import { StreamPlayer } from 'features/StreamPlayer'
import { MultiSourcePlayer } from 'features/MultiSourcePlayer' import { MultiSourcePlayer } from 'features/MultiSourcePlayer'
import { ProfileHeader } from 'features/ProfileHeader' import { ProfileHeader } from 'features/ProfileHeader'
import { MainWrapper } from 'features/MainWrapper' import { MainWrapper } from 'features/MainWrapper'
import { UserFavorites } from 'features/UserFavorites' import { UserFavorites } from 'features/UserFavorites'
import { useMediaQuery } from 'features/MediaQuery' import { MediaQuery } from 'features/MediaQuery'
import { MatchProfileCard } from './MatchProfileCard' import { MatchProfileCard } from './MatchProfileCard'
import { usePlayerProgressReporter } from './hooks/usePlayerProgressReporter' import { usePlayerProgressReporter } from './hooks/usePlayerProgressReporter'
@ -27,14 +25,14 @@ export const MatchPage = () => {
} = useVideoData() } = useVideoData()
const { onPlayerProgressChange, onPlayingChange } = usePlayerProgressReporter() const { onPlayerProgressChange, onPlayingChange } = usePlayerProgressReporter()
const isMobile = useMediaQuery({ query: devices.tablet })
const isLiveMatch = Boolean(url) && !isLastPlayPositionFetching const isLiveMatch = Boolean(url) && !isLastPlayPositionFetching
const isFinishedMatch = !isEmpty(videos) && !isLastPlayPositionFetching const isFinishedMatch = !isEmpty(videos) && !isLastPlayPositionFetching
return ( return (
<MainWrapper> <MainWrapper>
{!isMobile && <UserFavorites />} <MediaQuery minDevice='laptop'>
<UserFavorites />
</MediaQuery>
<ProfileHeader /> <ProfileHeader />
<Wrapper> <Wrapper>
<MatchProfileCard profile={profile} /> <MatchProfileCard profile={profile} />

@ -0,0 +1,16 @@
import type { MediaQueryConfig, Devices } from 'config'
import { devices as maxDevices } from 'config'
const minDevices: MediaQueryConfig = {
desktop: '(min-width: 1281px)',
laptop: '(min-width: 1025px)',
large: '(min-width: 1900px)',
mobile: '(min-width: 0px)',
tablet: '(min-width: 641px)',
}
export const getQuery = (maxDevice?: Devices, minDevice?: Devices) => {
if (maxDevice) return maxDevices[maxDevice]
if (minDevice) return minDevices[minDevice]
return ''
}

@ -0,0 +1,23 @@
import {
useEffect,
useState,
useMemo,
} from 'react'
export const useMediaQuery = (query: string) => {
const mediaQuery = useMemo(() => matchMedia(query), [query])
const [queryMatches, setQueryMatches] = useState(mediaQuery.matches)
useEffect(() => {
const listener = (event: MediaQueryListEvent) => {
setQueryMatches(event.matches)
}
mediaQuery.addEventListener('change', listener)
return () => {
mediaQuery.removeEventListener('change', listener)
}
}, [mediaQuery])
return queryMatches
}

@ -1 +1,37 @@
export * from 'react-responsive' import type { ReactNode } from 'react'
import React, { Fragment } from 'react'
import type { Devices } from 'config'
import { getQuery } from './helpers'
import { useMediaQuery } from './hooks'
export * from './hooks'
type Props = {
children: ReactNode,
/** работает так же, как медиа запрос (max-width: width) */
maxDevice?: Devices,
/** работает так же, как медиа запрос (min-width: width) */
minDevice?: Devices,
}
export const MediaQuery = ({
children,
maxDevice,
minDevice,
}: Props) => {
const query = getQuery(maxDevice, minDevice)
const queryMatches = useMediaQuery(query)
return (
<Fragment>
{
queryMatches
? children
: null
}
</Fragment>
)
}

@ -1,13 +1,13 @@
import React from 'react' import React from 'react'
import { ProfileTypes, devices } from 'config' import { ProfileTypes } from 'config'
import { ProfileHeader } from 'features/ProfileHeader' import { ProfileHeader } from 'features/ProfileHeader'
import { ProfileCard } from 'features/ProfileCard' import { ProfileCard } from 'features/ProfileCard'
import { Matches } from 'features/Matches' import { Matches } from 'features/Matches'
import { UserFavorites } from 'features/UserFavorites' import { UserFavorites } from 'features/UserFavorites'
import { MainWrapper } from 'features/MainWrapper' import { MainWrapper } from 'features/MainWrapper'
import { useMediaQuery } from 'features/MediaQuery' import { MediaQuery } from 'features/MediaQuery'
import { usePlayerPage } from './hooks' import { usePlayerPage } from './hooks'
import { Content } from './styled' import { Content } from './styled'
@ -18,11 +18,12 @@ export const PlayerPage = () => {
infoItems, infoItems,
titleObj, titleObj,
} = usePlayerPage() } = usePlayerPage()
const isMobile = useMediaQuery({ query: devices.tablet })
return ( return (
<MainWrapper> <MainWrapper>
{!isMobile && <UserFavorites />} <MediaQuery minDevice='laptop'>
<UserFavorites />
</MediaQuery>
<ProfileHeader /> <ProfileHeader />
<Content> <Content>
<ProfileCard <ProfileCard

@ -1,14 +1,14 @@
import React from 'react' import React, { Fragment } from 'react'
import { useRouteMatch } from 'react-router-dom' import { useRouteMatch } from 'react-router-dom'
import { devices, PAGES } from 'config' import { PAGES } from 'config'
import { Menu } from 'features/Menu' import { Menu } from 'features/Menu'
import { LanguageSelect } from 'features/LanguageSelect' import { LanguageSelect } from 'features/LanguageSelect'
import { ScoreSwitch, AvailableMatchesSwitch } from 'features/MatchSwitches' import { ScoreSwitch, AvailableMatchesSwitch } from 'features/MatchSwitches'
import { Search } from 'features/Search' import { Search } from 'features/Search'
import { HeaderMobile } from 'features/HeaderMobile' import { HeaderMobile } from 'features/HeaderMobile'
import { useMediaQuery } from 'features/MediaQuery' import { MediaQuery } from 'features/MediaQuery'
import { import {
HeaderStyled, HeaderStyled,
@ -18,13 +18,15 @@ import {
} from './styled' } from './styled'
export const ProfileHeader = () => { export const ProfileHeader = () => {
const isMobile = useMediaQuery({ query: devices.tablet })
const isMatchPage = useRouteMatch(`/:sportName${PAGES.match}`) const isMatchPage = useRouteMatch(`/:sportName${PAGES.match}`)
return ( return (
isMobile <Fragment>
? <HeaderMobile /> <MediaQuery maxDevice='tablet'>
: ( <HeaderMobile />
</MediaQuery>
<MediaQuery minDevice='laptop'>
<HeaderStyled> <HeaderStyled>
<HeaderGroup> <HeaderGroup>
<SearchWrapper> <SearchWrapper>
@ -41,6 +43,7 @@ export const ProfileHeader = () => {
<LanguageSelect /> <LanguageSelect />
</HeaderGroup> </HeaderGroup>
</HeaderStyled> </HeaderStyled>
) </MediaQuery>
</Fragment>
) )
} }

@ -1,13 +1,13 @@
import React from 'react' import React from 'react'
import { ProfileTypes, devices } from 'config' import { ProfileTypes } from 'config'
import { ProfileHeader } from 'features/ProfileHeader' import { ProfileHeader } from 'features/ProfileHeader'
import { ProfileCard } from 'features/ProfileCard' import { ProfileCard } from 'features/ProfileCard'
import { Matches } from 'features/Matches' import { Matches } from 'features/Matches'
import { UserFavorites } from 'features/UserFavorites' import { UserFavorites } from 'features/UserFavorites'
import { MainWrapper } from 'features/MainWrapper' import { MainWrapper } from 'features/MainWrapper'
import { useMediaQuery } from 'features/MediaQuery' import { MediaQuery } from 'features/MediaQuery'
import { useTeamPage } from './hooks' import { useTeamPage } from './hooks'
import { Content } from './styled' import { Content } from './styled'
@ -18,11 +18,12 @@ export const TeamPage = () => {
infoItems, infoItems,
titleObj, titleObj,
} = useTeamPage() } = useTeamPage()
const isMobile = useMediaQuery({ query: devices.tablet })
return ( return (
<MainWrapper> <MainWrapper>
{!isMobile && <UserFavorites />} <MediaQuery minDevice='laptop'>
<UserFavorites />
</MediaQuery>
<ProfileHeader /> <ProfileHeader />
<Content> <Content>
<ProfileCard <ProfileCard

@ -1,13 +1,13 @@
import React from 'react' import React from 'react'
import { ProfileTypes, devices } from 'config' import { ProfileTypes } from 'config'
import { ProfileHeader } from 'features/ProfileHeader' import { ProfileHeader } from 'features/ProfileHeader'
import { ProfileCard } from 'features/ProfileCard' import { ProfileCard } from 'features/ProfileCard'
import { Matches } from 'features/Matches' import { Matches } from 'features/Matches'
import { MainWrapper } from 'features/MainWrapper' import { MainWrapper } from 'features/MainWrapper'
import { UserFavorites } from 'features/UserFavorites' import { UserFavorites } from 'features/UserFavorites'
import { useMediaQuery } from 'features/MediaQuery' import { MediaQuery } from 'features/MediaQuery'
import { useTournamentPage } from './hooks' import { useTournamentPage } from './hooks'
import { Content } from './styled' import { Content } from './styled'
@ -18,11 +18,12 @@ export const TournamentPage = () => {
infoItems, infoItems,
titleObj, titleObj,
} = useTournamentPage() } = useTournamentPage()
const isMobile = useMediaQuery({ query: devices.tablet })
return ( return (
<MainWrapper> <MainWrapper>
{!isMobile && <UserFavorites />} <MediaQuery minDevice='laptop'>
<UserFavorites />
</MediaQuery>
<ProfileHeader /> <ProfileHeader />
<Content> <Content>
<ProfileCard <ProfileCard

Loading…
Cancel
Save