feat(in-235): match player filter

pull/41/head
Margarita 3 years ago
parent 3aca022f7b
commit 474cad5925
  1. 41
      src/features/MatchPage/store/hooks/index.tsx
  2. 66
      src/features/MatchPage/store/hooks/useFitersPopup.tsx
  3. 68
      src/features/MatchSidePlaylists/components/FiltersPopup/index.tsx
  4. 57
      src/features/MatchSidePlaylists/components/FiltersPopup/styled.tsx
  5. 4
      src/features/PopupComponents/BaseButton/index.tsx

@ -41,22 +41,39 @@ export const useMatchPage = () => {
open: showProfileCard, open: showProfileCard,
} = useToggle(true) } = useToggle(true)
const {
events,
handlePlaylistClick,
matchPlaylists,
selectedPlaylist,
setFullMatchPlaylistDuration,
} = useMatchData(matchProfile)
const profile = matchProfile
const { const {
activeEvents, activeEvents,
activeFirstTeamPlayers, activeFirstTeamPlayers,
activeSecondTeamPlayers, activeSecondTeamPlayers,
allActionsToggle,
allPlayersToggle,
applyFilters, applyFilters,
close: closePopup, close: closePopup,
countOfFilters, countOfFilters,
filters, filters,
isAllActionsChecked,
isEmptyFilters, isEmptyFilters,
isFirstTeamPlayersChecked,
isOpen: isOpenFiltersPopup, isOpen: isOpenFiltersPopup,
resetEvents, isSecondTeamPlayersChecked,
resetPlayers,
toggle: togglePopup, toggle: togglePopup,
toggleActiveEvents, toggleActiveEvents,
toggleActivePlayers, toggleActivePlayers,
} = useFiltersPopup() uniqEvents,
} = useFiltersPopup({
events,
matchPlaylists,
})
useEffect(() => { useEffect(() => {
getMatchInfo(sportType, matchId).then(setMatchProfile) getMatchInfo(sportType, matchId).then(setMatchProfile)
@ -113,16 +130,6 @@ export const useMatchPage = () => {
return () => clearInterval(getIntervalMatch) return () => clearInterval(getIntervalMatch)
}) })
const {
events,
handlePlaylistClick,
matchPlaylists,
selectedPlaylist,
setFullMatchPlaylistDuration,
} = useMatchData(matchProfile)
const profile = matchProfile
const isStarted = useMemo(() => ( const isStarted = useMemo(() => (
profile?.date profile?.date
? parseDate(profile.date) < new Date() ? parseDate(profile.date) < new Date()
@ -202,6 +209,8 @@ export const useMatchPage = () => {
activeFirstTeamPlayers, activeFirstTeamPlayers,
activeSecondTeamPlayers, activeSecondTeamPlayers,
activeStatus, activeStatus,
allActionsToggle,
allPlayersToggle,
applyFilters, applyFilters,
closePopup, closePopup,
countOfFilters, countOfFilters,
@ -210,10 +219,13 @@ export const useMatchPage = () => {
filteredEvents, filteredEvents,
handlePlaylistClick, handlePlaylistClick,
hideProfileCard, hideProfileCard,
isAllActionsChecked,
isEmptyFilters, isEmptyFilters,
isFirstTeamPlayersChecked,
isLiveMatch, isLiveMatch,
isOpenFiltersPopup, isOpenFiltersPopup,
isPlayFilterEpisodes, isPlayFilterEpisodes,
isSecondTeamPlayersChecked,
isStarted, isStarted,
likeImage, likeImage,
likeToggle, likeToggle,
@ -223,8 +235,6 @@ export const useMatchPage = () => {
playNextEpisode, playNextEpisode,
profile, profile,
profileCardShown, profileCardShown,
resetEvents,
resetPlayers,
reversedGroupEvents, reversedGroupEvents,
selectedPlaylist, selectedPlaylist,
setFullMatchPlaylistDuration, setFullMatchPlaylistDuration,
@ -238,6 +248,7 @@ export const useMatchPage = () => {
toggleActivePlayers, toggleActivePlayers,
togglePopup, togglePopup,
tournamentData, tournamentData,
uniqEvents,
user, user,
watchAllEpisodesTimer, watchAllEpisodesTimer,
} }

@ -4,6 +4,13 @@ import includes from 'lodash/includes'
import filter from 'lodash/filter' import filter from 'lodash/filter'
import isEmpty from 'lodash/isEmpty' import isEmpty from 'lodash/isEmpty'
import size from 'lodash/size' import size from 'lodash/size'
import uniq from 'lodash/uniq'
import difference from 'lodash/difference'
import map from 'lodash/map'
import every from 'lodash/every'
import type { Events } from 'requests'
import type { Playlists } from 'features/MatchPage/types'
type TTogglePlayers = { type TTogglePlayers = {
id: Number, id: Number,
@ -15,13 +22,36 @@ type TFilters = {
players: Array<Number>, players: Array<Number>,
} }
export const useFiltersPopup = () => { type Props = {
events: Events,
matchPlaylists: Playlists,
}
export const useFiltersPopup = ({
events,
matchPlaylists,
}: Props) => {
const [isOpen, setIsOpen] = useState(false) const [isOpen, setIsOpen] = useState(false)
const [activeEvents, setActiveEvents] = useState<Array<Number>>([]) const [activeEvents, setActiveEvents] = useState<Array<Number>>([])
const [activeFirstTeamPlayers, setActiveFirstTeamPlayers] = useState<Array<Number>>([]) const [activeFirstTeamPlayers, setActiveFirstTeamPlayers] = useState<Array<Number>>([])
const [activeSecondTeamPlayers, setActiveSecondTeamPlayers] = useState<Array<Number>>([]) const [activeSecondTeamPlayers, setActiveSecondTeamPlayers] = useState<Array<Number>>([])
const [activeFilters, setActiveFilters] = useState<TFilters>({ events: [], players: [] }) const [activeFilters, setActiveFilters] = useState<TFilters>({ events: [], players: [] })
const currentEvents = filter(events, (event) => event.pl !== undefined
&& event.t !== undefined)
const uniqEvents = uniq(map(currentEvents, ({ l }) => l))
const uniqPlayersTeam1 = uniq(map(matchPlaylists.players.team1, ({ id }) => id))
const uniqPlayersTeam2 = uniq(map(matchPlaylists.players.team2, ({ id }) => id))
const isAllActionsChecked = every(uniqEvents, (el) => (includes(activeEvents, el)))
const isFirstTeamPlayersChecked = every(
uniqPlayersTeam1, (el) => (includes(activeFirstTeamPlayers, el)),
)
const isSecondTeamPlayersChecked = every(
uniqPlayersTeam2, (el) => (includes(activeSecondTeamPlayers, el)),
)
const toggle = () => { const toggle = () => {
setIsOpen(!isOpen) setIsOpen(!isOpen)
} }
@ -50,22 +80,28 @@ export const useFiltersPopup = () => {
: [...teamState, id]) : [...teamState, id])
} }
const resetPlayers = (team: string) => () => { const allPlayersToggle = (team: string) => () => {
const teamState = team === 'team1'
? activeFirstTeamPlayers
: activeSecondTeamPlayers
const setterTeamState = team === 'team1' const setterTeamState = team === 'team1'
? setActiveFirstTeamPlayers ? setActiveFirstTeamPlayers
: setActiveSecondTeamPlayers : setActiveSecondTeamPlayers
if (isEmpty(teamState)) return const uniqValues = team === 'team1'
setterTeamState([]) ? uniqPlayersTeam1
: uniqPlayersTeam2
const isAllPlayersChecked = team === 'team1'
? isFirstTeamPlayersChecked
: isSecondTeamPlayersChecked
isAllPlayersChecked
? setterTeamState((currentValues) => difference(currentValues, uniqValues))
: setterTeamState((currentValues) => uniq([...currentValues, ...uniqValues]))
} }
const resetEvents = () => { const allActionsToggle = () => {
if (isEmpty(activeEvents)) return isAllActionsChecked
setActiveEvents([]) ? setActiveEvents((currentValues) => difference(currentValues, uniqEvents))
: setActiveEvents((currentValues) => uniq([...currentValues, ...uniqEvents]))
} }
const applyFilters = () => { const applyFilters = () => {
@ -86,16 +122,20 @@ export const useFiltersPopup = () => {
activeEvents, activeEvents,
activeFirstTeamPlayers, activeFirstTeamPlayers,
activeSecondTeamPlayers, activeSecondTeamPlayers,
allActionsToggle,
allPlayersToggle,
applyFilters, applyFilters,
close, close,
countOfFilters, countOfFilters,
filters: activeFilters, filters: activeFilters,
isAllActionsChecked,
isEmptyFilters, isEmptyFilters,
isFirstTeamPlayersChecked,
isOpen, isOpen,
resetEvents, isSecondTeamPlayersChecked,
resetPlayers,
toggle, toggle,
toggleActiveEvents, toggleActiveEvents,
toggleActivePlayers, toggleActivePlayers,
uniqEvents,
} }
} }

@ -1,8 +1,7 @@
import uniq from 'lodash/uniq'
import map from 'lodash/map' import map from 'lodash/map'
import isEmpty from 'lodash/isEmpty'
import includes from 'lodash/includes' import includes from 'lodash/includes'
import filter from 'lodash/filter'
import { isMobileDevice } from 'config/userAgent'
import { T9n } from 'features/T9n' import { T9n } from 'features/T9n'
import { useMatchPageStore } from 'features/MatchPage/store' import { useMatchPageStore } from 'features/MatchPage/store'
@ -28,14 +27,18 @@ import {
} from './styled' } from './styled'
type TLabelProps = { type TLabelProps = {
checked: boolean,
player: PlayerPlaylistOption, player: PlayerPlaylistOption,
} }
const Label = ({ player }: TLabelProps) => { const Label = ({
checked,
player,
}: TLabelProps) => {
const { num } = player const { num } = player
return ( return (
<ItemText> <ItemText>
<PlayerNumber> <PlayerNumber checked={checked}>
{num} {num}
</PlayerNumber> </PlayerNumber>
<Name nameObj={player} /> <Name nameObj={player} />
@ -48,20 +51,19 @@ export const FiltersPopup = () => {
activeEvents, activeEvents,
activeFirstTeamPlayers, activeFirstTeamPlayers,
activeSecondTeamPlayers, activeSecondTeamPlayers,
allActionsToggle,
allPlayersToggle,
applyFilters, applyFilters,
closePopup, closePopup,
events, isAllActionsChecked,
isFirstTeamPlayersChecked,
isSecondTeamPlayersChecked,
matchPlaylists, matchPlaylists,
profile, profile,
resetEvents,
resetPlayers,
toggleActiveEvents, toggleActiveEvents,
toggleActivePlayers, toggleActivePlayers,
uniqEvents,
} = useMatchPageStore() } = useMatchPageStore()
const currentEvents = filter(events, (event) => event.pl !== undefined
&& event.t !== undefined)
const uniqEvents = uniq(map(currentEvents, ({ l }) => l))
const team1Name = useName(profile!.team1) const team1Name = useName(profile!.team1)
const team2Name = useName(profile!.team2) const team2Name = useName(profile!.team2)
@ -70,7 +72,10 @@ export const FiltersPopup = () => {
<PopupContainer> <PopupContainer>
<PopupInner> <PopupInner>
<CloseButtonContainer> <CloseButtonContainer>
<CloseButton onClick={closePopup} /> <CloseButton
size={isMobileDevice ? 8 : 16}
onClick={closePopup}
/>
</CloseButtonContainer> </CloseButtonContainer>
<PopupHeader> <PopupHeader>
<HeaderText> <HeaderText>
@ -80,8 +85,9 @@ export const FiltersPopup = () => {
<PartBlock> <PartBlock>
<MainCheckboxContainer> <MainCheckboxContainer>
<Checkbox <Checkbox
onChange={resetEvents} isMainCheckbox
checked={isEmpty(activeEvents)} onChange={allActionsToggle}
checked={isAllActionsChecked}
labelLexic='all_actions' labelLexic='all_actions'
/> />
</MainCheckboxContainer> </MainCheckboxContainer>
@ -100,41 +106,49 @@ export const FiltersPopup = () => {
<PartBlock> <PartBlock>
<MainCheckboxContainer> <MainCheckboxContainer>
<Checkbox <Checkbox
checked={isEmpty(activeFirstTeamPlayers)} isMainCheckbox
checked={isFirstTeamPlayersChecked}
label={team1Name} label={team1Name}
onChange={resetPlayers('team1')} onChange={allPlayersToggle('team1')}
/> />
</MainCheckboxContainer> </MainCheckboxContainer>
<ItemsContainer> <ItemsContainer>
{map(matchPlaylists.players.team1, ((player) => ( {map(matchPlaylists.players.team1, ((player) => {
const isCheckboxChecked = includes(activeFirstTeamPlayers, player.id)
return (
<ItemBlock key={player.id}> <ItemBlock key={player.id}>
<Checkbox <Checkbox
onChange={toggleActivePlayers({ id: player.id, team: 'team1' })} onChange={toggleActivePlayers({ id: player.id, team: 'team1' })}
checked={includes(activeFirstTeamPlayers, player.id)} checked={isCheckboxChecked}
label={(<Label player={player} />)} label={(<Label checked={isCheckboxChecked} player={player} />)}
/> />
</ItemBlock> </ItemBlock>
)))} )
}))}
</ItemsContainer> </ItemsContainer>
</PartBlock> </PartBlock>
<PartBlock> <PartBlock>
<MainCheckboxContainer> <MainCheckboxContainer>
<Checkbox <Checkbox
checked={isEmpty(activeSecondTeamPlayers)} isMainCheckbox
checked={isSecondTeamPlayersChecked}
label={team2Name} label={team2Name}
onChange={resetPlayers('team2')} onChange={allPlayersToggle('team2')}
/> />
</MainCheckboxContainer> </MainCheckboxContainer>
<ItemsContainer> <ItemsContainer>
{map(matchPlaylists.players.team2, ((player) => ( {map(matchPlaylists.players.team2, ((player) => {
const isCheckboxChecked = includes(activeSecondTeamPlayers, player.id)
return (
<ItemBlock key={player.id}> <ItemBlock key={player.id}>
<Checkbox <Checkbox
onChange={toggleActivePlayers({ id: player.id, team: 'team2' })} onChange={toggleActivePlayers({ id: player.id, team: 'team2' })}
checked={includes(activeSecondTeamPlayers, player.id)} checked={isCheckboxChecked}
label={(<Label player={player} />)} label={(<Label checked={isCheckboxChecked} player={player} />)}
/> />
</ItemBlock> </ItemBlock>
)))} )
}))}
</ItemsContainer> </ItemsContainer>
</PartBlock> </PartBlock>
</PopupInner> </PopupInner>

@ -8,6 +8,15 @@ import { NameStyled } from 'features/Name'
import { isMobileDevice } from 'config/userAgent' import { isMobileDevice } from 'config/userAgent'
import { BaseButton } from 'features/PopupComponents' import { BaseButton } from 'features/PopupComponents'
type CheckboxProps = {
checked: boolean,
isMainCheckbox?: boolean,
}
type PlayerNumberProps = {
checked: boolean,
}
export const PopupContainer = styled.div` export const PopupContainer = styled.div`
background: #333333; background: #333333;
box-shadow: 0px 2px 40px rgba(0, 0, 0, 0.6); box-shadow: 0px 2px 40px rgba(0, 0, 0, 0.6);
@ -35,6 +44,8 @@ export const PopupInner = styled.div`
max-height: 100%; max-height: 100%;
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;
padding-bottom: ${(isMobileDevice ? '20%' : '')};
${customScrollbar} ${customScrollbar}
` `
@ -81,8 +92,16 @@ export const HeaderText = styled.div`
export const PartBlock = styled.div` export const PartBlock = styled.div`
flex: 1 0 auto; flex: 1 0 auto;
border-bottom: 1px solid #505050;
padding: 17px 22px 17px 22px; padding: 17px 22px 17px 22px;
${isMobileDevice
? css`
border-bottom: 1px solid #505050;`
: css`
:not(:last-child) {
border-bottom: 1px solid #505050;
}
`};
` `
export const ItemsContainer = styled.ul` export const ItemsContainer = styled.ul`
@ -92,7 +111,7 @@ export const ItemsContainer = styled.ul`
` `
export const MainCheckboxContainer = styled.div` export const MainCheckboxContainer = styled.div`
margin-bottom: 15px; margin-bottom: ${(isMobileDevice ? '10px' : '15px')};
display: flex; display: flex;
` `
@ -107,14 +126,13 @@ export const ItemBlock = styled.div`
flex: 0 0 33.33%;`} flex: 0 0 33.33%;`}
` `
export const Checkbox = styled(BaseCheckbox)` export const Checkbox = styled(BaseCheckbox)<CheckboxProps>`
height: 28px; height: 28px;
display: block; display: block;
${Label} { ${Label} {
height: 100%; height: 100%;
font-style: normal; font-style: normal;
font-weight: 400;
${isMobileDevice ${isMobileDevice
? css` ? css`
@ -124,17 +142,27 @@ export const Checkbox = styled(BaseCheckbox)`
font-size: 14px; font-size: 14px;
line-height: 16px;`} line-height: 16px;`}
${({ checked }) => (checked ${({ checked, isMainCheckbox }) => (isMainCheckbox
? css`` ? css`
font-weight: 500;`
: css` : css`
color: rgba(255, 255, 255, 0.6);` color: ${checked ? 'rgba(255, 255, 255, 0.6)' : 'rgba(255, 255, 255, 0.3)'};
font-weight: 400;`
)} )}
} }
${CheckboxSvg} { ${CheckboxSvg} {
${({ checked, isMainCheckbox }) => (isMainCheckbox
? css`
width: ${(isMobileDevice ? '23px' : '20px')};
height: ${(isMobileDevice ? '23px' : '20px')};`
: css`
fill: ${checked ? 'rgba(255, 255, 255, 0.6)' : 'rgba(255, 255, 255, 0.3)'};
width: ${(isMobileDevice ? '18px' : '14px')};
height: ${(isMobileDevice ? '18px' : '14px')};
margin-left: ${(isMobileDevice ? '2px' : '3px')};`
)}
margin-right: 8px; margin-right: 8px;
width: 20px;
height: 20px;
} }
` `
@ -157,8 +185,6 @@ export const ItemText = styled.div`
width: 130px;`} width: 130px;`}
` `
export const TeamBlock = styled.div``
export const ButtonConatiner = styled.div` export const ButtonConatiner = styled.div`
display: flex; display: flex;
align-items: center; align-items: center;
@ -171,7 +197,8 @@ export const ButtonConatiner = styled.div`
bottom: 14px; bottom: 14px;
left: 50%; left: 50%;
transform: translate(-50%, 0);` transform: translate(-50%, 0);`
: css``} : css`
border-top: 1px solid #505050;`}
` `
export const Button = styled.button` export const Button = styled.button`
@ -191,12 +218,12 @@ export const Button = styled.button`
${isMobileDevice ${isMobileDevice
? css` ? css`
width: 301px;` width: 190px;`
: css` : css`
width: 167px;`} width: 167px;`}
` `
export const PlayerNumber = styled.span` export const PlayerNumber = styled.span<PlayerNumberProps>`
color: rgba(255, 255, 255, 0.7); color: ${({ checked }) => (checked ? '#fff' : 'rgba(255, 255, 255, 0.3)')};
margin-right: 5px; margin-right: 5px;
min-width: 14px; min-width: 14px;
font-size: 11px; font-size: 11px;

@ -31,8 +31,8 @@ export const BaseButton = styled.button<Props>`
${isMobileDevice ${isMobileDevice
? css` ? css`
width: 18px; width: 20px;
height: 18px; height: 20px;
padding: 4px; padding: 4px;
position: absolute; position: absolute;
top: -20px; top: -20px;

Loading…
Cancel
Save