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/MatchPopup/store/hooks/index.tsx

121 lines
2.8 KiB

import {
useState,
useEffect,
} from 'react'
import isEmpty from 'lodash/isEmpty'
import { getMatchPlaylists } from 'requests'
import { buildPlaylists } from 'features/MatchPage/helpers/buildPlaylists'
import { Playlists } from 'features/MatchPage/types'
import { useSettingsState } from './useSettingsState'
import { useSportActions } from './useSportActions'
import { usePopupNavigation } from './usePopupNavigation'
import type { MatchData } from '../../types'
import { PopupPages, PlayerPlaylistFormats } from '../../types'
import { usePlayerClickHandler } from './usePlayerClickHandler'
import { usePlaylistLexics } from './usePlaylistLexics'
export const useMatchPopup = () => {
const [match, setMatch] = useState<MatchData>(null)
const [matchPlaylists, setMatchPlaylists] = useState<Playlists | null>(null)
const {
closePopup,
goBack,
goTo,
isOpen,
openPopup,
page,
} = usePopupNavigation()
const {
setEpisodeDuration,
setSelectedActions,
setSelectedPlaylistFormat,
settings,
} = useSettingsState(match?.sportType)
const {
episodeDuration,
selectedActions,
selectedFormat: selectedPlaylistFormat,
} = settings
const { actions, fetchSportActions } = useSportActions(match?.sportType)
const { fetchLexics } = usePlaylistLexics()
useEffect(() => {
if (selectedPlaylistFormat === PlayerPlaylistFormats.SELECTED_ACTIONS) {
fetchSportActions()
} else {
setSelectedActions([])
}
}, [
selectedPlaylistFormat,
fetchSportActions,
setSelectedActions,
])
useEffect(() => {
if (!isOpen) {
setMatch(null)
setMatchPlaylists(null)
}
}, [isOpen])
useEffect(() => {
const isPlaylistPage = page === PopupPages.PLAYLIST
const actionsFormatSelected = (
selectedPlaylistFormat === PlayerPlaylistFormats.SELECTED_ACTIONS
)
if (isPlaylistPage && actionsFormatSelected && isEmpty(selectedActions)) {
setSelectedPlaylistFormat(PlayerPlaylistFormats.ALL_MATCH_TIME)
}
}, [
selectedActions,
selectedPlaylistFormat,
page,
setSelectedPlaylistFormat,
])
useEffect(() => {
if (!match) return
getMatchPlaylists({
matchId: match.id,
selectedActions: [],
sportType: match.sportType,
}).then(fetchLexics)
.then(buildPlaylists)
.then(setMatchPlaylists)
}, [match, fetchLexics])
return {
actions,
closePopup,
episodeDuration,
goBack,
goTo,
isOpen,
match,
matchPlaylists,
onActionClick: setSelectedActions,
onDurationChange: setEpisodeDuration,
onFormatSelect: setSelectedPlaylistFormat,
openPopup,
page,
selectedActions,
selectedPlaylistFormat,
setMatch,
...usePlayerClickHandler({
goTo,
match,
settings,
}),
}
}