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