feat(in-570): episodes playback changes #195

Merged
andrey.dekterev merged 1 commits from in-570 into develop 3 years ago
  1. 12
      src/features/CircleAnimationBar/index.tsx
  2. 3
      src/features/MatchPage/components/FinishedMatch/hooks/index.tsx
  3. 2
      src/features/MatchPage/components/FinishedMatch/hooks/useEpisodes.tsx
  4. 1
      src/features/MatchPage/components/FinishedMatch/index.tsx
  5. 11
      src/features/MatchPage/components/LiveMatch/hooks/index.tsx
  6. 68
      src/features/MatchPage/store/hooks/index.tsx
  7. 6
      src/features/MatchPage/store/hooks/useMatchData.tsx
  8. 5
      src/features/MatchPage/store/hooks/useMatchPlaylists.tsx
  9. 21
      src/features/MatchPage/store/hooks/useSelectedPlaylist.tsx
  10. 29
      src/features/MatchPage/store/hooks/useStatsTab.tsx
  11. 3
      src/features/MatchPage/types.tsx
  12. 160
      src/features/MatchSidePlaylists/components/EventsList/index.tsx
  13. 67
      src/features/MatchSidePlaylists/components/MatchPlaylists/index.tsx
  14. 13
      src/features/MatchSidePlaylists/components/PlayersPlaylists/index.tsx
  15. 6
      src/features/MatchSidePlaylists/components/PlayersTable/hooks/index.tsx
  16. 2
      src/features/MatchSidePlaylists/components/PlayersTable/hooks/useTable.tsx
  17. 6
      src/features/MatchSidePlaylists/components/TabEvents/index.tsx
  18. 2
      src/features/MatchSidePlaylists/components/TeamsStatsTable/Cell.tsx
  19. 6
      src/features/MatchSidePlaylists/components/TeamsStatsTable/hooks.tsx
  20. 28
      src/features/MultiSourcePlayer/hooks/index.tsx
  21. 8
      src/features/MultiSourcePlayer/index.tsx
  22. 25
      src/features/StreamPlayer/hooks/index.tsx
  23. 8
      src/features/StreamPlayer/index.tsx
  24. 4
      src/features/StreamPlayer/styled.tsx

