Ott 748 popup players list (#281)
* feat(748): split start and bench players * refactor(748): moved players avatar preloading to upper component and simplified * refactor(748): renamed component * fix(748): added scrolling to players listkeep-around/af30b88d367751c9e05a735e4a0467a96238ef47
parent
f9702c9d2f
commit
dd87080d1b
@ -0,0 +1,75 @@ |
||||
import { |
||||
useMemo, |
||||
useState, |
||||
useCallback, |
||||
} from 'react' |
||||
|
||||
import map from 'lodash/map' |
||||
import every from 'lodash/every' |
||||
import groupBy from 'lodash/groupBy' |
||||
|
||||
import type { PlayerPlaylistOptions } from 'features/MatchPage/types' |
||||
import { Loader } from 'features/Loader' |
||||
|
||||
import { Teams } from '../../types' |
||||
import { PlayersList } from '../PlayersList' |
||||
import { ListsWrapper, LoaderWrapper } from './styled' |
||||
|
||||
const useItemsLoadedState = (items: PlayerPlaylistOptions) => { |
||||
const [loadedIds, setLoadedIds] = useState<Record<number, number>>({}) |
||||
|
||||
const onLoad = useCallback((id: number) => { |
||||
setLoadedIds((state) => ({ ...state, [id]: id })) |
||||
}, []) |
||||
|
||||
const allLoaded = useMemo(() => { |
||||
const ids = map(items, ({ id }) => id) |
||||
return every(ids, (id) => Boolean(loadedIds[id])) |
||||
}, [items, loadedIds]) |
||||
|
||||
return { |
||||
allLoaded, |
||||
onLoad, |
||||
} |
||||
} |
||||
|
||||
type Props = { |
||||
players: PlayerPlaylistOptions, |
||||
team: Teams, |
||||
} |
||||
|
||||
export const GroupedPlayersList = ({ |
||||
players, |
||||
team, |
||||
}: Props) => { |
||||
const { allLoaded, onLoad } = useItemsLoadedState(players) |
||||
|
||||
const { benchedPlayers, startingPlayers } = groupBy( |
||||
players, |
||||
({ start }) => (start ? 'startingPlayers' : 'benchedPlayers'), |
||||
) |
||||
|
||||
return ( |
||||
<ListsWrapper> |
||||
{ |
||||
!allLoaded && ( |
||||
<LoaderWrapper> |
||||
<Loader color='#515151' /> |
||||
</LoaderWrapper> |
||||
) |
||||
} |
||||
<PlayersList |
||||
team={team} |
||||
players={startingPlayers} |
||||
allLoaded={allLoaded} |
||||
onLoad={onLoad} |
||||
/> |
||||
<PlayersList |
||||
team={team} |
||||
players={benchedPlayers} |
||||
allLoaded={allLoaded} |
||||
onLoad={onLoad} |
||||
/> |
||||
</ListsWrapper> |
||||
) |
||||
} |
||||
@ -0,0 +1,29 @@ |
||||
import styled from 'styled-components/macro' |
||||
|
||||
import { devices } from 'config' |
||||
|
||||
import { List } from '../PlayersList/styled' |
||||
|
||||
export const LoaderWrapper = styled.div` |
||||
position: absolute; |
||||
width: 100%; |
||||
height: 100%; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: center; |
||||
` |
||||
|
||||
export const ListsWrapper = styled.div` |
||||
position: relative; |
||||
width: 576px; |
||||
display: flex; |
||||
flex-direction: column; |
||||
|
||||
${List}:last-child { |
||||
margin-top: 25px; |
||||
} |
||||
|
||||
@media ${devices.mobile} { |
||||
width: 100%; |
||||
} |
||||
` |
||||
Loading…
Reference in new issue