feat(in-603): send requests only for open tabs

pull/202/head
Ruslan Khayrullin 3 years ago
parent 3d1d9e05cd
commit e202aa1d30
  1. 8
      src/features/MatchPage/store/hooks/index.tsx
  2. 18
      src/features/MatchPage/store/hooks/useMatchData.tsx
  3. 54
      src/features/MatchPage/store/hooks/usePlayersStats.tsx
  4. 18
      src/features/MatchPage/store/hooks/useTeamsStats.tsx
  5. 43
      src/features/MatchSidePlaylists/components/TabStats/hooks.tsx
  6. 9
      src/features/MatchSidePlaylists/components/TabStats/index.tsx
  7. 76
      src/features/MatchSidePlaylists/hooks.tsx
  8. 24
      src/features/MatchSidePlaylists/index.tsx
  9. 20
      src/features/MatchSidePlaylists/styled.tsx
  10. 4
      src/hooks/useInterval.tsx
  11. 2
      src/requests/getMatchParticipants.tsx
  12. 4
      src/requests/getMatchScore.tsx

@ -111,7 +111,7 @@ export const useMatchPage = () => {
matchPlaylists, matchPlaylists,
selectedPlaylist, selectedPlaylist,
setFullMatchPlaylistDuration, setFullMatchPlaylistDuration,
} = useMatchData({ matchProfile }) } = useMatchData({ matchProfile, selectedTab })
const profile = matchProfile const profile = matchProfile
@ -297,6 +297,8 @@ export const useMatchPage = () => {
matchProfile, matchProfile,
playingProgress, playingProgress,
selectedPlaylist, selectedPlaylist,
selectedStatsTable,
selectedTab,
setIsTeamsStatsFetching, setIsTeamsStatsFetching,
statsType, statsType,
}) })
@ -304,13 +306,14 @@ export const useMatchPage = () => {
const { const {
beforeCloseTourCallback: beforeCloseTourCallbackPlayers, beforeCloseTourCallback: beforeCloseTourCallbackPlayers,
getParams, getParams,
isEmptyPlayersStats,
playersData, playersData,
playersStats, playersStats,
} = usePlayersStats({ } = usePlayersStats({
matchProfile, matchProfile,
playingProgress, playingProgress,
selectedPlaylist, selectedPlaylist,
selectedStatsTable,
selectedTab,
setIsPlayersStatsFetching, setIsPlayersStatsFetching,
statsType, statsType,
}) })
@ -413,7 +416,6 @@ export const useMatchPage = () => {
isAllActionsChecked, isAllActionsChecked,
isClickable, isClickable,
isEmptyFilters, isEmptyFilters,
isEmptyPlayersStats,
isExpanded, isExpanded,
isFirstTeamPlayersChecked, isFirstTeamPlayersChecked,
isLiveMatch, isLiveMatch,

@ -4,6 +4,8 @@ import {
useCallback, useCallback,
} from 'react' } from 'react'
import isEmpty from 'lodash/isEmpty'
import type { MatchInfo } from 'requests/getMatchInfo' import type { MatchInfo } from 'requests/getMatchInfo'
import { import {
@ -14,6 +16,7 @@ import {
import { FULL_GAME_KEY } from 'features/MatchPage/helpers/buildPlaylists' import { FULL_GAME_KEY } from 'features/MatchPage/helpers/buildPlaylists'
import { useMatchPopupStore } from 'features/MatchPopup' import { useMatchPopupStore } from 'features/MatchPopup'
import { Tabs } from 'features/MatchSidePlaylists/config'
import { useMatchPlaylists } from './useMatchPlaylists' import { useMatchPlaylists } from './useMatchPlaylists'
import { useEvents } from './useEvents' import { useEvents } from './useEvents'
@ -23,9 +26,10 @@ const MATCH_DATA_POLL_INTERVAL = 5000
type UseMatchDataArgs = { type UseMatchDataArgs = {
matchProfile: MatchInfo, matchProfile: MatchInfo,
selectedTab: Tabs,
} }
export const useMatchData = ({ matchProfile: profile }: UseMatchDataArgs) => { export const useMatchData = ({ matchProfile: profile, selectedTab }: UseMatchDataArgs) => {
const { profileId: matchId, sportType } = usePageParams() const { profileId: matchId, sportType } = usePageParams()
const { chapters } = useMatchPopupStore() const { chapters } = useMatchPopupStore()
const [matchDuration, setMatchDuration] = useState(0) const [matchDuration, setMatchDuration] = useState(0)
@ -42,41 +46,43 @@ export const useMatchData = ({ matchProfile: profile }: UseMatchDataArgs) => {
const chaptersDuration = useDuration(chapters) / 1000 const chaptersDuration = useDuration(chapters) / 1000
const fullMatchDuration = matchDuration const fullMatchDuration = matchDuration
useEffect(() => { useEffect(() => {
if (!profile || profile.live) return if (!profile || profile.live) return
fetchMatchPlaylists({ isEmpty(matchPlaylists.match) && selectedTab === Tabs.WATCH && fetchMatchPlaylists({
fullMatchDuration, fullMatchDuration,
id: matchId, id: matchId,
sportType, sportType,
}) })
fetchMatchEvents() isEmpty(events) && selectedTab === Tabs.EVENTS && fetchMatchEvents()
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [ }, [
profile?.live, profile?.live,
fullMatchDuration, fullMatchDuration,
matchId, matchId,
sportType, sportType,
selectedTab,
]) ])
const intervalCallback = useCallback(() => { const intervalCallback = useCallback(() => {
fetchMatchPlaylists({ (selectedTab === Tabs.WATCH || selectedTab === Tabs.PLAYERS) && fetchMatchPlaylists({
fullMatchDuration, fullMatchDuration,
id: matchId, id: matchId,
sportType, sportType,
}) })
fetchMatchEvents() selectedTab === Tabs.EVENTS && fetchMatchEvents()
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [ }, [
fullMatchDuration, fullMatchDuration,
matchId, matchId,
sportType, sportType,
selectedTab,
]) ])
const { start, stop } = useInterval({ const { start, stop } = useInterval({
callback: intervalCallback, callback: intervalCallback,
intervalDuration: MATCH_DATA_POLL_INTERVAL, intervalDuration: MATCH_DATA_POLL_INTERVAL,
startImmediate: false,
}) })
useEffect(() => { useEffect(() => {

@ -9,7 +9,7 @@ import { useQueryClient } from 'react-query'
import throttle from 'lodash/throttle' import throttle from 'lodash/throttle'
import isEmpty from 'lodash/isEmpty' import isEmpty from 'lodash/isEmpty'
import every from 'lodash/every' import includes from 'lodash/includes'
import find from 'lodash/find' import find from 'lodash/find'
import isUndefined from 'lodash/isUndefined' import isUndefined from 'lodash/isUndefined'
import flatMapDepth from 'lodash/flatMapDepth' import flatMapDepth from 'lodash/flatMapDepth'
@ -19,7 +19,11 @@ import size from 'lodash/size'
import { querieKeys } from 'config' import { querieKeys } from 'config'
import type { MatchScore, PlayerParam } from 'requests' import type {
DataItem,
MatchScore,
PlayerParam,
} from 'requests'
import { import {
MatchInfo, MatchInfo,
PlayersStats, PlayersStats,
@ -33,21 +37,24 @@ import { getLocalStorageItem } from 'helpers/getLocalStorage'
import { useObjectState, usePageParams } from 'hooks' import { useObjectState, usePageParams } from 'hooks'
import type{ PlaylistOption } from 'features/MatchPage/types' import type{ PlaylistOption } from 'features/MatchPage/types'
import { StatsType } from 'features/MatchSidePlaylists/components/TabStats/config' import { StatsType, Tabs as StatsTabs } from 'features/MatchSidePlaylists/components/TabStats/config'
import { FULL_GAME_KEY } from 'features/MatchPage/helpers/buildPlaylists' import { FULL_GAME_KEY } from 'features/MatchPage/helpers/buildPlaylists'
import { getHalfTime } from 'features/MatchPage/helpers/getHalfTime' import { getHalfTime } from 'features/MatchPage/helpers/getHalfTime'
import { TOUR_COMPLETED_STORAGE_KEY } from 'features/MatchTour' import { TOUR_COMPLETED_STORAGE_KEY } from 'features/MatchTour'
import { Tabs } from 'features/MatchSidePlaylists/config'
import { DISPLAYED_PARAMS_COLUMNS } from 'features/MatchSidePlaylists/components/PlayersTable/config' import { DISPLAYED_PARAMS_COLUMNS } from 'features/MatchSidePlaylists/components/PlayersTable/config'
import { useFakeData } from './useFakeData' import { useFakeData } from './useFakeData'
const REQUEST_DELAY = 3000 const REQUEST_DELAY = 5000
const STATS_POLL_INTERVAL = 30000 const STATS_POLL_INTERVAL = 30000
type UsePlayersStatsArgs = { type UsePlayersStatsArgs = {
matchProfile: MatchInfo, matchProfile: MatchInfo,
playingProgress: number, playingProgress: number,
selectedPlaylist?: PlaylistOption, selectedPlaylist?: PlaylistOption,
selectedStatsTable: StatsTabs,
selectedTab: Tabs,
setIsPlayersStatsFetching: Dispatch<SetStateAction<boolean>>, setIsPlayersStatsFetching: Dispatch<SetStateAction<boolean>>,
statsType: StatsType, statsType: StatsType,
} }
@ -61,6 +68,8 @@ export const usePlayersStats = ({
matchProfile, matchProfile,
playingProgress, playingProgress,
selectedPlaylist, selectedPlaylist,
selectedStatsTable,
selectedTab,
setIsPlayersStatsFetching, setIsPlayersStatsFetching,
statsType, statsType,
}: UsePlayersStatsArgs) => { }: UsePlayersStatsArgs) => {
@ -81,12 +90,6 @@ export const usePlayersStats = ({
const isCurrentStats = statsType === StatsType.CURRENT_STATS const isCurrentStats = statsType === StatsType.CURRENT_STATS
const isEmptyPlayersStats = (teamId: number) => (
isEmpty(playersStats[teamId])
|| every(playersStats[teamId], isEmpty)
|| isEmpty(playersData[matchProfile?.team1.id === teamId ? 'team1' : 'team2'])
)
const getParams = useCallback((stats: PlayersStats) => ( const getParams = useCallback((stats: PlayersStats) => (
uniqBy(flatMapDepth(stats, values), 'id') as Array<PlayerParam> uniqBy(flatMapDepth(stats, values), 'id') as Array<PlayerParam>
), []) ), [])
@ -141,16 +144,25 @@ export const usePlayersStats = ({
]) ])
const fetchData = useMemo(() => throttle(async (second?: number) => { const fetchData = useMemo(() => throttle(async (second?: number) => {
const isTeam1Selected = selectedStatsTable === StatsTabs.TEAM1
if ( if (
selectedPlaylist?.id !== FULL_GAME_KEY selectedPlaylist?.id !== FULL_GAME_KEY
|| (matchProfile?.live && Number(matchProfile.c_match_calc_status) <= 1) || selectedTab !== Tabs.STATS
|| !includes([StatsTabs.TEAM1, StatsTabs.TEAM2], selectedStatsTable)
|| !matchProfile?.team1.id
|| !matchProfile?.team2.id
|| (!matchProfile?.live && !isCurrentStats && !isEmpty(playersStats[isTeam1Selected
? matchProfile.team1.id
: matchProfile.team2.id]))
) return ) return
const [res1, res2, res3] = await Promise.all([ const [res1, res2] = await Promise.all([
fetchPlayers(second), fetchPlayers(second),
fetchPlayersStats('team1', second), isTeam1Selected
fetchPlayersStats('team2', second), ? fetchPlayersStats('team1', second)
]) : fetchPlayersStats('team2', second),
]) as [Array<DataItem> | null, PlayersStats | null]
const team1Players = find(res1, { team_id: matchProfile?.team1.id })?.players || [] const team1Players = find(res1, { team_id: matchProfile?.team1.id })?.players || []
const team2Players = find(res1, { team_id: matchProfile?.team2.id })?.players || [] const team2Players = find(res1, { team_id: matchProfile?.team2.id })?.players || []
@ -168,19 +180,20 @@ export const usePlayersStats = ({
}) })
setPlayersStats({ setPlayersStats({
...(matchProfile?.team1.id && res2 && { ...(isTeam1Selected && res2 && {
[matchProfile.team1.id]: needUseFakeData [matchProfile.team1.id]: needUseFakeData
? fakeData.playersStats as unknown as PlayersStats ? fakeData.playersStats as unknown as PlayersStats
: res2, : res2,
}), }),
...(matchProfile?.team2.id && res3 && { ...(!isTeam1Selected && res2 && {
[matchProfile.team2.id]: needUseFakeData [matchProfile.team2.id]: needUseFakeData
? fakeData.playersStats as unknown as PlayersStats ? fakeData.playersStats as unknown as PlayersStats
: res3, : res2,
}), }),
}) })
setIsPlayersStatsFetching(false) setIsPlayersStatsFetching(false)
// eslint-disable-next-line react-hooks/exhaustive-deps
}, REQUEST_DELAY), [ }, REQUEST_DELAY), [
selectedPlaylist?.id, selectedPlaylist?.id,
fetchPlayers, fetchPlayers,
@ -189,10 +202,12 @@ export const usePlayersStats = ({
matchProfile?.team1.id, matchProfile?.team1.id,
matchProfile?.team2.id, matchProfile?.team2.id,
matchProfile?.live, matchProfile?.live,
matchProfile?.c_match_calc_status,
setIsPlayersStatsFetching, setIsPlayersStatsFetching,
getParams, getParams,
fakeData, fakeData,
selectedTab,
selectedStatsTable,
isCurrentStats,
]) ])
const beforeCloseTourCallback = () => { const beforeCloseTourCallback = () => {
@ -233,7 +248,6 @@ export const usePlayersStats = ({
return { return {
beforeCloseTourCallback, beforeCloseTourCallback,
getParams, getParams,
isEmptyPlayersStats,
playersData, playersData,
playersStats, playersStats,
} }

@ -26,20 +26,23 @@ import { usePageParams } from 'hooks'
import { getLocalStorageItem } from 'helpers/getLocalStorage' import { getLocalStorageItem } from 'helpers/getLocalStorage'
import type { PlaylistOption } from 'features/MatchPage/types' import type { PlaylistOption } from 'features/MatchPage/types'
import { StatsType } from 'features/MatchSidePlaylists/components/TabStats/config' import { StatsType, Tabs as StatsTab } from 'features/MatchSidePlaylists/components/TabStats/config'
import { FULL_GAME_KEY } from 'features/MatchPage/helpers/buildPlaylists' import { FULL_GAME_KEY } from 'features/MatchPage/helpers/buildPlaylists'
import { getHalfTime } from 'features/MatchPage/helpers/getHalfTime' import { getHalfTime } from 'features/MatchPage/helpers/getHalfTime'
import { TOUR_COMPLETED_STORAGE_KEY } from 'features/MatchTour' import { TOUR_COMPLETED_STORAGE_KEY } from 'features/MatchTour'
import { Tabs } from 'features/MatchSidePlaylists/config'
import { useFakeData } from './useFakeData' import { useFakeData } from './useFakeData'
const REQUEST_DELAY = 3000 const REQUEST_DELAY = 5000
const STATS_POLL_INTERVAL = 30000 const STATS_POLL_INTERVAL = 30000
type UseTeamsStatsArgs = { type UseTeamsStatsArgs = {
matchProfile: MatchInfo, matchProfile: MatchInfo,
playingProgress: number, playingProgress: number,
selectedPlaylist?: PlaylistOption, selectedPlaylist?: PlaylistOption,
selectedStatsTable: StatsTab,
selectedTab: Tabs,
setIsTeamsStatsFetching: Dispatch<SetStateAction<boolean>>, setIsTeamsStatsFetching: Dispatch<SetStateAction<boolean>>,
statsType: StatsType, statsType: StatsType,
} }
@ -52,6 +55,8 @@ export const useTeamsStats = ({
matchProfile, matchProfile,
playingProgress, playingProgress,
selectedPlaylist, selectedPlaylist,
selectedStatsTable,
selectedTab,
setIsTeamsStatsFetching, setIsTeamsStatsFetching,
statsType, statsType,
}: UseTeamsStatsArgs) => { }: UseTeamsStatsArgs) => {
@ -98,7 +103,9 @@ export const useTeamsStats = ({
!sportName !sportName
|| selectedPlaylist?.id !== FULL_GAME_KEY || selectedPlaylist?.id !== FULL_GAME_KEY
|| !videoBounds || !videoBounds
|| (matchProfile?.live && Number(matchProfile.c_match_calc_status) <= 1) || selectedTab !== Tabs.STATS
|| selectedStatsTable !== StatsTab.TEAMS
|| (!matchProfile?.live && !isCurrentStats && !isEmpty(teamsStats))
) return ) return
try { try {
@ -117,9 +124,9 @@ export const useTeamsStats = ({
// eslint-disable-next-line no-empty // eslint-disable-next-line no-empty
} catch (e) {} } catch (e) {}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, REQUEST_DELAY), [ }, REQUEST_DELAY), [
matchProfile?.video_bounds, matchProfile?.video_bounds,
matchProfile?.c_match_calc_status,
matchProfile?.live, matchProfile?.live,
matchScore?.video_bounds, matchScore?.video_bounds,
selectedPlaylist?.id, selectedPlaylist?.id,
@ -128,6 +135,9 @@ export const useTeamsStats = ({
sportName, sportName,
fakeData, fakeData,
getFirstClickableParam, getFirstClickableParam,
selectedTab,
selectedStatsTable,
isCurrentStats,
]) ])
const beforeCloseTourCallback = () => { const beforeCloseTourCallback = () => {

@ -1,21 +1,14 @@
import { useEffect } from 'react'
import isEmpty from 'lodash/isEmpty'
import { useTooltip } from 'hooks' import { useTooltip } from 'hooks'
import { useMatchPageStore } from 'features/MatchPage/store' import { useMatchPageStore } from 'features/MatchPage/store'
import { StatsType, Tabs } from './config' import { StatsType } from './config'
export const useTabStats = () => { export const useTabStats = () => {
const { const {
isEmptyPlayersStats,
profile: matchProfile,
selectedStatsTable: selectedTab, selectedStatsTable: selectedTab,
setSelectedStatsTable: setSelectedTab, setSelectedStatsTable: setSelectedTab,
statsType, statsType,
teamsStats,
toggleStatsType, toggleStatsType,
} = useMatchPageStore() } = useMatchPageStore()
@ -32,43 +25,9 @@ export const useTabStats = () => {
const switchTitleLexic = isFinalStatsType ? 'final_stats' : 'current_stats' const switchTitleLexic = isFinalStatsType ? 'final_stats' : 'current_stats'
const switchButtonTooltipLexic = isFinalStatsType ? 'display_all_stats' : 'display_stats_according_to_video' const switchButtonTooltipLexic = isFinalStatsType ? 'display_all_stats' : 'display_stats_according_to_video'
const isVisibleTeamsTab = !isEmpty(teamsStats)
const isVisibleTeam1PlayersTab = Boolean(
matchProfile && !isEmptyPlayersStats(matchProfile.team1.id),
)
const isVisibleTeam2PlayersTab = Boolean(
matchProfile && !isEmptyPlayersStats(matchProfile.team2.id),
)
useEffect(() => {
switch (true) {
case isVisibleTeamsTab:
setSelectedTab(Tabs.TEAMS)
break
case isVisibleTeam1PlayersTab:
setSelectedTab(Tabs.TEAM1)
break
case isVisibleTeam2PlayersTab:
setSelectedTab(Tabs.TEAM2)
break
default:
}
}, [
isVisibleTeam1PlayersTab,
isVisibleTeam2PlayersTab,
isVisibleTeamsTab,
setSelectedTab,
])
return { return {
isFinalStatsType, isFinalStatsType,
isTooltipShown, isTooltipShown,
isVisibleTeam1PlayersTab,
isVisibleTeam2PlayersTab,
isVisibleTeamsTab,
onMouseLeave, onMouseLeave,
onMouseOver, onMouseOver,
selectedTab, selectedTab,

@ -46,9 +46,6 @@ export const TabStats = () => {
const { const {
isFinalStatsType, isFinalStatsType,
isTooltipShown, isTooltipShown,
isVisibleTeam1PlayersTab,
isVisibleTeam2PlayersTab,
isVisibleTeamsTab,
onMouseLeave, onMouseLeave,
onMouseOver, onMouseOver,
selectedTab, selectedTab,
@ -76,7 +73,6 @@ export const TabStats = () => {
<Container> <Container>
<Header> <Header>
<TabList> <TabList>
{isVisibleTeamsTab && (
<Tab <Tab
aria-pressed={selectedTab === Tabs.TEAMS} aria-pressed={selectedTab === Tabs.TEAMS}
onClick={() => setSelectedTab(Tabs.TEAMS)} onClick={() => setSelectedTab(Tabs.TEAMS)}
@ -89,8 +85,6 @@ export const TabStats = () => {
<Spotlight /> <Spotlight />
)} )}
</Tab> </Tab>
)}
{isVisibleTeam1PlayersTab && (
<Tab <Tab
aria-pressed={selectedTab === Tabs.TEAM1} aria-pressed={selectedTab === Tabs.TEAM1}
onClick={() => setSelectedTab(Tabs.TEAM1)} onClick={() => setSelectedTab(Tabs.TEAM1)}
@ -121,8 +115,6 @@ export const TabStats = () => {
<Spotlight /> <Spotlight />
)} )}
</Tab> </Tab>
)}
{isVisibleTeam2PlayersTab && (
<Tab <Tab
aria-pressed={selectedTab === Tabs.TEAM2} aria-pressed={selectedTab === Tabs.TEAM2}
onClick={() => setSelectedTab(Tabs.TEAM2)} onClick={() => setSelectedTab(Tabs.TEAM2)}
@ -149,7 +141,6 @@ export const TabStats = () => {
/> />
</TabTitle> </TabTitle>
</Tab> </Tab>
)}
</TabList> </TabList>
<Switch <Switch
data-step={Steps.FinalStats} data-step={Steps.FinalStats}

@ -1,7 +1,13 @@
import { useEffect, useMemo } from 'react' import { useEffect } from 'react'
import { useQueryClient } from 'react-query'
import isEmpty from 'lodash/isEmpty' import findIndex from 'lodash/findIndex'
import compact from 'lodash/compact' import isNil from 'lodash/isNil'
import { querieKeys } from 'config'
import type { MatchScore } from 'requests'
import { MatchStatuses } from 'requests'
import { useMatchPageStore } from 'features/MatchPage/store' import { useMatchPageStore } from 'features/MatchPage/store'
@ -10,77 +16,27 @@ import { Tabs } from './config'
export const useMatchSidePlaylists = () => { export const useMatchSidePlaylists = () => {
const { const {
closePopup, closePopup,
events,
isEmptyPlayersStats,
matchPlaylists: playlists,
profile: matchProfile, profile: matchProfile,
selectedTab, selectedTab,
setSelectedTab, setSelectedTab,
teamsStats,
} = useMatchPageStore() } = useMatchPageStore()
const client = useQueryClient()
const isWatchTabVisible = !matchProfile?.live || Number(matchProfile.c_match_calc_status) > 1 const matchScore = client.getQueryData<MatchScore>(querieKeys.matchScore)
const isEventTabVisible = useMemo(() => (
events.length > 0
), [events])
const isPlayersTabVisible = useMemo(() => (
!isEmpty(playlists.players.team1)
), [playlists.players.team1])
const isStatsTabVisible = useMemo(() => ( const videoBounds = matchScore?.video_bounds || matchProfile?.video_bounds
!isEmpty(teamsStats) const matchStatus = matchScore?.c_match_calc_status || matchProfile?.c_match_calc_status
|| (matchProfile?.team1.id && !isEmptyPlayersStats(matchProfile.team1.id))
|| (matchProfile?.team2.id && !isEmptyPlayersStats(matchProfile.team2.id))
), [
isEmptyPlayersStats,
matchProfile?.team1.id,
matchProfile?.team2.id,
teamsStats,
])
const hasLessThanFourTabs = compact([ const showTabs = Number(matchStatus) > MatchStatuses.Upcoming
isWatchTabVisible, && findIndex(videoBounds, ({ h, s }) => h === '1' && !isNil(s)) !== -1
isEventTabVisible,
isPlayersTabVisible,
isStatsTabVisible,
]).length < 4
useEffect(() => {
switch (true) {
case isWatchTabVisible:
setSelectedTab(Tabs.WATCH)
break
case isEventTabVisible:
setSelectedTab(Tabs.EVENTS)
break
case isPlayersTabVisible:
setSelectedTab(Tabs.PLAYERS)
break
case isStatsTabVisible:
setSelectedTab(Tabs.STATS)
break
}
}, [
isEventTabVisible,
isPlayersTabVisible,
isStatsTabVisible,
isWatchTabVisible,
setSelectedTab,
])
useEffect(() => { useEffect(() => {
if (selectedTab !== Tabs.EVENTS) closePopup() if (selectedTab !== Tabs.EVENTS) closePopup()
}, [selectedTab, closePopup]) }, [selectedTab, closePopup])
return { return {
hasLessThanFourTabs,
isEventTabVisible,
isPlayersTabVisible,
isStatsTabVisible,
isWatchTabVisible,
onTabClick: setSelectedTab, onTabClick: setSelectedTab,
selectedTab, selectedTab,
showTabs,
} }
} }

@ -67,12 +67,8 @@ export const MatchSidePlaylists = ({
} = useMatchPageStore() } = useMatchPageStore()
const { const {
hasLessThanFourTabs,
isEventTabVisible,
isPlayersTabVisible,
isStatsTabVisible,
isWatchTabVisible,
onTabClick, onTabClick,
showTabs,
} = useMatchSidePlaylists() } = useMatchSidePlaylists()
const { const {
@ -108,14 +104,14 @@ export const MatchSidePlaylists = ({
if ( if (
getLocalStorageItem(TOUR_COMPLETED_STORAGE_KEY) === 'true' getLocalStorageItem(TOUR_COMPLETED_STORAGE_KEY) === 'true'
|| isOpen || isOpen
|| !isStatsTabVisible || !showTabs
|| Number(profile?.c_match_calc_status) < 2 || Number(profile?.c_match_calc_status) < 2
) return undefined ) return undefined
const timer = setTimeout(() => setIsOpen(true), 1500) const timer = setTimeout(() => setIsOpen(true), 1500)
return () => clearTimeout(timer) return () => clearTimeout(timer)
}, [isStatsTabVisible, setIsOpen, profile?.c_match_calc_status, isOpen]) }, [showTabs, setIsOpen, profile?.c_match_calc_status, isOpen])
useEventListener({ useEventListener({
callback: () => { callback: () => {
@ -140,9 +136,10 @@ export const MatchSidePlaylists = ({
isTourOpen={Boolean(isOpen)} isTourOpen={Boolean(isOpen)}
isHidden={!profileCardShown} isHidden={!profileCardShown}
> >
{showTabs
&& (
<TabsWrapper> <TabsWrapper>
<TabsGroup hasLessThanFourTabs={hasLessThanFourTabs}> <TabsGroup>
{isWatchTabVisible ? (
<Tab <Tab
aria-pressed={selectedTab === Tabs.WATCH} aria-pressed={selectedTab === Tabs.WATCH}
onClick={() => onTabClick(Tabs.WATCH)} onClick={() => onTabClick(Tabs.WATCH)}
@ -153,8 +150,6 @@ export const MatchSidePlaylists = ({
<TabTitle t='watch' /> <TabTitle t='watch' />
</TabButton> </TabButton>
</Tab> </Tab>
) : null}
{isEventTabVisible ? (
<Tab <Tab
aria-pressed={selectedTab === Tabs.EVENTS} aria-pressed={selectedTab === Tabs.EVENTS}
onClick={() => onTabClick(Tabs.EVENTS)} onClick={() => onTabClick(Tabs.EVENTS)}
@ -165,8 +160,6 @@ export const MatchSidePlaylists = ({
<TabTitle t='actions' /> <TabTitle t='actions' />
</TabButton> </TabButton>
</Tab> </Tab>
) : null}
{isPlayersTabVisible ? (
<Tab <Tab
aria-pressed={selectedTab === Tabs.PLAYERS} aria-pressed={selectedTab === Tabs.PLAYERS}
onClick={() => onTabClick(Tabs.PLAYERS)} onClick={() => onTabClick(Tabs.PLAYERS)}
@ -177,8 +170,6 @@ export const MatchSidePlaylists = ({
<TabTitle t='players' /> <TabTitle t='players' />
</TabButton> </TabButton>
</Tab> </Tab>
) : null}
{isStatsTabVisible ? (
<Tab <Tab
aria-pressed={selectedTab === Tabs.STATS} aria-pressed={selectedTab === Tabs.STATS}
onClick={() => onTabClick(Tabs.STATS)} onClick={() => onTabClick(Tabs.STATS)}
@ -193,10 +184,9 @@ export const MatchSidePlaylists = ({
<TabTitle t='stats' /> <TabTitle t='stats' />
</TabButton> </TabButton>
</Tab> </Tab>
) : null}
</TabsGroup> </TabsGroup>
</TabsWrapper> </TabsWrapper>
)}
<Container <Container
hasScroll={hasTabPaneScroll} hasScroll={hasTabPaneScroll}
ref={tabPaneContainerRef} ref={tabPaneContainerRef}

@ -54,28 +54,10 @@ export const Wrapper = styled.div<WrapperProps>`
export const TabsWrapper = styled.div`` export const TabsWrapper = styled.div``
type TabsGroupProps = { export const TabsGroup = styled.div.attrs({ role: 'tablist' })`
hasLessThanFourTabs?: boolean,
}
export const TabsGroup = styled.div.attrs({ role: 'tablist' })<TabsGroupProps>`
display: flex; display: flex;
justify-content: center; justify-content: center;
gap: ${isMobileDevice ? 30 : 20}px; gap: ${isMobileDevice ? 30 : 20}px;
${({ hasLessThanFourTabs }) => (hasLessThanFourTabs
? css`
${Tab} {
justify-content: center;
flex-direction: row;
gap: 5px;
}
${TabIcon} {
margin-bottom: 0;
}
`
: '')}
` `
export const TabTitle = styled(T9n)` export const TabTitle = styled(T9n)`

@ -29,9 +29,11 @@ export const useInterval = ({
useEffect(() => { useEffect(() => {
if (!isRunning) return undefined if (!isRunning) return undefined
if (startImmediate) savedCallback.current()
const id = setInterval(savedCallback.current, intervalDuration) const id = setInterval(savedCallback.current, intervalDuration)
return () => clearInterval(id) return () => clearInterval(id)
}, [isRunning, intervalDuration, callback]) }, [isRunning, intervalDuration, callback, startImmediate])
return { start, stop } return { start, stop }
} }

@ -28,7 +28,7 @@ export type Player = {
weight: number | null, weight: number | null,
} }
type DataItem = { export type DataItem = {
players: Array<Player>, players: Array<Player>,
team_id: number, team_id: number,
} }

@ -6,7 +6,8 @@ import type {
Team, Team,
MatchTournament, MatchTournament,
VideoBounds, VideoBounds,
} from 'requests/getMatchInfo' } from './getMatchInfo'
import { MatchStatuses } from './getMatchInfo'
type Params = { type Params = {
profileId: number, profileId: number,
@ -14,6 +15,7 @@ type Params = {
} }
export type MatchScore = { export type MatchScore = {
c_match_calc_status: MatchStatuses | null,
match_date: string, match_date: string,
match_date_utc: string, match_date_utc: string,
match_id: number, match_id: number,

Loading…
Cancel
Save