fix(ott-2710): test fixes

OTT-2710-match-filters
boyvanov 3 years ago
parent e72cc0f671
commit 5b7bd4b02e
  1. 8
      src/components/SelectFilter/styled.tsx
  2. 8
      src/features/HeaderFilters/store/hooks/index.tsx
  3. 88
      src/features/HeaderFilters/store/hooks/useMatchFilters.tsx
  4. 49
      src/features/HeaderMobile/index.tsx
  5. 6
      src/features/HomePage/Atoms/HomePageAtoms.tsx
  6. 24
      src/features/HomePage/components/Dropdown/helpers.tsx
  7. 92
      src/features/HomePage/components/Dropdown/index.tsx
  8. 3
      src/features/HomePage/components/Dropdown/types.tsx
  9. 59
      src/features/HomePage/components/HeaderFilters/index.tsx
  10. 13
      src/features/HomePage/components/HeaderFilters/styled.tsx
  11. 44
      src/features/HomePage/components/MatchesFilters/index.tsx
  12. 10
      src/features/HomePage/components/MatchesFilters/styled.tsx
  13. 3
      src/features/HomePage/components/MobileMatchesFilters/index.tsx
  14. 1
      src/features/HomePage/components/MobileMatchesFilters/styled.tsx
  15. 14
      src/features/HomePage/hooks.tsx
  16. 2
      src/features/TournamentList/components/CollapseTournament/index.tsx
  17. 15
      src/features/TournamentList/index.tsx
  18. 2
      src/requests/getMatches/getHomeMatches.tsx
  19. 1
      src/requests/getMatches/types.tsx

