Ott 862 code splitting (#312)

* refactor: MatchPopup render place

* refactor: Combobox removed withArrow props

* fix: fetch user favorites on render

* feat: lazy loading
keep-around/af30b88d367751c9e05a735e4a0467a96238ef47
Mirlan 5 years ago committed by GitHub
parent d1b8d7ac16
commit 69825a4dd8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 19
      src/features/App/AuthenticatedApp.tsx
  2. 7
      src/features/App/UnauthenticatedApp.tsx
  3. 19
      src/features/App/index.tsx
  4. 11
      src/features/Combobox/index.tsx
  5. 1
      src/features/Combobox/types.tsx
  6. 6
      src/features/HomePage/index.tsx
  7. 4
      src/features/Login/index.tsx
  8. 4
      src/features/MatchPage/index.tsx
  9. 6
      src/features/PlayerPage/index.tsx
  10. 4
      src/features/Register/index.tsx
  11. 6
      src/features/TeamPage/index.tsx
  12. 6
      src/features/TournamentPage/index.tsx
  13. 2
      src/features/UserAccount/components/PagePersonalInfo/index.tsx
  14. 4
      src/features/UserAccount/index.tsx
  15. 5
      src/features/UserFavorites/hooks/index.tsx
  16. 6
      src/features/UserFavorites/index.tsx

@ -1,3 +1,5 @@
import { lazy } from 'react'
import { import {
Route, Route,
Redirect, Redirect,
@ -9,19 +11,19 @@ import { PAGES } from 'config'
import { useLexicsConfig } from 'features/LexicsStore' import { useLexicsConfig } from 'features/LexicsStore'
import { HomePage } from 'features/HomePage'
import { TeamPage } from 'features/TeamPage'
import { MatchPage } from 'features/MatchPage'
import { PlayerPage } from 'features/PlayerPage'
import { TournamentPage } from 'features/TournamentPage'
import { ExtendedSearchStore, ExtendedSearchPage } from 'features/ExtendedSearchPage' import { ExtendedSearchStore, ExtendedSearchPage } from 'features/ExtendedSearchPage'
import { UserAccount } from 'features/UserAccount'
import { MatchSwitchesStore } from 'features/MatchSwitches' import { MatchSwitchesStore } from 'features/MatchSwitches'
import { UserFavoritesStore } from 'features/UserFavorites/store' import { UserFavoritesStore } from 'features/UserFavorites/store'
import { MatchPopupStore } from 'features/MatchPopup' import { MatchPopup, MatchPopupStore } from 'features/MatchPopup'
import { BuyMatchPopup, BuyMatchPopupStore } from 'features/BuyMatchPopup' import { BuyMatchPopup, BuyMatchPopupStore } from 'features/BuyMatchPopup'
const HomePage = lazy(() => import('features/HomePage'))
const TeamPage = lazy(() => import('features/TeamPage'))
const MatchPage = lazy(() => import('features/MatchPage'))
const PlayerPage = lazy(() => import('features/PlayerPage'))
const TournamentPage = lazy(() => import('features/TournamentPage'))
const UserAccount = lazy(() => import('features/UserAccount'))
export const AuthenticatedApp = () => { export const AuthenticatedApp = () => {
useLexicsConfig(indexLexics) useLexicsConfig(indexLexics)
@ -31,6 +33,7 @@ export const AuthenticatedApp = () => {
<ExtendedSearchStore> <ExtendedSearchStore>
<MatchPopupStore> <MatchPopupStore>
<BuyMatchPopupStore> <BuyMatchPopupStore>
<MatchPopup />
<BuyMatchPopup /> <BuyMatchPopup />
{/* в Switch как прямой children можно рендерить только Route или Redirect */} {/* в Switch как прямой children можно рендерить только Route или Redirect */}

@ -1,3 +1,5 @@
import { lazy } from 'react'
import { import {
Route, Route,
Redirect, Redirect,
@ -10,11 +12,12 @@ import { PAGES } from 'config'
import { publicLexics } from 'config/lexics/public' import { publicLexics } from 'config/lexics/public'
import { useLexicsConfig } from 'features/LexicsStore' import { useLexicsConfig } from 'features/LexicsStore'
import { Login } from 'features/Login'
import { Register } from 'features/Register'
import { LanguageSelect } from 'features/LanguageSelect' import { LanguageSelect } from 'features/LanguageSelect'
import { HeaderStyled, HeaderGroup } from 'features/ProfileHeader/styled' import { HeaderStyled, HeaderGroup } from 'features/ProfileHeader/styled'
const Login = lazy(() => import('features/Login'))
const Register = lazy(() => import('features/Register'))
const Main = styled.main` const Main = styled.main`
width: 100%; width: 100%;
` `

@ -1,3 +1,4 @@
import { Suspense } from 'react'
import { Router } from 'react-router-dom' import { Router } from 'react-router-dom'
import { history } from 'config' import { history } from 'config'
@ -14,15 +15,9 @@ import { UnauthenticatedApp } from './UnauthenticatedApp'
const Main = () => { const Main = () => {
const { token } = useAuthStore() const { token } = useAuthStore()
return ( return token
<Background> ? <AuthenticatedApp />
{ : <UnauthenticatedApp />
token
? <AuthenticatedApp />
: <UnauthenticatedApp />
}
</Background>
)
} }
export const App = () => ( export const App = () => (
@ -30,7 +25,11 @@ export const App = () => (
<Theme> <Theme>
<GlobalStyles /> <GlobalStyles />
<GlobalStores> <GlobalStores>
<Main /> <Background>
<Suspense fallback={null}>
<Main />
</Suspense>
</Background>
</GlobalStores> </GlobalStores>
</Theme> </Theme>
</Router> </Router>

@ -35,7 +35,6 @@ export const Combobox = <T extends Option>(props: Props<T>) => {
labelWidth, labelWidth,
maxLength, maxLength,
title, title,
withArrow,
withError, withError,
} = props } = props
@ -81,12 +80,10 @@ export const Combobox = <T extends Option>(props: Props<T>) => {
isUserAccountPage={isUserAccountPage} isUserAccountPage={isUserAccountPage}
/> />
</Label> </Label>
{withArrow && ( <Arrow
<Arrow isExpanded={isOpen}
isExpanded={isOpen} toggle={toggle}
toggle={toggle} />
/>
)}
{isOpen && !isEmpty(options) && ( {isOpen && !isEmpty(options) && (
<OutsideClick onClick={onOutsideClick}> <OutsideClick onClick={onOutsideClick}>
<PopOver <PopOver

@ -27,6 +27,5 @@ export type Props<T> = Pick<InputHTMLAttributes<HTMLInputElement>, (
onSelect?: (option: T | null) => void, onSelect?: (option: T | null) => void,
options: Array<T>, options: Array<T>,
value?: string, value?: string,
withArrow?: boolean,
withError?: boolean, withError?: boolean,
} }

@ -15,7 +15,6 @@ import {
import { SportFilterWrapper } from 'features/ProfileHeader/styled' import { SportFilterWrapper } from 'features/ProfileHeader/styled'
import { MainWrapper } from 'features/MainWrapper' import { MainWrapper } from 'features/MainWrapper'
import { UserFavorites } from 'features/UserFavorites' import { UserFavorites } from 'features/UserFavorites'
import { MatchPopup } from 'features/MatchPopup'
import { useHomePage } from './hooks' import { useHomePage } from './hooks'
import { Header } from './components/Header' import { Header } from './components/Header'
@ -25,7 +24,6 @@ const Home = () => {
const { fetchMatches } = useHomePage() const { fetchMatches } = useHomePage()
return ( return (
<MainWrapper> <MainWrapper>
<MatchPopup />
<MediaQuery maxDevice='tablet'> <MediaQuery maxDevice='tablet'>
<HeaderMobile /> <HeaderMobile />
<HeaderMobileMidle> <HeaderMobileMidle>
@ -55,8 +53,10 @@ const Home = () => {
) )
} }
export const HomePage = () => ( const HomePage = () => (
<HeaderFiltersStore> <HeaderFiltersStore>
<Home /> <Home />
</HeaderFiltersStore> </HeaderFiltersStore>
) )
export default HomePage

@ -67,8 +67,10 @@ const LoginForm = () => {
) )
} }
export const Login = () => ( const Login = () => (
<FormStore> <FormStore>
<LoginForm /> <LoginForm />
</FormStore> </FormStore>
) )
export default Login

@ -18,7 +18,7 @@ import {
import { useMatchPage } from './hooks/useMatchPage' import { useMatchPage } from './hooks/useMatchPage'
import { usePlayerProgressReporter } from './hooks/usePlayerProgressReporter' import { usePlayerProgressReporter } from './hooks/usePlayerProgressReporter'
export const MatchPage = () => { const MatchPage = () => {
const profile = useMatchProfile() const profile = useMatchProfile()
const { const {
chapters, chapters,
@ -74,3 +74,5 @@ export const MatchPage = () => {
</MainWrapper> </MainWrapper>
) )
} }
export default MatchPage

@ -6,12 +6,11 @@ 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 { MediaQuery } from 'features/MediaQuery' import { MediaQuery } from 'features/MediaQuery'
import { MatchPopup } from 'features/MatchPopup'
import { usePlayerPage } from './hooks' import { usePlayerPage } from './hooks'
import { Content } from './styled' import { Content } from './styled'
export const PlayerPage = () => { const PlayerPage = () => {
const { const {
fetchMatches, fetchMatches,
infoItems, infoItems,
@ -20,7 +19,6 @@ export const PlayerPage = () => {
return ( return (
<MainWrapper> <MainWrapper>
<MatchPopup />
<MediaQuery minDevice='laptop'> <MediaQuery minDevice='laptop'>
<UserFavorites /> <UserFavorites />
</MediaQuery> </MediaQuery>
@ -36,3 +34,5 @@ export const PlayerPage = () => {
</MainWrapper> </MainWrapper>
) )
} }
export default PlayerPage

@ -11,7 +11,7 @@ import { CardStep } from './components/CardStep'
import { SubscriptionStep } from './components/SubscriptionsStep' import { SubscriptionStep } from './components/SubscriptionsStep'
import { RegistrationSuccessful } from './components/RegistrationSuccessful' import { RegistrationSuccessful } from './components/RegistrationSuccessful'
export const Register = () => { const Register = () => {
const isCardStep = useRouteMatch(`${PAGES.register}/card`)?.isExact || false const isCardStep = useRouteMatch(`${PAGES.register}/card`)?.isExact || false
const isSubsStep = useRouteMatch(`${PAGES.register}/subscriptions`)?.isExact || false const isSubsStep = useRouteMatch(`${PAGES.register}/subscriptions`)?.isExact || false
return ( return (
@ -32,3 +32,5 @@ export const Register = () => {
</CustomCenterBlock> </CustomCenterBlock>
) )
} }
export default Register

@ -6,12 +6,11 @@ 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 { MediaQuery } from 'features/MediaQuery' import { MediaQuery } from 'features/MediaQuery'
import { MatchPopup } from 'features/MatchPopup'
import { useTeamPage } from './hooks' import { useTeamPage } from './hooks'
import { Content } from './styled' import { Content } from './styled'
export const TeamPage = () => { const TeamPage = () => {
const { const {
fetchMatches, fetchMatches,
infoItems, infoItems,
@ -20,7 +19,6 @@ export const TeamPage = () => {
return ( return (
<MainWrapper> <MainWrapper>
<MatchPopup />
<MediaQuery minDevice='laptop'> <MediaQuery minDevice='laptop'>
<UserFavorites /> <UserFavorites />
</MediaQuery> </MediaQuery>
@ -36,3 +34,5 @@ export const TeamPage = () => {
</MainWrapper> </MainWrapper>
) )
} }
export default TeamPage

@ -6,12 +6,11 @@ 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 { MediaQuery } from 'features/MediaQuery' import { MediaQuery } from 'features/MediaQuery'
import { MatchPopup } from 'features/MatchPopup'
import { useTournamentPage } from './hooks' import { useTournamentPage } from './hooks'
import { Content } from './styled' import { Content } from './styled'
export const TournamentPage = () => { const TournamentPage = () => {
const { const {
fetchMatches, fetchMatches,
infoItems, infoItems,
@ -20,7 +19,6 @@ export const TournamentPage = () => {
return ( return (
<MainWrapper> <MainWrapper>
<MatchPopup />
<MediaQuery minDevice='laptop'> <MediaQuery minDevice='laptop'>
<UserFavorites /> <UserFavorites />
</MediaQuery> </MediaQuery>
@ -36,3 +34,5 @@ export const TournamentPage = () => {
</MainWrapper> </MainWrapper>
) )
} }
export default TournamentPage

@ -93,7 +93,6 @@ export const PagePersonalInfo = () => {
onChange={updateFormValue(country)} onChange={updateFormValue(country)}
options={countries} options={countries}
onSelect={onCountrySelect} onSelect={onCountrySelect}
withArrow
withError={false} withError={false}
/> />
<Input <Input
@ -113,7 +112,6 @@ export const PagePersonalInfo = () => {
options={cities} options={cities}
onSelect={onCitySelect} onSelect={onCitySelect}
maxLength={500} maxLength={500}
withArrow
withError={false} withError={false}
/> />
<Input <Input

@ -20,7 +20,7 @@ import {
StyledLink, StyledLink,
} from './styled' } from './styled'
export const UserAccount = () => { const UserAccount = () => {
useLexicsConfig(userAccountLexics) useLexicsConfig(userAccountLexics)
return ( return (
@ -65,3 +65,5 @@ export const UserAccount = () => {
</UserAccountWrapper> </UserAccountWrapper>
) )
} }
export default UserAccount

@ -1,4 +1,4 @@
import { useEffect, useState } from 'react' import { useCallback, useState } from 'react'
import type { UserFavorites } from 'requests' import type { UserFavorites } from 'requests'
import { modifyUserFavorites, getUserFavorites } from 'requests' import { modifyUserFavorites, getUserFavorites } from 'requests'
@ -16,7 +16,7 @@ export const useUserFavorites = () => {
open, open,
} = useToggle() } = useToggle()
useEffect(() => { const fetchFavorites = useCallback(() => {
getUserFavorites().then(setUserFavorites) getUserFavorites().then(setUserFavorites)
}, []) }, [])
@ -27,6 +27,7 @@ export const useUserFavorites = () => {
return { return {
addRemoveFavorite, addRemoveFavorite,
close, close,
fetchFavorites,
isOpen, isOpen,
open, open,
userFavorites, userFavorites,

@ -1,5 +1,6 @@
import type { MouseEvent, FocusEvent } from 'react' import type { MouseEvent, FocusEvent } from 'react'
import { useState } from 'react' import { useEffect, useState } from 'react'
import { Link } from 'react-router-dom' import { Link } from 'react-router-dom'
import map from 'lodash/map' import map from 'lodash/map'
@ -30,12 +31,15 @@ export const UserFavorites = () => {
const { const {
addRemoveFavorite, addRemoveFavorite,
close, close,
fetchFavorites,
isOpen, isOpen,
userFavorites, userFavorites,
} = useUserFavoritesStore() } = useUserFavoritesStore()
const [position, setPosition] = useState<number | null>(null) const [position, setPosition] = useState<number | null>(null)
useEffect(fetchFavorites, [fetchFavorites])
const getPosition = (event: MouseEvent<HTMLDivElement> | FocusEvent<HTMLDivElement>) => { const getPosition = (event: MouseEvent<HTMLDivElement> | FocusEvent<HTMLDivElement>) => {
if (event.currentTarget) { if (event.currentTarget) {
setPosition(event.currentTarget.getBoundingClientRect().top) setPosition(event.currentTarget.getBoundingClientRect().top)

Loading…
Cancel
Save