@ -10,16 +10,16 @@ import { fullEpisodesDuration } from './helpers'
import { Svg, Circle } from './styled' import { Svg, Circle } from './styled'
export type TCircleAnimation = { export type TCircleAnimation = {
plaingOrder: number,
playedProgress: number, playedProgress: number,
playing: boolean, playing: boolean,
playingOrder: number,
ready: boolean, ready: boolean,
} }
export const initialCircleAnimation: TCircleAnimation = { export const initialCircleAnimation: TCircleAnimation = {
plaingOrder: 0,
playedProgress: 0, playedProgress: 0,
playing: false, playing: false,
playingOrder: 0,
ready: false, ready: false,
} }
@ -43,14 +43,14 @@ export const CircleAnimationBar = ({
} = useMatchPageStore() } = useMatchPageStore()
const { const {
plaingOrder,
playedProgress, playedProgress,
playing, playing,
playingOrder,
ready, ready,
} = circleAnimation } = circleAnimation
const timeOfAllEpisodes = fullEpisodesDuration(filteredEvents) const timeOfAllEpisodes = fullEpisodesDuration(filteredEvents)
const remainingEvents = filteredEvents.slice(plaingOrder && plaingOrder - 1) const remainingEvents = filteredEvents.slice(playingOrder && playingOrder - 1)
const fullTimeOfRemainingEpisodes = !isEmpty(remainingEvents) const fullTimeOfRemainingEpisodes = !isEmpty(remainingEvents)
? fullEpisodesDuration(remainingEvents) ? fullEpisodesDuration(remainingEvents)
: 0 : 0
@ -62,13 +62,13 @@ export const CircleAnimationBar = ({
const strokeDashOffset = svgSize * Math.PI const strokeDashOffset = svgSize * Math.PI
useEffect(() => { useEffect(() => {
if (currentEpisodesPercent >= 100 && (plaingOrder === size(filteredEvents))) { if (currentEpisodesPercent >= 100 && (playingOrder === size(filteredEvents))) {
setWatchAllEpisodesTimer(false) setWatchAllEpisodesTimer(false)
} }
}, [ }, [
currentEpisodesPercent, currentEpisodesPercent,
filteredEvents, filteredEvents,
plaingOrder, playingOrder,
setWatchAllEpisodesTimer, setWatchAllEpisodesTimer,
]) ])

@ -41,11 +41,12 @@ export const useFinishedMatch = () => {
setSettings(newSettings) setSettings(newSettings)
closeSettingsPopup() closeSettingsPopup()
} }
// @ts-expect-error
const onPlaylistSelect: typeof handlePlaylistClick = (playlist, e) => { const onPlaylistSelect: typeof handlePlaylistClick = (playlist, e) => {
if (selectedPlaylist) { if (selectedPlaylist) {
logPlaylistChange(selectedPlaylist) logPlaylistChange(selectedPlaylist)
} }
// @ts-expect-error
handlePlaylistClick(playlist, e) handlePlaylistClick(playlist, e)
} }
const { chapters } = useChapters({ episodes, selectedPlaylist }) const { chapters } = useChapters({ episodes, selectedPlaylist })

@ -49,7 +49,7 @@ export const useEpisodes = () => {
useEffect(() => { useEffect(() => {
if (!selectedPlaylist && playlists && !isEmpty(playlists.match)) { if (!selectedPlaylist && playlists && !isEmpty(playlists.match)) {
handlePlaylistClick(playlists.match[0]) // handlePlaylistClick(playlists.match[0])
} }
}, [ }, [
selectedPlaylist, selectedPlaylist,

@ -66,6 +66,7 @@ export const FinishedMatch = () => {
<MatchSidePlaylists <MatchSidePlaylists
selectedPlaylist={selectedPlaylist} selectedPlaylist={selectedPlaylist}
// @ts-expect-error
onSelect={onPlaylistSelect} onSelect={onPlaylistSelect}
/> />
</Fragment> </Fragment>

@ -1,3 +1,4 @@
import type { MouseEvent } from 'react'
import { useMemo } from 'react' import { useMemo } from 'react'
import { API_ROOT } from 'config' import { API_ROOT } from 'config'
@ -6,6 +7,7 @@ import { readToken } from 'helpers/token'
import { usePageParams } from 'hooks' import { usePageParams } from 'hooks'
import type { PlaylistOption } from 'features/MatchPage/types'
import { useMatchPageStore } from 'features/MatchPage/store' import { useMatchPageStore } from 'features/MatchPage/store'
import { MatchSecondType, usePlayerProgressReporter } from './usePlayerProgressReporter' import { MatchSecondType, usePlayerProgressReporter } from './usePlayerProgressReporter'
@ -18,6 +20,7 @@ export const useLiveMatch = () => {
handlePlaylistClick, handlePlaylistClick,
profile, profile,
selectedPlaylist, selectedPlaylist,
selectedTab,
setFullMatchPlaylistDuration, setFullMatchPlaylistDuration,
} = useMatchPageStore() } = useMatchPageStore()
const { profileId: matchId, sportType } = usePageParams() const { profileId: matchId, sportType } = usePageParams()
@ -59,11 +62,15 @@ export const useLiveMatch = () => {
notifyProgressLogger(playing) notifyProgressLogger(playing)
} }
const onPlaylistSelect: typeof handlePlaylistClick = (playlist, e) => { const onPlaylistSelect = (playlist: PlaylistOption, e?: MouseEvent) => {
if (selectedPlaylist) { if (selectedPlaylist) {
logPlaylistChange(selectedPlaylist) logPlaylistChange(selectedPlaylist)
} }
handlePlaylistClick(playlist, e) handlePlaylistClick({
e,
playlist,
tab: selectedTab,
})
} }
return { return {
chapters, chapters,

@ -17,6 +17,7 @@ import { initialCircleAnimation } from 'features/CircleAnimationBar'
import type { TCircleAnimation } from 'features/CircleAnimationBar' import type { TCircleAnimation } from 'features/CircleAnimationBar'
import { StatsType } from 'features/MatchSidePlaylists/components/TabStats/config' import { StatsType } from 'features/MatchSidePlaylists/components/TabStats/config'
import { PlaylistTypes } from 'features/MatchPage/types' import { PlaylistTypes } from 'features/MatchPage/types'
import { FULL_GAME_KEY } from 'features/MatchPage/helpers/buildPlaylists'
import type { MatchInfo } from 'requests/getMatchInfo' import type { MatchInfo } from 'requests/getMatchInfo'
import { getMatchInfo } from 'requests/getMatchInfo' import { getMatchInfo } from 'requests/getMatchInfo'
@ -48,9 +49,9 @@ type PlayingData = {
} }
type EpisodeInfo = { type EpisodeInfo = {
paramName: string, episodesCount?: number,
paramValue?: number, paramName?: string,
playerOrTeamName: string, playerOrTeamName?: string,
} }
const initPlayingData: PlayingData = { const initPlayingData: PlayingData = {
@ -72,18 +73,16 @@ export const useMatchPage = () => {
const [access, setAccess] = useState(true) const [access, setAccess] = useState(true)
const [playingProgress, setPlayingProgress] = useState(0) const [playingProgress, setPlayingProgress] = useState(0)
const [playingData, setPlayingData] = useState<PlayingData>(initPlayingData) const [playingData, setPlayingData] = useState<PlayingData>(initPlayingData)
const [plaingOrder, setPlaingOrder] = useState(0) const [playingOrder, setPlaingOrder] = useState(0)
const [isPlayFilterEpisodes, setIsPlayingFiltersEpisodes] = useState(false) const [isPlayFilterEpisodes, setIsPlayingFiltersEpisodes] = useState(false)
const [selectedTab, setSelectedTab] = useState<Tabs>(Tabs.WATCH) const [selectedTab, setSelectedTab] = useState<Tabs>(Tabs.WATCH)
const [circleAnimation, setCircleAnimation] = useState<TCircleAnimation>(initialCircleAnimation) const [circleAnimation, setCircleAnimation] = useState<TCircleAnimation>(initialCircleAnimation)
const [episodeInfo, setEpisodeInfo] = useState<EpisodeInfo>({ const [episodeInfo, setEpisodeInfo] = useState<EpisodeInfo>({
episodesCount: 0,
paramName: '', paramName: '',
paramValue: 0,
playerOrTeamName: '', playerOrTeamName: '',
}) })
const isStatsTab = selectedTab === Tabs.STATS
const { profileId: matchId, sportType } = usePageParams() const { profileId: matchId, sportType } = usePageParams()
useEffect(() => { useEffect(() => {
@ -112,13 +111,13 @@ export const useMatchPage = () => {
matchPlaylists, matchPlaylists,
selectedPlaylist, selectedPlaylist,
setFullMatchPlaylistDuration, setFullMatchPlaylistDuration,
} = useMatchData({ matchProfile, selectedTab }) } = useMatchData({ matchProfile })
const profile = matchProfile const profile = matchProfile
const isPlayingEpisode = selectedPlaylist.type === PlaylistTypes.EVENT const isPlayingEpisode = selectedPlaylist.id !== FULL_GAME_KEY
&& selectedPlaylist.tab === Tabs.STATS
&& selectedTab === Tabs.STATS const isStatsPlaylist = selectedPlaylist.tab === Tabs.STATS
const { const {
activeEvents, activeEvents,
@ -245,7 +244,7 @@ export const useMatchPage = () => {
} }
const disablePlayingEpisodes = () => { const disablePlayingEpisodes = () => {
isStatsTab ? disablePlayingStatsEpisodes() : disablePlayingPlaysEpisodes() isStatsPlaylist ? disablePlayingStatsEpisodes() : disablePlayingPlaysEpisodes()
} }
useEffect(() => { useEffect(() => {
@ -253,7 +252,7 @@ export const useMatchPage = () => {
disablePlayingStatsEpisodes() disablePlayingStatsEpisodes()
disablePlayingPlaysEpisodes() disablePlayingPlaysEpisodes()
} else { } else {
selectedTab === Tabs.EVENTS ? disablePlayingStatsEpisodes() : disablePlayingPlaysEpisodes() !isStatsPlaylist ? disablePlayingStatsEpisodes() : disablePlayingPlaysEpisodes()
} }
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [selectedPlaylist]) }, [selectedPlaylist])
@ -265,8 +264,8 @@ export const useMatchPage = () => {
isPlayersStatsFetching, isPlayersStatsFetching,
isPlayFilterEpisodes: isStatsPlayFilterEpisodes, isPlayFilterEpisodes: isStatsPlayFilterEpisodes,
isTeamsStatsFetching, isTeamsStatsFetching,
plaingOrder: statsPlaingOrder,
playEpisodes: playStatsEpisodes, playEpisodes: playStatsEpisodes,
playingOrder: statsPlaingOrder,
playNextEpisode: playStatsNextEpisode, playNextEpisode: playStatsNextEpisode,
reduceTable, reduceTable,
selectedStatsTable, selectedStatsTable,
@ -357,16 +356,19 @@ export const useMatchPage = () => {
} = useTabEvents({ events: filteredEvents, profile }) } = useTabEvents({ events: filteredEvents, profile })
const playNextEpisode = (order?: number) => { const playNextEpisode = (order?: number) => {
const isLastEpisode = plaingOrder === episodesToPlay.length const isLastEpisode = playingOrder === episodesToPlay.length
const currentOrder = order === 0 ? order : plaingOrder const currentOrder = order === 0 ? order : playingOrder
if (isLastEpisode) { if (isLastEpisode) {
setIsPlayingFiltersEpisodes(false) setIsPlayingFiltersEpisodes(false)
setPlaingOrder(0) setPlaingOrder(0)
return return
} }
handlePlaylistClick(episodesToPlay[currentOrder]) handlePlaylistClick({
playlist: episodesToPlay[currentOrder],
tab: Tabs.EVENTS,
})
setPlaingOrder(currentOrder + 1) setPlaingOrder(currentOrder + 1)
} }
const playEpisodes = () => { const playEpisodes = () => {
@ -383,9 +385,12 @@ export const useMatchPage = () => {
if (matchProfile?.live) { if (matchProfile?.live) {
handlePlaylistClick({ handlePlaylistClick({
episodes: episodesToPlay.map((el) => el.episodes[0]), playlist: {
id: 1, episodes: episodesToPlay.map((el) => el.episodes[0]),
type: episodesToPlay[0].type, id: 1,
type: episodesToPlay[0].type,
},
tab: Tabs.EVENTS,
}) })
} else { } else {
playNextEpisode(0) playNextEpisode(0)
@ -402,13 +407,13 @@ export const useMatchPage = () => {
allPlayersToggle, allPlayersToggle,
applyFilters, applyFilters,
beforeCloseTourCallback, beforeCloseTourCallback,
circleAnimation: isStatsTab ? statsCircleAnimation : circleAnimation, circleAnimation: isStatsPlaylist ? statsCircleAnimation : circleAnimation,
closePopup, closePopup,
countOfFilters, countOfFilters,
disablePlayingEpisodes, disablePlayingEpisodes,
episodeInfo, episodeInfo,
events, events,
filteredEvents: isStatsTab ? statsFilteredEvents : filteredEvents, filteredEvents: isStatsPlaylist ? statsFilteredEvents : filteredEvents,
getFirstClickableParam, getFirstClickableParam,
getParams, getParams,
handlePlaylistClick, handlePlaylistClick,
@ -421,7 +426,7 @@ export const useMatchPage = () => {
isFirstTeamPlayersChecked, isFirstTeamPlayersChecked,
isLiveMatch, isLiveMatch,
isOpenFiltersPopup, isOpenFiltersPopup,
isPlayFilterEpisodes: isStatsTab ? isStatsPlayFilterEpisodes : isPlayFilterEpisodes, isPlayFilterEpisodes: isStatsPlaylist ? isStatsPlayFilterEpisodes : isPlayFilterEpisodes,
isPlayersStatsFetching, isPlayersStatsFetching,
isPlayingEpisode, isPlayingEpisode,
isSecondTeamPlayersChecked, isSecondTeamPlayersChecked,
@ -430,13 +435,13 @@ export const useMatchPage = () => {
likeImage, likeImage,
likeToggle, likeToggle,
matchPlaylists, matchPlaylists,
plaingOrder: isStatsTab ? statsPlaingOrder : plaingOrder,
playEpisodes, playEpisodes,
playNextEpisode: isStatsTab ? playStatsNextEpisode : playNextEpisode, playNextEpisode: isStatsPlaylist ? playStatsNextEpisode : playNextEpisode,
playStatsEpisodes, playStatsEpisodes,
playersData, playersData,
playersStats, playersStats,
playingData, playingData,
playingOrder: isStatsPlaylist ? statsPlaingOrder : playingOrder,
playingProgress, playingProgress,
profile, profile,
profileCardShown, profileCardShown,
@ -445,13 +450,13 @@ export const useMatchPage = () => {
selectedPlaylist, selectedPlaylist,
selectedStatsTable, selectedStatsTable,
selectedTab, selectedTab,
setCircleAnimation: isStatsTab ? setStatsCircleAnimation : setCircleAnimation, setCircleAnimation: isStatsPlaylist ? setStatsCircleAnimation : setCircleAnimation,
setEpisodeInfo, setEpisodeInfo,
setFullMatchPlaylistDuration, setFullMatchPlaylistDuration,
setIsPlayingFiltersEpisodes: isStatsTab setIsPlayingFiltersEpisodes: isStatsPlaylist
? setStatsIsPlayinFiltersEpisodes ? setStatsIsPlayinFiltersEpisodes
: setIsPlayersStatsFetching, : setIsPlayersStatsFetching,
setPlaingOrder: isStatsTab ? setStatsPlaingOrder : setPlaingOrder, setPlaingOrder: isStatsPlaylist ? setStatsPlaingOrder : setPlaingOrder,
setPlayingData, setPlayingData,
setPlayingProgress, setPlayingProgress,
setReversed, setReversed,
@ -459,9 +464,10 @@ export const useMatchPage = () => {
setSelectedTab, setSelectedTab,
setStatsType, setStatsType,
setUnreversed, setUnreversed,
setWatchAllEpisodesTimer: isStatsTab ? setStatsWatchAllEpisodesTimer : setWatchAllEpisodesTimer, setWatchAllEpisodesTimer: isStatsPlaylist
? setStatsWatchAllEpisodesTimer
: setWatchAllEpisodesTimer,
showProfileCard, showProfileCard,
statsPlaingOrder,
statsType, statsType,
teamsStats, teamsStats,
toggleActiveEvents, toggleActiveEvents,
@ -472,6 +478,6 @@ export const useMatchPage = () => {
tournamentData, tournamentData,
uniqEvents, uniqEvents,
user, user,
watchAllEpisodesTimer: isStatsTab ? statsWatchAllEpisodesTimer : watchAllEpisodesTimer, watchAllEpisodesTimer: isStatsPlaylist ? statsWatchAllEpisodesTimer : watchAllEpisodesTimer,
} }
} }

@ -11,7 +11,6 @@ import { usePageParams, useInterval } from 'hooks'
import { FULL_GAME_KEY } from 'features/MatchPage/helpers/buildPlaylists' import { FULL_GAME_KEY } from 'features/MatchPage/helpers/buildPlaylists'
import { useDuration } from 'features/MultiSourcePlayer/hooks/useDuration' import { useDuration } from 'features/MultiSourcePlayer/hooks/useDuration'
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'
@ -21,10 +20,9 @@ const MATCH_DATA_POLL_INTERVAL = 5000
type UseMatchDataArgs = { type UseMatchDataArgs = {
matchProfile: MatchInfo, matchProfile: MatchInfo,
selectedTab: Tabs,
} }
export const useMatchData = ({ matchProfile: profile, selectedTab }: UseMatchDataArgs) => { export const useMatchData = ({ matchProfile: profile }: 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)
@ -35,7 +33,7 @@ export const useMatchData = ({ matchProfile: profile, selectedTab }: UseMatchDat
selectedPlaylist, selectedPlaylist,
setFullMatchPlaylistDuration, setFullMatchPlaylistDuration,
setSelectedPlaylist, setSelectedPlaylist,
} = useMatchPlaylists({ matchProfile: profile, selectedTab }) } = useMatchPlaylists({ matchProfile: profile })
const { events, fetchMatchEvents } = useEvents() const { events, fetchMatchEvents } = useEvents()

@ -13,7 +13,6 @@ import { usePageParams } from 'hooks/usePageParams'
import type { Playlists } from 'features/MatchPage/types' import type { Playlists } from 'features/MatchPage/types'
import { buildPlaylists, FULL_GAME_KEY } from 'features/MatchPage/helpers/buildPlaylists' import { buildPlaylists, FULL_GAME_KEY } from 'features/MatchPage/helpers/buildPlaylists'
import { Tabs } from 'features/MatchSidePlaylists/config'
import { usePlaylistLexics } from './usePlaylistLexics' import { usePlaylistLexics } from './usePlaylistLexics'
import { initialPlaylist, useSelectedPlaylist } from './useSelectedPlaylist' import { initialPlaylist, useSelectedPlaylist } from './useSelectedPlaylist'
@ -26,14 +25,12 @@ type ArgsFetchMatchPlaylists = {
type UseMatchPlaylistsArgs = { type UseMatchPlaylistsArgs = {
matchProfile: MatchInfo, matchProfile: MatchInfo,
selectedTab: Tabs,
} }
const initialPlaylists = buildPlaylists(null) const initialPlaylists = buildPlaylists(null)
export const useMatchPlaylists = ({ export const useMatchPlaylists = ({
matchProfile: profile, matchProfile: profile,
selectedTab,
}: UseMatchPlaylistsArgs) => { }: UseMatchPlaylistsArgs) => {
const [matchPlaylists, setMatchPlaylists] = useState<Playlists>(initialPlaylists) const [matchPlaylists, setMatchPlaylists] = useState<Playlists>(initialPlaylists)
@ -43,7 +40,7 @@ export const useMatchPlaylists = ({
handlePlaylistClick, handlePlaylistClick,
selectedPlaylist, selectedPlaylist,
setSelectedPlaylist, setSelectedPlaylist,
} = useSelectedPlaylist({ selectedTab }) } = useSelectedPlaylist()
const setInitialSeletedPlaylist = useCallback((playlists: Playlists) => { const setInitialSeletedPlaylist = useCallback((playlists: Playlists) => {
setSelectedPlaylist((playlist) => { setSelectedPlaylist((playlist) => {

@ -21,14 +21,17 @@ export const initialPlaylist = {
episodes: [], episodes: [],
id: FULL_GAME_KEY, id: FULL_GAME_KEY,
lexic: indexLexics.full_game, lexic: indexLexics.full_game,
tab: Tabs.WATCH,
type: 0, type: 0,
} }
type UseSelectedPlaylistArgs = { type HandlePlaylistClickArgs = {
selectedTab: Tabs, e?: MouseEvent,
playlist: PlaylistOption,
tab: Tabs,
} }
export const useSelectedPlaylist = ({ selectedTab }: UseSelectedPlaylistArgs) => { export const useSelectedPlaylist = () => {
const { profileId: matchId, sportType } = usePageParams() const { profileId: matchId, sportType } = usePageParams()
const [selectedPlaylist, setSelectedPlaylist] = useState<PlaylistOption>(initialPlaylist) const [selectedPlaylist, setSelectedPlaylist] = useState<PlaylistOption>(initialPlaylist)
@ -41,7 +44,11 @@ export const useSelectedPlaylist = ({ selectedTab }: UseSelectedPlaylistArgs) =>
}) })
), [matchId, sportType]) ), [matchId, sportType])
const handlePlaylistClick = useCallback((playlist: PlaylistOption, e?: MouseEvent) => { const handlePlaylistClick = useCallback(({
e,
playlist,
tab,
}: HandlePlaylistClickArgs) => {
e?.stopPropagation() e?.stopPropagation()
if (playlist === selectedPlaylist) return if (playlist === selectedPlaylist) return
@ -50,16 +57,16 @@ export const useSelectedPlaylist = ({ selectedTab }: UseSelectedPlaylistArgs) =>
setSelectedPlaylist({ setSelectedPlaylist({
...playlist, ...playlist,
episodes, episodes,
tab,
}) })
}) })
} else { } else {
setSelectedPlaylist({ setSelectedPlaylist({
...playlist, ...playlist,
// @ts-expect-error tab,
tab: selectedTab,
}) })
} }
}, [fetchPlayerEpisodes, selectedPlaylist, selectedTab]) }, [fetchPlayerEpisodes, selectedPlaylist])
return { return {
handlePlaylistClick, handlePlaylistClick,

@ -14,12 +14,19 @@ import type { EventPlaylistOption, PlaylistOption } from 'features/MatchPage/typ
import type { TCircleAnimation } from 'features/CircleAnimationBar' import type { TCircleAnimation } from 'features/CircleAnimationBar'
import { initialCircleAnimation } from 'features/CircleAnimationBar' import { initialCircleAnimation } from 'features/CircleAnimationBar'
import { PlaylistTypes } from 'features/MatchPage/types' import { PlaylistTypes } from 'features/MatchPage/types'
import { StatsType, Tabs } from 'features/MatchSidePlaylists/components/TabStats/config' import { StatsType, Tabs as StatsTabs } from 'features/MatchSidePlaylists/components/TabStats/config'
import { Tabs } from 'features/MatchSidePlaylists/config'
import { useToggle } from 'hooks' import { useToggle } from 'hooks'
type HandlePlaylistClickArgs = {
playlist: PlaylistOption,
tab: Tabs,
}
type UseStatsTabArgs = { type UseStatsTabArgs = {
disablePlayingEpisodes: () => void, disablePlayingEpisodes: () => void,
handlePlaylistClick: (playlist: PlaylistOption) => void, handlePlaylistClick: (args: HandlePlaylistClickArgs) => void,
matchProfile: MatchInfo, matchProfile: MatchInfo,
selectedPlaylist?: PlaylistOption, selectedPlaylist?: PlaylistOption,
} }
@ -52,11 +59,11 @@ export const useStatsTab = ({
const [isTeamsStatsFetching, setIsTeamsStatsFetching] = useState(false) const [isTeamsStatsFetching, setIsTeamsStatsFetching] = useState(false)
const [stateEpisodesToPlay, setEpisodesToPlay] = useState<Array<EventPlaylistOption>>([]) const [stateEpisodesToPlay, setEpisodesToPlay] = useState<Array<EventPlaylistOption>>([])
const [filteredEvents, setFilteredEvents] = useState<Events>([]) const [filteredEvents, setFilteredEvents] = useState<Events>([])
const [plaingOrder, setPlaingOrder] = useState(0) const [playingOrder, setPlaingOrder] = useState(0)
const [isPlayFilterEpisodes, setIsPlayingFiltersEpisodes] = useState(false) const [isPlayFilterEpisodes, setIsPlayingFiltersEpisodes] = useState(false)
const [watchAllEpisodesTimer, setWatchAllEpisodesTimer] = useState(false) const [watchAllEpisodesTimer, setWatchAllEpisodesTimer] = useState(false)
const [circleAnimation, setCircleAnimation] = useState<TCircleAnimation>(initialCircleAnimation) const [circleAnimation, setCircleAnimation] = useState<TCircleAnimation>(initialCircleAnimation)
const [selectedStatsTable, setSelectedStatsTable] = useState<Tabs>(Tabs.TEAMS) const [selectedStatsTable, setSelectedStatsTable] = useState<StatsTabs>(StatsTabs.TEAMS)
const { const {
close: reduceTable, close: reduceTable,
@ -92,7 +99,7 @@ export const useStatsTab = ({
episodesToPlay = stateEpisodesToPlay, episodesToPlay = stateEpisodesToPlay,
order, order,
}: PlayNextEpisodeArgs = {}) => { }: PlayNextEpisodeArgs = {}) => {
const currentOrder = order === 0 ? order : plaingOrder const currentOrder = order === 0 ? order : playingOrder
const isLastEpisode = currentOrder === episodesToPlay.length const isLastEpisode = currentOrder === episodesToPlay.length
if (isLastEpisode) { if (isLastEpisode) {
@ -103,7 +110,10 @@ export const useStatsTab = ({
} }
if (currentOrder !== 0) { if (currentOrder !== 0) {
handlePlaylistClick(episodesToPlay[currentOrder]) handlePlaylistClick({
playlist: episodesToPlay[currentOrder],
tab: Tabs.STATS,
})
} }
setPlaingOrder(currentOrder + 1) setPlaingOrder(currentOrder + 1)
@ -120,7 +130,10 @@ export const useStatsTab = ({
setWatchAllEpisodesTimer(true) setWatchAllEpisodesTimer(true)
setIsPlayingFiltersEpisodes(true) setIsPlayingFiltersEpisodes(true)
handlePlaylistClick(episodesToPlay[0]) handlePlaylistClick({
playlist: episodesToPlay[0],
tab: Tabs.STATS,
})
playNextEpisode({ episodesToPlay, order: 0 }) playNextEpisode({ episodesToPlay, order: 0 })
} }
@ -137,9 +150,9 @@ export const useStatsTab = ({
isPlayFilterEpisodes, isPlayFilterEpisodes,
isPlayersStatsFetching, isPlayersStatsFetching,
isTeamsStatsFetching, isTeamsStatsFetching,
plaingOrder,
playEpisodes, playEpisodes,
playNextEpisode, playNextEpisode,
playingOrder,
reduceTable, reduceTable,
selectedStatsTable, selectedStatsTable,
setCircleAnimation, setCircleAnimation,

@ -17,6 +17,7 @@ export type MatchPlaylistOption = {
episodes: Episodes, episodes: Episodes,
id: MatchPlaylistIds, id: MatchPlaylistIds,
lexic: number | string, lexic: number | string,
tab?: Tabs,
type: PlaylistTypes.MATCH, type: PlaylistTypes.MATCH,
} }
@ -29,6 +30,7 @@ export type PlayerPlaylistOption = {
name_rus: string, name_rus: string,
num: string, num: string,
start?: boolean, start?: boolean,
tab?: Tabs,
type: PlaylistTypes.PLAYER, type: PlaylistTypes.PLAYER,
} }
@ -37,6 +39,7 @@ export type InterviewPlaylistOption = {
id: number, id: number,
name_eng: string, name_eng: string,
name_rus: string, name_rus: string,
tab?: Tabs,
type: PlaylistTypes.INTERVIEW, type: PlaylistTypes.INTERVIEW,
} }

@ -1,5 +1,7 @@
import { useEffect } from 'react'
import map from 'lodash/map' import map from 'lodash/map'
// import find from 'lodash/find' import find from 'lodash/find'
import type { Events, MatchInfo } from 'requests' import type { Events, MatchInfo } from 'requests'
@ -12,9 +14,9 @@ import type {
} from 'features/MatchPage/types' } from 'features/MatchPage/types'
import { PlaylistTypes } from 'features/MatchPage/types' import { PlaylistTypes } from 'features/MatchPage/types'
// import { useMatchPageStore } from 'features/MatchPage/store' import { useMatchPageStore } from 'features/MatchPage/store'
// import { useLexicsStore } from 'features/LexicsStore' import { useLexicsStore } from 'features/LexicsStore'
// import { Tabs } from 'features/MatchSidePlaylists/config' import { Tabs } from 'features/MatchSidePlaylists/config'
import { isEqual } from '../../helpers' import { isEqual } from '../../helpers'
import { EventButton } from '../EventButton' import { EventButton } from '../EventButton'
@ -41,68 +43,100 @@ export const EventsList = ({
profile, profile,
selectedPlaylist, selectedPlaylist,
setWatchAllEpisodesTimer, setWatchAllEpisodesTimer,
}: Props) => ( }: Props) => {
<List> const {
{map(events, (event) => { filteredEvents,
if (!event.t && !event.pl) { isPlayingEpisode,
return ( selectedTab,
<TextEvent key={event.n}> setEpisodeInfo,
<BlockTitle> } = useMatchPageStore()
<T9n t={event.l} /> const { suffix, translate } = useLexicsStore()
</BlockTitle>
</TextEvent> useEffect(() => {
) if (selectedPlaylist?.tab === Tabs.EVENTS && isPlayingEpisode) {
const {
e,
h,
s,
} = selectedPlaylist.episodes[0]
const event = find(events, {
e,
h,
s,
})
if (event) {
const playerName = event.pl?.[`name_${suffix}`]
const teamName = event.t === profile?.team1.id
? profile?.team1[`name_${suffix}`]
: profile?.team2[`name_${suffix}`]
setEpisodeInfo({
episodesCount: filteredEvents.length,
paramName: translate(event.l),
playerOrTeamName: playerName || teamName || '',
})
} }
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [isPlayingEpisode, selectedPlaylist, suffix])
const repeatedEpisodes = event.rep || [] return (
const eventPlaylist = { <List>
episodes: [{ {map(events, (event) => {
e: event.e, if (!event.t && !event.pl) {
h: event.h, return (
s: event.s, <TextEvent key={event.n}>
}, <BlockTitle>
...repeatedEpisodes, <T9n t={event.l} />
], </BlockTitle>
id: event.n, </TextEvent>
type: PlaylistTypes.EVENT, )
} as EventPlaylistOption
const isHomeTeam = event.t === profile?.team1.id
const team = isHomeTeam
? profile?.team1
: profile?.team2
const eventWithoutClick = isLffClient && profile?.live
const eventClick = () => {
setWatchAllEpisodesTimer(false)
!eventWithoutClick && onSelect(eventPlaylist)
if (disablePlayingEpisodes) {
disablePlayingEpisodes()
} }
// const playerName = event.pl?.[`name_${suffix}`] const repeatedEpisodes = event.rep || []
// const teamName = event.t === profile?.team1.id const eventPlaylist = {
// ? profile?.team1[`name_${suffix}`] episodes: [{
// : profile?.team2[`name_${suffix}`] e: event.e,
h: event.h,
s: event.s,
},
...repeatedEpisodes,
],
id: event.n,
type: PlaylistTypes.EVENT,
} as EventPlaylistOption
// setEpisodeInfo({ const isHomeTeam = event.t === profile?.team1.id
// paramName: translate(event.l), const team = isHomeTeam
// paramValue: filteredEvents.length, ? profile?.team1
// playerOrTeamName: playerName || teamName || '', : profile?.team2
// }) const eventWithoutClick = isLffClient && profile?.live
}
const eventClick = () => {
setWatchAllEpisodesTimer(false)
!eventWithoutClick && onSelect(eventPlaylist)
if (disablePlayingEpisodes) {
disablePlayingEpisodes()
}
}
const active = isEqual(eventPlaylist, selectedPlaylist)
&& selectedPlaylist?.tab === selectedTab
return ( return (
<Event key={event.n}> <Event key={event.n}>
<EventButton <EventButton
active={isEqual(eventPlaylist, selectedPlaylist)} active={active}
event={event} event={event}
isHomeTeam={isHomeTeam} isHomeTeam={isHomeTeam}
onClick={eventClick} onClick={eventClick}
team={team} team={team}
/> />
</Event> </Event>
) )
})} })}
</List> </List>
) )
}

@ -6,12 +6,18 @@ import styled, { css } from 'styled-components/macro'
import isEmpty from 'lodash/isEmpty' import isEmpty from 'lodash/isEmpty'
import map from 'lodash/map' import map from 'lodash/map'
import { isMobileDevice } from 'config/userAgent' import { isMobileDevice } from 'config'
import type { MatchPlaylistOptions, PlaylistOption } from 'features/MatchPage/types' import type {
MatchPlaylistOption,
MatchPlaylistOptions,
PlaylistOption,
} from 'features/MatchPage/types'
import { FULL_GAME_KEY } from 'features/MatchPage/helpers/buildPlaylists' import { FULL_GAME_KEY } from 'features/MatchPage/helpers/buildPlaylists'
import { isEqual } from 'features/MatchSidePlaylists/helpers' import { isEqual } from 'features/MatchSidePlaylists/helpers'
import { T9n } from 'features/T9n' import { T9n } from 'features/T9n'
import { useMatchPageStore } from 'features/MatchPage/store'
import { useLexicsStore } from 'features/LexicsStore'
import { PlayButton } from '../PlayButton' import { PlayButton } from '../PlayButton'
@ -54,26 +60,41 @@ export const MatchPlaylists = forwardRef(
selectedMathPlaylist, selectedMathPlaylist,
}: Props, }: Props,
ref: ForwardedRef<HTMLUListElement>, ref: ForwardedRef<HTMLUListElement>,
) => ( ) => {
<List ref={ref}> const { setEpisodeInfo } = useMatchPageStore()
{ const { translate } = useLexicsStore()
map(playlists, (playlist) => (
<Item const handleButtonClick = (playlist: MatchPlaylistOption) => {
key={playlist.id} onSelect?.(playlist)
id={`match_watch_${playlist.id}${live ? '_live' : ''}`}
> if (playlist.id === FULL_GAME_KEY) return
<PlayButton
duration={playlist.duration} setEpisodeInfo({
active={isEqual(playlist, selectedMathPlaylist)} paramName: translate(playlist.lexic),
live={live} })
disabled={playlist.id !== FULL_GAME_KEY && isEmpty(playlist.episodes)} }
onClick={() => onSelect?.(playlist)}
return (
<List ref={ref}>
{
map(playlists, (playlist) => (
<Item
key={playlist.id}
id={`match_watch_${playlist.id}${live ? '_live' : ''}`}
> >
<T9n t={playlist.lexic} /> <PlayButton
</PlayButton> duration={playlist.duration}
</Item> active={isEqual(playlist, selectedMathPlaylist)}
)) live={live}
} disabled={playlist.id !== FULL_GAME_KEY && isEmpty(playlist.episodes)}
</List> onClick={() => handleButtonClick(playlist)}
), >
<T9n t={playlist.lexic} />
</PlayButton>
</Item>
))
}
</List>
)
},
) )

@ -15,6 +15,8 @@ import type {
} from 'features/MatchPage/types' } from 'features/MatchPage/types'
import { Name } from 'features/Name' import { Name } from 'features/Name'
import { useMatchPageStore } from 'features/MatchPage/store'
import { useLexicsStore } from 'features/LexicsStore'
import { isEqual } from '../../helpers' import { isEqual } from '../../helpers'
@ -52,6 +54,15 @@ export const PlayersPlaylists = ({
}: Props) => { }: Props) => {
const { sportType } = usePageParams() const { sportType } = usePageParams()
const [selectedTeam, setSelectedTeam] = useState(Teams.TEAM1) const [selectedTeam, setSelectedTeam] = useState(Teams.TEAM1)
const { setEpisodeInfo } = useMatchPageStore()
const { suffix } = useLexicsStore()
const handleButtonClick = (player: PlayerPlaylistOption) => {
onSelect(player)
setEpisodeInfo({
playerOrTeamName: player[`name_${suffix}`],
})
}
if (!profile) return null if (!profile) return null
@ -80,7 +91,7 @@ export const PlayersPlaylists = ({
<PlayButton <PlayButton
active={isEqual(player, selectedMathPlaylist)} active={isEqual(player, selectedMathPlaylist)}
duration={player.dur} duration={player.dur}
onClick={() => onSelect(player)} onClick={() => handleButtonClick(player)}
leftContent={( leftContent={(
<PlayerAvatar <PlayerAvatar
id={player.id} id={player.id}

@ -13,7 +13,7 @@ export const usePlayersTable = ({ teamId }: PlayersTableProps) => {
paramId: null, paramId: null,
}) })
const { plaingOrder, setCircleAnimation } = useMatchPageStore() const { playingOrder, setCircleAnimation } = useMatchPageStore()
const { const {
getPlayerName, getPlayerName,
@ -47,9 +47,9 @@ export const usePlayersTable = ({ teamId }: PlayersTableProps) => {
useEffect(() => { useEffect(() => {
setCircleAnimation((state) => ({ setCircleAnimation((state) => ({
...state, ...state,
plaingOrder, playingOrder,
})) }))
}, [setCircleAnimation, plaingOrder]) }, [setCircleAnimation, playingOrder])
return { return {
containerRef, containerRef,

@ -197,8 +197,8 @@ export const useTable = ({
playStatsEpisodes(events) playStatsEpisodes(events)
setEpisodeInfo({ setEpisodeInfo({
episodesCount: param.val!,
paramName: translate(param.lexic), paramName: translate(param.lexic),
paramValue: param.val!,
playerOrTeamName: getPlayerName(player), playerOrTeamName: getPlayerName(player),
}) })
// eslint-disable-next-line no-empty // eslint-disable-next-line no-empty

@ -47,8 +47,8 @@ export const TabEvents = ({
isLiveMatch, isLiveMatch,
likeImage, likeImage,
likeToggle, likeToggle,
plaingOrder,
playEpisodes, playEpisodes,
playingOrder,
reversedGroupEvents, reversedGroupEvents,
setCircleAnimation, setCircleAnimation,
setReversed, setReversed,
@ -61,9 +61,9 @@ export const TabEvents = ({
useEffect(() => { useEffect(() => {
setCircleAnimation((state) => ({ setCircleAnimation((state) => ({
...state, ...state,
plaingOrder, playingOrder,
})) }))
}, [setCircleAnimation, plaingOrder]) }, [setCircleAnimation, playingOrder])
if (!profile) return null if (!profile) return null

@ -102,8 +102,8 @@ export const Cell = ({
playStatsEpisodes(events) playStatsEpisodes(events)
setEpisodeInfo({ setEpisodeInfo({
episodesCount: param.val!,
paramName, paramName,
paramValue: param.val!,
playerOrTeamName: teamId === profile?.team1.id playerOrTeamName: teamId === profile?.team1.id
? profile.team1[`name_${suffix}`] ? profile.team1[`name_${suffix}`]
: profile?.team2[`name_${suffix}`] || '', : profile?.team2[`name_${suffix}`] || '',

@ -7,7 +7,7 @@ import { useMatchPageStore } from 'features/MatchPage/store'
export const useTeamsStatsTable = () => { export const useTeamsStatsTable = () => {
const { const {
getFirstClickableParam, getFirstClickableParam,
plaingOrder, playingOrder,
profile, profile,
setCircleAnimation, setCircleAnimation,
teamsStats, teamsStats,
@ -22,9 +22,9 @@ export const useTeamsStatsTable = () => {
useEffect(() => { useEffect(() => {
setCircleAnimation((state) => ({ setCircleAnimation((state) => ({
...state, ...state,
plaingOrder, playingOrder,
})) }))
}, [setCircleAnimation, plaingOrder]) }, [setCircleAnimation, playingOrder])
return { return {
firstClickableParam: getFirstClickableParam(teamsStats), firstClickableParam: getFirstClickableParam(teamsStats),

@ -91,7 +91,7 @@ export const useMultiSourcePlayer = ({
isPlayFilterEpisodes, isPlayFilterEpisodes,
isPlayingEpisode, isPlayingEpisode,
matchPlaylists, matchPlaylists,
plaingOrder, playingOrder,
playingProgress, playingProgress,
playNextEpisode, playNextEpisode,
selectedPlaylist, selectedPlaylist,
@ -245,6 +245,7 @@ export const useMultiSourcePlayer = ({
const backToPausedTime = useCallback(() => { const backToPausedTime = useCallback(() => {
if (selectedPlaylist?.id !== FULL_GAME_KEY) { if (selectedPlaylist?.id !== FULL_GAME_KEY) {
// @ts-expect-error
handlePlaylistClick(matchPlaylists.match[0]) handlePlaylistClick(matchPlaylists.match[0])
} }
@ -273,9 +274,24 @@ export const useMultiSourcePlayer = ({
setPlayerState({ playing: false }) setPlayerState({ playing: false })
} }
const restartVideo = () => {
// @ts-expect-error
handlePlaylistClick(matchPlaylists.match[0])
}
const stopPlayingEpisodes = () => { const stopPlayingEpisodes = () => {
disablePlayingEpisodes() disablePlayingEpisodes()
backToPausedTime() restartVideo()
setTimeout(() => {
andrey.dekterev marked this conversation as resolved

clearTimeout

clearTimeout

mp4 все равно будет удаляться, код был написан до того как обсуждали об его удалении

mp4 все равно будет удаляться, код был написан до того как обсуждали об его удалении
setPlayerState((state) => ({
activeChapterIndex: pausedData.activeChapterIndex,
playedProgress: pausedData.playedProgress,
seek: {
...state.seek,
[pausedData.activePlayer]: pausedData.playedProgress / 1000,
},
}))
}, 1000)
} }
useEffect(() => { useEffect(() => {
@ -414,18 +430,18 @@ export const useMultiSourcePlayer = ({
elem[1] + 1, elem[1] + 1,
)) ))
if (index !== -1 && ordersObj.current[plaingOrder] !== index) { if (index !== -1 && ordersObj.current[playingOrder] !== index) {
ordersObj.current = { ordersObj.current = {
...ordersObj.current, ...ordersObj.current,
[plaingOrder]: index, [playingOrder]: index,
} }
} }
return plaingOrder + sum(values(ordersObj.current)) return playingOrder + sum(values(ordersObj.current))
} }
setCurrentPlayingOrder(getCurrentPlayingOrder()) setCurrentPlayingOrder(getCurrentPlayingOrder())
}, [getActiveChapter, isPlayingEpisode, plaingOrder, playingProgress]) }, [getActiveChapter, isPlayingEpisode, playingOrder, playingProgress])
useEffect(() => { useEffect(() => {
if (!isPlayingEpisode) { if (!isPlayingEpisode) {

@ -117,16 +117,18 @@ export const MultiSourcePlayer = (props: Props) => {
{isMobileDevice {isMobileDevice
? ( ? (
<Fragment> <Fragment>
{episodeInfo.playerOrTeamName} <br /> {episodeInfo.paramName} {episodeInfo.playerOrTeamName}
{episodeInfo.playerOrTeamName && <br />}
{episodeInfo.paramName}
</Fragment> </Fragment>
) )
: `${episodeInfo.playerOrTeamName}${episodeInfo.playerOrTeamName ? ' - ' : ''}${episodeInfo.paramName}`} : `${episodeInfo.playerOrTeamName || ''}${episodeInfo.paramName && episodeInfo.playerOrTeamName ? ' - ' : ''}${episodeInfo.paramName || ''}`}
</EpisodeInfoName> </EpisodeInfoName>
{currentPlayingOrder > 0 && ( {currentPlayingOrder > 0 && (
<EpisodeInfoOrder> <EpisodeInfoOrder>
{currentPlayingOrder} {currentPlayingOrder}
<EpisodeInfoDivider>/</EpisodeInfoDivider> <EpisodeInfoDivider>/</EpisodeInfoDivider>
{episodeInfo.paramValue} {episodeInfo.episodesCount}
</EpisodeInfoOrder> </EpisodeInfoOrder>
)} )}
<CloseButton onClick={stopPlayingEpisodes} /> <CloseButton onClick={stopPlayingEpisodes} />

@ -109,12 +109,12 @@ export const useVideoPlayer = ({
isPlayFilterEpisodes, isPlayFilterEpisodes,
isPlayingEpisode, isPlayingEpisode,
matchPlaylists, matchPlaylists,
playingOrder,
playingProgress, playingProgress,
playNextEpisode, playNextEpisode,
selectedPlaylist, selectedPlaylist,
setCircleAnimation, setCircleAnimation,
setPlayingProgress, setPlayingProgress,
statsPlaingOrder,
} = useMatchPageStore() } = useMatchPageStore()
const { isOpen } = useTour() const { isOpen } = useTour()
@ -142,7 +142,7 @@ export const useVideoPlayer = ({
// временно закоментил, если ничего не сломается, удалю // временно закоментил, если ничего не сломается, удалю
// const [isLivePlaying, setIsLivePlaying] = useState(false) // const [isLivePlaying, setIsLivePlaying] = useState(false)
const [isPausedTime, setIsPausedTime] = useState(false) const [isPausedTime, setIsPausedTime] = useState(false)
const [pausedProgress, setPausedProgress] = useState(0) const pausedProgress = useRef(0)
const getActiveChapter = useCallback( const getActiveChapter = useCallback(
(index: number = activeChapterIndex) => chapters[index], (index: number = activeChapterIndex) => chapters[index],
@ -173,18 +173,18 @@ export const useVideoPlayer = ({
elem[1] + 1, elem[1] + 1,
)) ))
if (index !== -1 && ordersObj.current[statsPlaingOrder] !== index) { if (index !== -1 && ordersObj.current[playingOrder] !== index) {
ordersObj.current = { ordersObj.current = {
...ordersObj.current, ...ordersObj.current,
[statsPlaingOrder]: index, [playingOrder]: index,
} }
} }
return statsPlaingOrder + sum(values(ordersObj.current)) return playingOrder + sum(values(ordersObj.current))
} }
setCurrentPlayingOrder(getCurrentPlayingOrder()) setCurrentPlayingOrder(getCurrentPlayingOrder())
}, [getActiveChapter, isPlayingEpisode, statsPlaingOrder, playingProgress]) }, [getActiveChapter, isPlayingEpisode, playingOrder, playingProgress])
useEffect(() => { useEffect(() => {
if (!isPlayingEpisode) { if (!isPlayingEpisode) {
@ -342,7 +342,8 @@ export const useVideoPlayer = ({
} }
const liveProgressMs = Math.max(duration - BUFFERING_TIME, 0) const liveProgressMs = Math.max(duration - BUFFERING_TIME, 0)
setPlayerState({ playedProgress: pausedProgress, seek: pausedProgress / 1000 })
setPlayerState({ playedProgress: pausedProgress.current, seek: pausedProgress.current / 1000 })
if (liveProgressMs > 0) setIsPausedTime(false) if (liveProgressMs > 0) setIsPausedTime(false)
// eslint-disable-next-line // eslint-disable-next-line
}, [ }, [
@ -355,12 +356,18 @@ export const useVideoPlayer = ({
const stopPlayingEpisodes = () => { const stopPlayingEpisodes = () => {
disablePlayingEpisodes() disablePlayingEpisodes()
backToPausedTime() restartVideo()
setTimeout(() => {
andrey.dekterev marked this conversation as resolved

clearTimeout

clearTimeout

это действие вызывается после клика пользователя, тут нет смысла делать clearTimeout, за 100 мс компонент не успеет размонтироваться

это действие вызывается после клика пользователя, тут нет смысла делать clearTimeout, за 100 мс компонент не успеет размонтироваться
setPlayerState({
playedProgress: pausedProgress.current,
seek: pausedProgress.current / 1000,
})
}, 100)
} }
useEffect(() => { useEffect(() => {
if (chapters[0]?.isFullMatchChapter) { if (chapters[0]?.isFullMatchChapter) {
setPausedProgress(playedProgress + chapters[0].startOffsetMs) pausedProgress.current = playedProgress + chapters[0].startOffsetMs
} }
// eslint-disable-next-line // eslint-disable-next-line
}, [selectedPlaylist]) }, [selectedPlaylist])

@ -126,16 +126,18 @@ export const StreamPlayer = (props: Props) => {
{isMobileDevice {isMobileDevice
? ( ? (
<Fragment> <Fragment>
{episodeInfo.playerOrTeamName} <br /> {episodeInfo.paramName} {episodeInfo.playerOrTeamName}
{episodeInfo.playerOrTeamName && <br />}
{episodeInfo.paramName}
</Fragment> </Fragment>
) )
: `${episodeInfo.playerOrTeamName}${episodeInfo.playerOrTeamName ? ' - ' : ''}${episodeInfo.paramName}`} : `${episodeInfo.playerOrTeamName || ''}${episodeInfo.paramName && episodeInfo.playerOrTeamName ? ' - ' : ''}${episodeInfo.paramName || ''}`}
</EpisodeInfoName> </EpisodeInfoName>
{currentPlayingOrder > 0 && ( {currentPlayingOrder > 0 && (
<EpisodeInfoOrder> <EpisodeInfoOrder>
{currentPlayingOrder} {currentPlayingOrder}
<EpisodeInfoDivider /> <EpisodeInfoDivider />
{episodeInfo.paramValue} {episodeInfo.episodesCount}
</EpisodeInfoOrder> </EpisodeInfoOrder>
)} )}
<CloseButton onClick={stopPlayingEpisodes} /> <CloseButton onClick={stopPlayingEpisodes} />

@ -406,7 +406,7 @@ export const Next = styled(Prev)`
export const TeamsDetailsWrapper = styled.div` export const TeamsDetailsWrapper = styled.div`
position: absolute; position: absolute;
top: 20px; top: 40px;
left: 15px; left: 15px;
font-size: 16px; font-size: 16px;
color: #FFFFFF; color: #FFFFFF;
@ -434,8 +434,10 @@ export const EpisodeInfo = styled.div`
display: flex; display: flex;
align-items: center; align-items: center;
gap: max(0.755rem, 12px); gap: max(0.755rem, 12px);
padding: 2px;
font-weight: 600; font-weight: 600;
color: ${({ theme }) => theme.colors.white}; color: ${({ theme }) => theme.colors.white};
background-color: rgba(0, 0, 0, 0.3);
z-index: 1; z-index: 1;
` `

Loading…
Cancel
Save