@ -4,14 +4,12 @@ import { isMobileDevice } from 'config/userAgent'
import { Icon } from 'features/Icon' import { Icon } from 'features/Icon'
export const ScSelectFilter = styled.div` export const ScSelectFilter = styled.div`
display: flex;
color: white; color: white;
font-size: 14px;
width: auto;
text-transform: uppercase; text-transform: uppercase;
font-weight: 700; font-weight: 700;
align-items: center; font-size: 18px;
cursor: pointer; line-height: 22px;
white-space: nowrap;
${isMobileDevice ${isMobileDevice
? css` ? css`

@ -35,6 +35,7 @@ export const useFilters = () => {
currentFilters, currentFilters,
filtersList, filtersList,
filtersSize, filtersSize,
getDropdownList,
handleSetFilters, handleSetFilters,
inputValue, inputValue,
isEmptyFilters, isEmptyFilters,
@ -50,6 +51,7 @@ export const useFilters = () => {
const [isShowTournament, setIsShowTournament] = useState(true) const [isShowTournament, setIsShowTournament] = useState(true)
const [selectTournament, setSelectTournament] = useState<TournamentType>() const [selectTournament, setSelectTournament] = useState<TournamentType>()
const [sportIds, setSportIds] = useState<any>() const [sportIds, setSportIds] = useState<any>()
const [isFiltersShown, setIsFiltersShown] = useState(true)
const isTodaySelected = isToday(selectedDate) const isTodaySelected = isToday(selectedDate)
const resetFilters = useCallback(() => { const resetFilters = useCallback(() => {
@ -93,9 +95,11 @@ export const useFilters = () => {
currentFilters, currentFilters,
filtersList, filtersList,
filtersSize, filtersSize,
getDropdownList,
handleSetFilters, handleSetFilters,
inputValue, inputValue,
isEmptyFilters, isEmptyFilters,
isFiltersShown,
isOpenList, isOpenList,
isShowTournament, isShowTournament,
isTodaySelected, isTodaySelected,
@ -109,6 +113,7 @@ export const useFilters = () => {
selectedLeague, selectedLeague,
selectedSport, selectedSport,
setFilters, setFilters,
setIsFiltersShown,
setIsShowTournament, setIsShowTournament,
setSelectTournament, setSelectTournament,
setSelectedDate, setSelectedDate,
@ -130,9 +135,11 @@ export const useFilters = () => {
currentFilters, currentFilters,
filtersList, filtersList,
filtersSize, filtersSize,
getDropdownList,
handleSetFilters, handleSetFilters,
inputValue, inputValue,
isEmptyFilters, isEmptyFilters,
isFiltersShown,
isOpenList, isOpenList,
isShowTournament, isShowTournament,
isTodaySelected, isTodaySelected,
@ -146,6 +153,7 @@ export const useFilters = () => {
selectedLeague, selectedLeague,
selectedSport, selectedSport,
setFilters, setFilters,
setIsFiltersShown,
setIsShowTournament, setIsShowTournament,
setSelectTournament, setSelectTournament,
setSelectedDate, setSelectedDate,

@ -7,17 +7,27 @@ import {
ChangeEvent, ChangeEvent,
} from 'react' } from 'react'
import every from 'lodash/every'
import some from 'lodash/some' import some from 'lodash/some'
import isNil from 'lodash/isNil' import isNil from 'lodash/isNil'
import includes from 'lodash/includes' import includes from 'lodash/includes'
import filter from 'lodash/filter' import filter from 'lodash/filter'
import isEmpty from 'lodash/isEmpty' import isEmpty from 'lodash/isEmpty'
import map from 'lodash/map'
import reduce from 'lodash/reduce' import reduce from 'lodash/reduce'
import size from 'lodash/size' import size from 'lodash/size'
import { format } from 'date-fns' import { format } from 'date-fns'
import {
getAge,
getArena,
getDivision,
getGender,
getMainTeam,
getRound,
getSport,
} from 'features/HomePage/components/Dropdown/helpers'
import { import {
getHomeMatches, getHomeMatches,
Match, Match,
@ -35,12 +45,7 @@ const getTimezoneOffset = (date: Date) => {
const getDate = (date: Date) => format(date, 'yyyy-MM-dd') const getDate = (date: Date) => format(date, 'yyyy-MM-dd')
export type TActiveFilters = { export type TActiveFilters = {
arena?: Array<TDefaultType>, [key: string]: Array<number>,
division?: Array<TDefaultType>,
gender?: Array<TDefaultType>,
main_team?: Array<TDefaultType>,
round?: Array<TDefaultType>,
youth_age?: Array<number>,
} }
export type TDefaultType = { export type TDefaultType = {
id: number, id: number,
@ -49,7 +54,7 @@ export type TDefaultType = {
} }
export const useMatchFilters = (selectedDate: Date) => { export const useMatchFilters = (selectedDate: Date) => {
const [filtersList, setFiltersList] = useState<Array<Match>>() const [filtersList, setFiltersList] = useState<Array<Match>>([])
const [isOpenList, setOpenList] = useState<string>('') const [isOpenList, setOpenList] = useState<string>('')
const [activeFilters, setActiveFilters] = useState<TActiveFilters>({}) const [activeFilters, setActiveFilters] = useState<TActiveFilters>({})
const [inputValue, setInputValue] = useState<string>('') const [inputValue, setInputValue] = useState<string>('')
@ -81,8 +86,30 @@ export const useMatchFilters = (selectedDate: Date) => {
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [selectedDate]) }, [selectedDate])
const currentFilters = useMemo(() => { const getDropdownList = (filterName: string, queryString: string) => {
switch (filterName) {
case 'gender':
return getGender(filtersList)
case 'youth_age':
return getAge(filtersList)
case 'division':
return getDivision(filtersList)
case 'main_team':
return getMainTeam(filtersList)
case 'arena':
return getArena(filtersList, queryString)
case 'round':
return getRound(filtersList)
case 'sport':
return getSport(filtersList)
default:
return []
}
}
const filters = useMemo(() => {
const arr = [] const arr = []
if (some(filtersList, (item) => !isNil(item.sport))) arr.push('sport')
if (some(filtersList, (item) => !isNil(item.arena?.id))) arr.push('arena') if (some(filtersList, (item) => !isNil(item.arena?.id))) arr.push('arena')
if (some(filtersList, (item) => !isNil(item.round?.id))) arr.push('round') if (some(filtersList, (item) => !isNil(item.round?.id))) arr.push('round')
if (some(filtersList, (item) => !isNil(item.team1?.main_team) || !isNil(item.team2?.main_team))) arr.push('main_team') if (some(filtersList, (item) => !isNil(item.team1?.main_team) || !isNil(item.team2?.main_team))) arr.push('main_team')
@ -92,15 +119,19 @@ export const useMatchFilters = (selectedDate: Date) => {
return arr return arr
}, [filtersList]) }, [filtersList])
const handleSetFilters = (filterName: string, value: any) => { const filtersWitnMoreThenOneValue = filter(filters, (filterName) => (
const isFilterPresent = !isNil(activeFilters[filterName as keyof typeof activeFilters]) getDropdownList(filterName, '').length > 1
))
const handleSetFilters = (filterName: string, value: number) => {
const activeFilter = activeFilters[filterName as keyof typeof activeFilters]
const isFilterPresent = !isNil(activeFilter)
if (isFilterPresent) { if (isFilterPresent) {
const isValuePresent = includes( const isValuePresent = includes(activeFilter, value)
activeFilters[filterName as keyof typeof activeFilters], value,
)
const currentValue = isValuePresent const currentValue = isValuePresent
? filter(activeFilters[filterName as keyof typeof activeFilters], (item) => item !== value) ? filter(activeFilter, (item) => item !== value)
: [...activeFilters[filterName as keyof typeof activeFilters]!, value] : [...activeFilter, value]
return setActiveFilters({ return setActiveFilters({
...activeFilters, ...activeFilters,
@ -127,20 +158,20 @@ export const useMatchFilters = (selectedDate: Date) => {
setActiveFilters({}) setActiveFilters({})
} }
const isEmptyFilters = some(activeFilters, (filterItem) => isEmpty(filterItem)) const isEmptyFilters = every(activeFilters, (filterItem) => isEmpty(filterItem))
|| isEmpty(activeFilters)
const queryParams: TQueryParams = useMemo(() => { const queryParams: TQueryParams = useMemo(() => {
const params = { const params = {
arena: map(activeFilters.arena, (item) => item.id), arena: activeFilters.arena,
division: map(activeFilters.division, (item) => item.id), division: activeFilters.division,
gender: map(activeFilters.gender, (item) => item.id), gender: activeFilters.gender,
main_team: map(activeFilters.main_team, (item) => item.id), main_team: activeFilters.main_team,
round: map(activeFilters.round, (item) => item.id), round: activeFilters.round,
sport: activeFilters.sport,
youth_age: activeFilters.youth_age, youth_age: activeFilters.youth_age,
} }
return (params) return params
}, [activeFilters]) }, [activeFilters])
const changeInput = (e: ChangeEvent<HTMLInputElement>) => { const changeInput = (e: ChangeEvent<HTMLInputElement>) => {
@ -162,8 +193,10 @@ export const useMatchFilters = (selectedDate: Date) => {
} }
const filtersSize = reduce(activeFilters, const filtersSize = reduce(activeFilters,
(result, (
value) => result + size(value), 0) result,
value,
) => result + size(value), 0)
return { return {
activeFilters, activeFilters,
@ -174,9 +207,10 @@ export const useMatchFilters = (selectedDate: Date) => {
clickClearAll, clickClearAll,
closeDropdownList, closeDropdownList,
confirmClear, confirmClear,
currentFilters, currentFilters: filtersWitnMoreThenOneValue,
filtersList, filtersList,
filtersSize, filtersSize,
getDropdownList,
handleSetFilters, handleSetFilters,
inputValue, inputValue,
isEmptyFilters, isEmptyFilters,

@ -1,13 +1,9 @@
import { useRecoilValue } from 'recoil'
import { isIOS } from 'config/userAgent' import { isIOS } from 'config/userAgent'
import { isLffClient } from 'config/clients' import { isInSportsClient } from 'config/clients'
import { HeaderMenu } from 'features/HeaderMenu' import { HeaderMenu } from 'features/HeaderMenu'
import { DateFilter } from 'features/HeaderFilters' import { DateFilter } from 'features/HeaderFilters'
import { ScoreSwitch } from 'features/MatchSwitches' import { ScoreSwitch } from 'features/MatchSwitches'
import { SportsFilter } from 'features/SportsFilter'
import { isSportFilterShownAtom } from 'features/HomePage/Atoms/HomePageAtoms'
import { SmartBanner } from 'components/SmartBanner' import { SmartBanner } from 'components/SmartBanner'
import { MobileMatchesFilters } from 'features/HomePage/components/MobileMatchesFilters' import { MobileMatchesFilters } from 'features/HomePage/components/MobileMatchesFilters'
@ -22,31 +18,22 @@ type HeaderBannerProps = {
setIsOpenDownload: (open: boolean) => void, setIsOpenDownload: (open: boolean) => void,
} }
export const HeaderMobile = ({ isOpenDownload, setIsOpenDownload }: HeaderBannerProps) => { export const HeaderMobile = ({ isOpenDownload, setIsOpenDownload }: HeaderBannerProps) => (
const isSportFilterShown = useRecoilValue(isSportFilterShownAtom) <>
{
return ( isOpenDownload
<>
{
isOpenDownload
&& !isIOS && !isIOS
&& <SmartBanner setIsOpenDownload={setIsOpenDownload} /> && <SmartBanner setIsOpenDownload={setIsOpenDownload} />
} }
<HeaderStyled> <HeaderStyled>
<HeaderMenu /> <HeaderMenu />
<DateFilter /> <DateFilter />
<ScSportsWrapper> <ScSportsWrapper>
{!isLffClient && isSportFilterShown ? ( {isInSportsClient && <MobileMatchesFilters />}
<> <ScoreSwitchWrapper>
<SportsFilter /> <ScoreSwitch />
<MobileMatchesFilters /> </ScoreSwitchWrapper>
</> </ScSportsWrapper>
) : null} </HeaderStyled>
<ScoreSwitchWrapper> </>
<ScoreSwitch /> )
</ScoreSwitchWrapper>
</ScSportsWrapper>
</HeaderStyled>
</>
)
}

@ -1,6 +0,0 @@
import { atom } from 'recoil'
export const isSportFilterShownAtom = atom({
default: true,
key: 'isSportFilterShownAtom',
})

@ -2,6 +2,7 @@ import map from 'lodash/map'
import some from 'lodash/some' import some from 'lodash/some'
import filter from 'lodash/filter' import filter from 'lodash/filter'
import uniq from 'lodash/uniq' import uniq from 'lodash/uniq'
import uniqBy from 'lodash/uniqBy'
import flatten from 'lodash/flatten' import flatten from 'lodash/flatten'
import compact from 'lodash/compact' import compact from 'lodash/compact'
import startsWith from 'lodash/startsWith' import startsWith from 'lodash/startsWith'
@ -12,6 +13,7 @@ import { Match } from 'requests'
const checkStartString = (text: string, searchString: string) => startsWith( const checkStartString = (text: string, searchString: string) => startsWith(
toLower(text), toLower(searchString), toLower(text), toLower(searchString),
) )
export const getAge = (filterList: Array<Match>) => compact( export const getAge = (filterList: Array<Match>) => compact(
uniq( uniq(
flatten( flatten(
@ -46,17 +48,27 @@ export const getArena = (filterList: Array<Match>, inputValue: string) => filter
|| checkStartString(item.name_rus, inputValue)), || checkStartString(item.name_rus, inputValue)),
) )
export const getRound = (filterList: Array<Match>) => filter( export const getSport = (filterList: Array<Match>) => uniqBy(
map( filter(
filterList, (item) => item.round, map(
), (item) => item?.id, filterList, (item) => item.sport_info,
), (item) => item?.id,
), 'id',
)
export const getRound = (filterList: Array<Match>) => uniqBy(
filter(
map(
filterList, (item) => item.round,
), (item) => item?.id,
), 'id',
) )
export const getGender = (filterList: Array<Match>) => { export const getGender = (filterList: Array<Match>) => {
const list = [] const list = []
if (some(filterList, (item) => item.team1.gender === 1 || item.team2.gender === 1)) list.push({ id: 1, title: 'gender_male_long' }) if (some(filterList, (item) => item.team1.gender === 1 || item.team2.gender === 1)) list.push({ id: 1, lexic: 'gender_male_long' })
if (some(filterList, (item) => item.team1.gender === 2 || item.team2.gender === 2)) list.push({ id: 2, title: 'gender_female_long' }) if (some(filterList, (item) => item.team1.gender === 2 || item.team2.gender === 2)) list.push({ id: 2, lexic: 'gender_female_long' })
return list return list
} }

@ -1,22 +1,17 @@
import React, { useMemo } from 'react' import { ChangeEvent, MouseEvent } from 'react'
import map from 'lodash/map' import map from 'lodash/map'
import isEmpty from 'lodash/isEmpty' import isEmpty from 'lodash/isEmpty'
import includes from 'lodash/includes' import includes from 'lodash/includes'
import isNumber from 'lodash/isNumber'
import { T9n } from 'features/T9n' import { T9n } from 'features/T9n'
import { Name } from 'features/Name' import { Name } from 'features/Name'
import { useLexicsStore } from 'features/LexicsStore' import { useLexicsStore } from 'features/LexicsStore'
import { useHeaderFiltersStore } from 'features/HeaderFilters'
import { isMobileDevice } from 'config/userAgent' import { isMobileDevice } from 'config/userAgent'
import {
getAge,
getArena,
getDivision,
getGender,
getMainTeam,
getRound,
} from './helpers'
import { import {
TDropDownProps, TDropDownProps,
TFilterItem, TFilterItem,
@ -35,46 +30,23 @@ import {
BackButton, BackButton,
} from './styled' } from './styled'
const Label = ({ item }: TFilterItem) => { const Label = ({ item }: TFilterItem) => (
const isNumber = typeof item === 'number' isNumber(item) ? <>U{item}</> : <Name nameObj={item} />
)
return (
<>
{isNumber ? (<>U{item}</>) : (<Name nameObj={item} />)}
</>
)
}
export const DropDown = ({ export const DropDown = ({
activeFilters, activeFilters,
changeInput, changeInput,
clearFilters, clearFilters,
closeDropdownList, closeDropdownList,
filterList,
filterTitle, filterTitle,
inputValue, inputValue,
setFilters, setFilters,
}: TDropDownProps) => { }: TDropDownProps) => {
const { translate } = useLexicsStore() const { translate } = useLexicsStore()
const { getDropdownList } = useHeaderFiltersStore()
const dropDownList = useMemo(() => { const dropdownList = getDropdownList(filterTitle, inputValue) as Array<TItem | number>
switch (filterTitle) {
case 'gender':
return getGender(filterList)
case 'youth_age':
return getAge(filterList)
case 'division':
return getDivision(filterList)
case 'main_team':
return getMainTeam(filterList)
case 'arena':
return getArena(filterList, inputValue)
case 'round':
return getRound(filterList)
default:
return []
}
}, [filterTitle, filterList, inputValue]) as Array<TItem> | Array<any>
const currentActiveFilter = activeFilters[filterTitle as keyof typeof activeFilters] const currentActiveFilter = activeFilters[filterTitle as keyof typeof activeFilters]
@ -115,45 +87,37 @@ export const DropDown = ({
</ClearButtonContainer> </ClearButtonContainer>
</CommonButtonsBlock> </CommonButtonsBlock>
{!isEmpty(dropDownList) && map(dropDownList, (filterItem, i) => ( {map(dropdownList, (filterItem) => {
<> const filterValue = isNumber(filterItem) ? filterItem : filterItem.id
const handleClick = (e: ChangeEvent | MouseEvent) => {
e.preventDefault()
e.stopPropagation()
setFilters(filterTitle, filterValue)
}
return (
<FilterItem <FilterItem
key={i} key={filterValue}
onClick={(e) => { onClick={handleClick}
e.preventDefault()
e.stopPropagation()
setFilters(filterTitle, filterItem)
}}
> >
{filterTitle === 'gender' {includes(['gender', 'sport'], filterTitle)
? ( ? (
<Checkbox <Checkbox
checked={includes(currentActiveFilter, checked={includes(currentActiveFilter, filterValue)}
filterItem || filterItem.name_eng onChange={handleClick}
|| filterItem.name_rus)} labelLexic={!isNumber(filterItem) ? filterItem.lexic : ''}
onChange={(e) => {
e.preventDefault()
e.stopPropagation()
setFilters(filterTitle, filterItem)
}}
labelLexic={filterItem.title}
/> />
) )
: ( : (
<Checkbox <Checkbox
checked={includes(currentActiveFilter, checked={includes(currentActiveFilter, filterValue)}
filterItem || filterItem.name_eng || filterItem.name_rus)} onChange={handleClick}
onChange={(e) => {
e.preventDefault()
e.stopPropagation()
setFilters(filterTitle, filterItem)
}}
label={(<Label item={filterItem} />)} label={(<Label item={filterItem} />)}
/> />
)} )}
</FilterItem> </FilterItem>
</> )
))} })}
</FiltersList> </FiltersList>
</DropDownContainer> </DropDownContainer>
) )

@ -1,5 +1,4 @@
import { MouseEvent, ChangeEvent } from 'react' import { MouseEvent, ChangeEvent } from 'react'
import { Match } from 'requests'
import { TActiveFilters } from 'features/HeaderFilters/store/hooks/useMatchFilters' import { TActiveFilters } from 'features/HeaderFilters/store/hooks/useMatchFilters'
export type TDropDownProps = { export type TDropDownProps = {
@ -7,7 +6,6 @@ export type TDropDownProps = {
changeInput: (e: ChangeEvent<HTMLInputElement>) => void, changeInput: (e: ChangeEvent<HTMLInputElement>) => void,
clearFilters: (filterName: string) => (e: MouseEvent | ChangeEvent<HTMLInputElement>) => void, clearFilters: (filterName: string) => (e: MouseEvent | ChangeEvent<HTMLInputElement>) => void,
closeDropdownList?: () => void, closeDropdownList?: () => void,
filterList: Array<Match>,
filterTitle: string, filterTitle: string,
inputValue: string, inputValue: string,
setFilters: (filterName: string, value: number) => void, setFilters: (filterName: string, value: number) => void,
@ -15,6 +13,7 @@ export type TDropDownProps = {
export type TItem = { export type TItem = {
id: number, id: number,
lexic?: string,
name_eng: string, name_eng: string,
name_rus: string, name_rus: string,
} }

@ -1,8 +1,5 @@
import { useRecoilValue } from 'recoil' import { isInSportsClient } from 'config/clients'
import { isLffClient, isInSportsClient } from 'config/clients'
import { SportsFilter } from 'features/SportsFilter'
import { SelectFilter } from 'components/SelectFilter' import { SelectFilter } from 'components/SelectFilter'
import { useHeaderFiltersStore } from 'features/HeaderFilters' import { useHeaderFiltersStore } from 'features/HeaderFilters'
import { T9n } from 'features/T9n' import { T9n } from 'features/T9n'
@ -15,10 +12,8 @@ import { ModalWindow } from 'features/Modal/styled'
import { import {
ScArrow, ScArrow,
ScHeaderFilters, ScHeaderFilters,
ScFilterItemsWrap, SelectFilterWrapper,
ScFilterItem,
} from './styled' } from './styled'
import { isSportFilterShownAtom } from '../../Atoms/HomePageAtoms'
import { ClearFiltersPopup } from '../ClearFiltersPopup' import { ClearFiltersPopup } from '../ClearFiltersPopup'
import { MatchesFilters } from '../MatchesFilters' import { MatchesFilters } from '../MatchesFilters'
@ -32,8 +27,8 @@ export const Modal = styled(BaseModal)`
const ClearButton = styled.span` const ClearButton = styled.span`
cursor: pointer; cursor: pointer;
position: absolute; position: absolute;
left: 5px; left: 36px;
top: 38px; top: 30px;
font-style: normal; font-style: normal;
font-weight: 400; font-weight: 400;
font-size: 18px; font-size: 18px;
@ -46,81 +41,45 @@ export const HeaderFilters = () => {
const { const {
clickClearAll, clickClearAll,
isEmptyFilters, isEmptyFilters,
isFiltersShown,
isShowTournament, isShowTournament,
selectedFilters,
selectTournament, selectTournament,
setIsShowTournament, setIsShowTournament,
setSelectedFilters,
setSelectedLeague, setSelectedLeague,
} = useHeaderFiltersStore() } = useHeaderFiltersStore()
const isSportFilterShown = useRecoilValue(isSportFilterShownAtom)
const isActiveFilter = (filterItem: string) => selectedFilters.indexOf(filterItem) >= 0
const checkFilter = (item: string) => {
isActiveFilter(item)
? setSelectedFilters((prev) => prev.filter((check) => item !== check))
: setSelectedFilters([...selectedFilters, item])
}
const handleClickBack = () => { const handleClickBack = () => {
setIsShowTournament(true) setIsShowTournament(true)
setSelectedFilters([])
setSelectedLeague(['all_competitions']) setSelectedLeague(['all_competitions'])
} }
return ( return (
<ScHeaderFilters> <ScHeaderFilters>
{!isShowTournament && ( {!isShowTournament && (
<> <SelectFilterWrapper onClick={handleClickBack}>
<ScArrow <ScArrow
refIcon='Arrow' refIcon='Arrow'
color='#ffffff' color='#ffffff'
direction={90} direction={90}
onClick={() => handleClickBack()}
/> />
<SelectFilter <SelectFilter
open={false} open={false}
selectItem={selectTournament} selectItem={selectTournament}
withArrow={false} withArrow={false}
/> />
</> </SelectFilterWrapper>
)} )}
{!isLffClient && isShowTournament && isSportFilterShown && <SportsFilter />}
{!isEmptyFilters && ( {!isEmptyFilters && (
<ClearButton onClick={clickClearAll}> <ClearButton onClick={clickClearAll}>
<T9n t='clear' /> <T9n t='clear' />
</ClearButton> </ClearButton>
)} )}
{!isLffClient && ( {isInSportsClient && isFiltersShown && (
<> <>
<MatchesFilters /> <MatchesFilters />
<ClearFiltersPopup /> <ClearFiltersPopup />
</> </>
)} )}
{isShowTournament && !isInSportsClient && (
<ScFilterItemsWrap>
<ScFilterItem
className={isActiveFilter('live') ? 'activeLive' : ''}
onClick={() => checkFilter('live')}
>
<T9n t='live' />
</ScFilterItem>
<ScFilterItem
className={isActiveFilter('upcoming') ? 'activeButton' : ''}
onClick={() => checkFilter('upcoming')}
>
<T9n t='upcoming' />
</ScFilterItem>
<ScFilterItem
className={isActiveFilter('completed') ? 'activeButton' : ''}
onClick={() => checkFilter('completed')}
>
<T9n t='completed' />
</ScFilterItem>
</ScFilterItemsWrap>
)}
</ScHeaderFilters> </ScHeaderFilters>
) )
} }

@ -19,6 +19,12 @@ export const ScHeaderFilters = styled.div`
} }
` `
export const SelectFilterWrapper = styled.div`
display: flex;
align-items: center;
cursor: pointer;
`
export const ScFilterItemsWrap = styled.div` export const ScFilterItemsWrap = styled.div`
display: flex; display: flex;
flex-direction: row; flex-direction: row;
@ -45,7 +51,12 @@ export const ScFilterItem = styled.div<Props>`
export const ScArrow = styled(Icon)` export const ScArrow = styled(Icon)`
margin-right: 15px; margin-right: 15px;
cursor: pointer; height: 20px;
svg {
width: 20px;
height: 12px;
}
:hover { :hover {
/* background-color: rgba(255, 255, 255, 0.5);; */ /* background-color: rgba(255, 255, 255, 0.5);; */

@ -1,12 +1,13 @@
import React from 'react'
import map from 'lodash/map' import map from 'lodash/map'
import isNil from 'lodash/isNil' import isNil from 'lodash/isNil'
import size from 'lodash/size' import size from 'lodash/size'
import find from 'lodash/find'
import includes from 'lodash/includes'
import { useName } from 'features/Name' import { useName } from 'features/Name'
import { T9n } from 'features/T9n' import { T9n } from 'features/T9n'
import { useHeaderFiltersStore } from 'features/HeaderFilters' import { useHeaderFiltersStore } from 'features/HeaderFilters'
import { isMobileDevice } from 'config/userAgent' import { isMobileDevice } from 'config/userAgent'
import { import {
@ -18,16 +19,25 @@ import {
CloseButton, CloseButton,
} from './styled' } from './styled'
import { DropDown } from '../Dropdown' import { DropDown } from '../Dropdown'
import { TItem } from '../Dropdown/types'
import { checkSize, truncateString } from './helpers' import { checkSize, truncateString } from './helpers'
type TProps = { type TProps = {
dropdownList: Array<TItem | number>,
filterTitle: string, filterTitle: string,
item: any, item: number,
} }
const ActiveFilterText = ({ filterTitle, item }: TProps) => { const ActiveFilterText = ({
const name = useName(item) dropdownList,
if (filterTitle === 'gender') return (<T9n t={item.title} />) filterTitle,
item,
}: TProps) => {
const currentItem = find(dropdownList, { id: item }) as TItem
const name = useName(currentItem)
if (includes(['gender', 'sport'], filterTitle)) return <T9n t={currentItem.lexic!} />
return ( return (
<> <>
{truncateString(name)} {truncateString(name)}
@ -46,6 +56,7 @@ export const MatchesFilters = ({ isMobile }: TFiltersProps) => {
currentFilters, currentFilters,
filtersList, filtersList,
filtersSize, filtersSize,
getDropdownList,
handleSetFilters, handleSetFilters,
inputValue, inputValue,
isOpenList, isOpenList,
@ -54,7 +65,7 @@ export const MatchesFilters = ({ isMobile }: TFiltersProps) => {
return ( return (
<MatchFiltersContainer> <MatchFiltersContainer>
{map(currentFilters, (filterTitle, index) => { {map(currentFilters, (filterTitle) => {
const currentActiveFilters = activeFilters[filterTitle as keyof typeof activeFilters] const currentActiveFilters = activeFilters[filterTitle as keyof typeof activeFilters]
const isShrinkFilters = filtersSize >= 7 || size(currentActiveFilters) >= 7 const isShrinkFilters = filtersSize >= 7 || size(currentActiveFilters) >= 7
@ -64,20 +75,28 @@ export const MatchesFilters = ({ isMobile }: TFiltersProps) => {
? [currentActiveFilters[0], currentActiveFilters[1]] ? [currentActiveFilters[0], currentActiveFilters[1]]
: currentActiveFilters : currentActiveFilters
const dropdownList = getDropdownList(filterTitle, inputValue) as Array<TItem | number>
return ( return (
<FilterContainer <FilterContainer
active={isOpenList === filterTitle} active={isOpenList === filterTitle}
key={index} key={filterTitle}
onClick={openDropdownList(filterTitle)} onClick={openDropdownList(filterTitle)}
> >
{/* <T9n className='filter_title' t={filterTitle} /> */} {/* <T9n className='filter_title' t={filterTitle} /> */}
<span className='filter_title'>{filterTitle}</span> <span className='filter_title'>{filterTitle}</span>
<ActiveFilters> <ActiveFilters>
{map(shrinkedActiveFilters, (item, i) => ( {map(shrinkedActiveFilters, (item) => (
<ActiveFilter key={i}> <ActiveFilter key={item}>
{typeof item === 'number' {filterTitle === 'youth_age'
? `U${item}` ? `U${item}`
: (<ActiveFilterText filterTitle={filterTitle} item={item} />)} : (
<ActiveFilterText
dropdownList={dropdownList}
filterTitle={filterTitle}
item={item}
/>
)}
<CloseButton onClick={(e) => { <CloseButton onClick={(e) => {
e.stopPropagation() e.stopPropagation()
handleSetFilters(filterTitle, item) handleSetFilters(filterTitle, item)
@ -100,7 +119,6 @@ export const MatchesFilters = ({ isMobile }: TFiltersProps) => {
activeFilters={activeFilters} activeFilters={activeFilters}
setFilters={handleSetFilters} setFilters={handleSetFilters}
filterTitle={filterTitle} filterTitle={filterTitle}
filterList={filtersList}
/> />
)} )}
</FilterContainer> </FilterContainer>

@ -18,7 +18,7 @@ ${isMobileDevice
: css` : css`
gap: 30px; gap: 30px;
flex-direction: row; flex-direction: row;
padding-right: 25px; padding-right: 10px;
`} `}
` `
@ -100,12 +100,10 @@ ${({ active }) => active && !isMobileDevice && css`
left: 0; left: 0;
width: 20px; width: 20px;
`} `}
} }
span { span {
${({ active }) => (active && css` ${({ active }) => (active && css`
z-index:12; z-index: 12;
position: relative; position: relative;
`)} `)}
} }
@ -158,12 +156,12 @@ ${isMobileDevice
:hover { :hover {
background: #ffff; background: #ffff;
color: #000000; color: #000000;
${CloseButton} { ${CloseButton} {
background: url(/images/closeBlack.svg) no-repeat; background: url(/images/closeBlack.svg) no-repeat;
} }
}`} }`}
` `
export const FiltersCount = styled(ActiveFilter)`` export const FiltersCount = styled(ActiveFilter)``

@ -1,4 +1,4 @@
import React, { useState } from 'react' import { useState } from 'react'
import isEmpty from 'lodash/isEmpty' import isEmpty from 'lodash/isEmpty'
import isNil from 'lodash/isNil' import isNil from 'lodash/isNil'
@ -74,7 +74,6 @@ export const MobileMatchesFilters = () => {
activeFilters={activeFilters} activeFilters={activeFilters}
setFilters={handleSetFilters} setFilters={handleSetFilters}
filterTitle={isOpenList} filterTitle={isOpenList}
filterList={filtersList}
closeDropdownList={closeDropdownList} closeDropdownList={closeDropdownList}
/> />
)} )}

@ -38,7 +38,6 @@ text-transform: uppercase;
color: #FFFFFF; color: #FFFFFF;
padding-left: 22px; padding-left: 22px;
position: relative; position: relative;
margin-left: 20px;
:before{ :before{
content: ''; content: '';

@ -6,19 +6,12 @@ import {
import { format } from 'date-fns' import { format } from 'date-fns'
import { useSetRecoilState } from 'recoil'
import { client } from 'config/clients'
import { ClientNames } from 'config/clients/types'
import { useAuthStore } from 'features/AuthStore' import { useAuthStore } from 'features/AuthStore'
import { useHeaderFiltersStore } from 'features/HeaderFilters' import { useHeaderFiltersStore } from 'features/HeaderFilters'
import { getHomeMatches } from 'requests/getMatches' import { getHomeMatches } from 'requests/getMatches'
import { getAgreements, setAgreements } from 'requests/getAgreements' import { getAgreements, setAgreements } from 'requests/getAgreements'
import { isSportFilterShownAtom } from './Atoms/HomePageAtoms'
/** /**
* возвращает смещение в минутах относительно UTC * возвращает смещение в минутах относительно UTC
* *
@ -38,7 +31,6 @@ export const useHomePage = () => {
const { queryParams, selectedDate } = useHeaderFiltersStore() const { queryParams, selectedDate } = useHeaderFiltersStore()
const [isOpenDownload, setIsOpenDownload] = useState(false) const [isOpenDownload, setIsOpenDownload] = useState(false)
const [isShowConfirmPopup, setIsShowConfirmPopup] = useState(false) const [isShowConfirmPopup, setIsShowConfirmPopup] = useState(false)
const setIsSportFilterShown = useSetRecoilState(isSportFilterShownAtom)
const handleCloseConfirmPopup = useCallback(async () => { const handleCloseConfirmPopup = useCallback(async () => {
await setAgreements(user?.profile?.email || '') await setAgreements(user?.profile?.email || '')
@ -74,12 +66,6 @@ export const useHomePage = () => {
}, },
), [selectedDate, queryParams]) ), [selectedDate, queryParams])
useEffect(() => {
if (client.name === ClientNames.Facr) {
setIsSportFilterShown(false)
}
}, [setIsSportFilterShown])
return { return {
fetchMatches, fetchMatches,
handleCloseConfirmPopup, handleCloseConfirmPopup,

@ -33,6 +33,7 @@ export const CollapseTournament = ({
tournamentMatches, tournamentMatches,
}: TournamentProps) => { }: TournamentProps) => {
const { const {
setIsFiltersShown,
setIsShowTournament, setIsShowTournament,
setSelectedLeague, setSelectedLeague,
setSelectTournament, setSelectTournament,
@ -45,6 +46,7 @@ export const CollapseTournament = ({
} = tournament } = tournament
const handleClick = () => { const handleClick = () => {
setIsFiltersShown(true)
setIsShowTournament(false) setIsShowTournament(false)
setSelectedLeague([tournament.id]) setSelectedLeague([tournament.id])
setSelectTournament(tournament) setSelectTournament(tournament)

@ -1,7 +1,9 @@
import { useEffect } from 'react'
import { useRouteMatch } from 'react-router-dom' import { useRouteMatch } from 'react-router-dom'
import type { Match } from 'features/Matches' import type { Match } from 'features/Matches'
import { MatchCard } from 'features/MatchCard' import { MatchCard } from 'features/MatchCard'
import { useHeaderFiltersStore } from 'features/HeaderFilters'
import type { TournamentType } from 'requests/getMatches/types' import type { TournamentType } from 'requests/getMatches/types'
@ -33,6 +35,19 @@ export type TournamentListProps = {
export const TournamentList = ({ matches }: TournamentTypeProps) => { export const TournamentList = ({ matches }: TournamentTypeProps) => {
const { tournaments, tournamentSort } = useTournaments(matches) const { tournaments, tournamentSort } = useTournaments(matches)
const isHomePage = useRouteMatch(PAGES.home)?.isExact const isHomePage = useRouteMatch(PAGES.home)?.isExact
const { setIsFiltersShown } = useHeaderFiltersStore()
useEffect(() => {
if (isHomePage && matches.length >= 12) {
setIsFiltersShown(false)
} else {
setIsFiltersShown(true)
}
}, [
isHomePage,
matches.length,
setIsFiltersShown,
])
switch (true) { switch (true) {
case isMobileDevice && isHomePage: case isMobileDevice && isHomePage:

@ -15,6 +15,7 @@ export type TQueryParams = {
gender?: Array<number>, gender?: Array<number>,
main_team?: Array<number>, main_team?: Array<number>,
round?: Array<number>, round?: Array<number>,
sport?: Array<number>,
youth_age?: Array<number>, youth_age?: Array<number>,
} }
@ -45,6 +46,7 @@ export const getHomeMatches = async ({
main_team: !isEmpty(queryParams?.main_team) ? queryParams?.main_team : undefined, main_team: !isEmpty(queryParams?.main_team) ? queryParams?.main_team : undefined,
offset: String(offset), offset: String(offset),
round: !isEmpty(queryParams?.round) ? queryParams?.round : undefined, round: !isEmpty(queryParams?.round) ? queryParams?.round : undefined,
sport: !isEmpty(queryParams?.sport) ? queryParams?.sport : undefined,
youth_age: !isEmpty(queryParams?.youth_age) ? queryParams?.youth_age : undefined, youth_age: !isEmpty(queryParams?.youth_age) ? queryParams?.youth_age : undefined,
...client.requests?.[proc], ...client.requests?.[proc],
}, },

@ -12,6 +12,7 @@ export type TDefaultType = {
name_eng: string, name_eng: string,
name_rus: string, name_rus: string,
} }
type Team = { type Team = {
division?: TDefaultType, // Дивизион division?: TDefaultType, // Дивизион
gender?: number, // ИД пола gender?: number, // ИД пола

Loading…
Cancel
Save