You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
spa_instat_tv/src/features/PreferencesPopup/store/hooks/useTournaments.tsx

75 lines
2.1 KiB

import {
useMemo,
useState,
useCallback,
useEffect,
} from 'react'
import includes from 'lodash/includes'
import isEmpty from 'lodash/isEmpty'
import filter from 'lodash/filter'
import remove from 'lodash/remove'
import every from 'lodash/every'
import find from 'lodash/find'
import map from 'lodash/map'
import type { Tournament, Tournaments } from 'requests/getSportTournaments'
import type { UserPreferences } from 'requests/getUserPreferences'
export const useSelectedTournaments = (
selectedSports: Array<number>,
tournaments: Tournaments,
) => {
const [selectedTournaments, setSelectedTournaments] = useState<UserPreferences>([])
const isTournamentSelected = useCallback(({ id, sport }: Tournament) => (
Boolean(find(
selectedTournaments,
{ sport, tournament_id: id },
))
), [selectedTournaments])
const onTournamentSelect = useCallback((tournament: Tournament) => {
const preference = { sport: tournament.sport, tournament_id: tournament.id }
if (isTournamentSelected(tournament)) {
remove(selectedTournaments, preference)
setSelectedTournaments([...selectedTournaments])
} else {
setSelectedTournaments([...selectedTournaments, preference])
}
}, [isTournamentSelected, selectedTournaments])
const allTournamentsSelected = useMemo(
() => {
if (isEmpty(tournaments)) return false
return every(tournaments, isTournamentSelected)
},
[isTournamentSelected, tournaments],
)
const onSelectAllTournaments = () => {
const newSelectedTournaments = allTournamentsSelected
? []
: map(
tournaments,
({ id, sport }) => ({ sport, tournament_id: id }),
)
setSelectedTournaments(newSelectedTournaments)
}
useEffect(() => {
setSelectedTournaments((oldTournaments) => (
filter(oldTournaments, ({ sport }) => includes(selectedSports, sport))
))
}, [selectedSports])
return {
allTournamentsSelected,
isTournamentSelected,
onSelectAllTournaments,
onTournamentSelect,
selectedTournaments,
setInitialSelectedTournaments: setSelectedTournaments,
}
}