GameSekector: isSelected, onSelect
This commit is contained in:
		
							parent
							
								
									d8d3406fe1
								
							
						
					
					
						commit
						6dea7ae63f
					
				@ -58,7 +58,7 @@ function ViewSelector({ games }) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function ViewProvider({ gamesReducer, players }) {
 | 
			
		||||
  const [/*games*/, dispatchGames] = gamesReducer;
 | 
			
		||||
  const [games, dispatchGames] = gamesReducer;
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <div className='ViewProvider'>
 | 
			
		||||
@ -66,9 +66,7 @@ function ViewProvider({ gamesReducer, players }) {
 | 
			
		||||
 | 
			
		||||
        <Route path='new' element={
 | 
			
		||||
          <NewGame
 | 
			
		||||
            onSelectPlayer={(whitePlayer, blackPlayer) => {
 | 
			
		||||
              dispatchGames({ type: 'nextNewGame', whitePlayer, blackPlayer })
 | 
			
		||||
            }}
 | 
			
		||||
            onSelectPlayer={(whitePlayer, blackPlayer) => dispatchGames({ type: 'nextNewGame', whitePlayer, blackPlayer })}
 | 
			
		||||
            players={players}
 | 
			
		||||
          />
 | 
			
		||||
        } />
 | 
			
		||||
@ -77,7 +75,8 @@ function ViewProvider({ gamesReducer, players }) {
 | 
			
		||||
          <GameSelector
 | 
			
		||||
            yours='GAME_PROPOSAL_WAIT_FOR_YOU'
 | 
			
		||||
            opponents='GAME_PROPOSAL_WAIT_FOR_OPPONENT'
 | 
			
		||||
            onClick={(uuid) => console.log("GameProposal", uuid)}
 | 
			
		||||
            isSelected={(uuid) => uuid === games.proposal.selectedUUID}
 | 
			
		||||
            onSelect={(selectedUUID) => dispatchGames({ type: 'nextProposal', selectedUUID })}
 | 
			
		||||
          />
 | 
			
		||||
        } />
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -13,6 +13,13 @@ hr {
 | 
			
		||||
    margin-top: 3px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.Selectable .Title {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    flex-direction: row;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.Selectable q {
 | 
			
		||||
    color: gray;
 | 
			
		||||
    font-size: 70%;
 | 
			
		||||
@ -33,9 +40,14 @@ hr {
 | 
			
		||||
.Selectable:hover {
 | 
			
		||||
    background-color: #d3d3d360;
 | 
			
		||||
    border-radius: 2px;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.Selectable.selected {
 | 
			
		||||
    background-color: #d3d3d3f0;
 | 
			
		||||
    border-radius: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.Separator {
 | 
			
		||||
    /* width: 20%;  */
 | 
			
		||||
    /* height: 20px;  */
 | 
			
		||||
@ -48,11 +60,4 @@ hr {
 | 
			
		||||
 | 
			
		||||
.Separator .Counter {
 | 
			
		||||
    background-color: darkgray;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.Selectable .Title {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    flex-direction: row;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
}
 | 
			
		||||
@ -6,20 +6,28 @@ import { Color, Player } from '../../../components/Checkers';
 | 
			
		||||
import Loading from '../../../components/Loading';
 | 
			
		||||
import Counter from '../../../components/Counter';
 | 
			
		||||
 | 
			
		||||
export default function GameSelector({ yours, opponents, onClick }) {
 | 
			
		||||
export default function GameSelector({ yours, opponents, isSelected, onSelect }) {
 | 
			
		||||
    const games = useContext(GamesContext);
 | 
			
		||||
 | 
			
		||||
    const gamesList = useContext(GamesContext).gamesList;
 | 
			
		||||
    if (gamesList === null)
 | 
			
		||||
        return <Loading />
 | 
			
		||||
 | 
			
		||||
    const onClick = (uuid) => {
 | 
			
		||||
        if (isSelected(uuid))
 | 
			
		||||
            onSelect(null); // deselect previously selected game
 | 
			
		||||
        else
 | 
			
		||||
            onSelect(uuid);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const yoursList = gamesList.filter(game => game.status === yours)
 | 
			
		||||
        .map(game => <Selectable game={game} key={game.uuid} onClick={onClick} />)
 | 
			
		||||
        .map(game => <Selectable game={game} key={game.uuid} selected={isSelected(game.uuid)} onClick={onClick} />)
 | 
			
		||||
 | 
			
		||||
    const opponentsList = gamesList.filter(game => game.status === opponents)
 | 
			
		||||
        .map(game => <Selectable game={game} key={game.uuid} onClick={onClick} />)
 | 
			
		||||
        .map(game => <Selectable game={game} key={game.uuid} selected={isSelected(game.uuid)} onClick={onClick} />)
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
        <div className="GameSelector">
 | 
			
		||||
        <div className='GameSelector'>
 | 
			
		||||
            {yoursList}
 | 
			
		||||
            {opponentsList.length > 0 && <Separator counter={opponentsList.length} />}
 | 
			
		||||
            {opponentsList}
 | 
			
		||||
@ -27,14 +35,15 @@ export default function GameSelector({ yours, opponents, onClick }) {
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function Selectable({ game, onClick }) {
 | 
			
		||||
function Selectable({ game, selected, onClick }) {
 | 
			
		||||
    const myColor = game.myColor;
 | 
			
		||||
    const opponentColor = Color.opposite(myColor);
 | 
			
		||||
    const opponentName = game.opponentName;
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
        <div >
 | 
			
		||||
            <div className='Selectable' onClick={() => onClick(game.uuid)}>
 | 
			
		||||
            <div className={'Selectable' + (selected ? ' selected' : '')}
 | 
			
		||||
                onClick={() => onClick(game.uuid)}>
 | 
			
		||||
                <div className='Title'>
 | 
			
		||||
                    <Player color={myColor} />
 | 
			
		||||
                    <i>vs</i>
 | 
			
		||||
@ -49,7 +58,7 @@ function Selectable({ game, onClick }) {
 | 
			
		||||
 | 
			
		||||
function Separator({ counter }) {
 | 
			
		||||
    return (
 | 
			
		||||
        <div className="Separator">
 | 
			
		||||
        <div className='Separator'>
 | 
			
		||||
            waiting for opponent
 | 
			
		||||
            <Counter number={counter} />
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
@ -10,6 +10,10 @@ const initialState = {
 | 
			
		||||
    message2opponent: '',
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  proposal: {
 | 
			
		||||
    selectedUUID: null,
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  // Network
 | 
			
		||||
  isPollingGamesList: false,
 | 
			
		||||
  isPushingNewGame: false,
 | 
			
		||||
@ -27,6 +31,12 @@ function reducer(state, action) {
 | 
			
		||||
        newGame: nextState(state.newGame, action)
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
    case 'nextProposal':
 | 
			
		||||
      return {
 | 
			
		||||
        ...state,
 | 
			
		||||
        proposal: nextState(state.proposal, action)
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
    default:
 | 
			
		||||
      throw Error('GamesReducer: unknown action.type', action.type);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user