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