SelectPlayerDialog.jsx 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import React from 'react';
  2. import Dialog from "./components/Dialog";
  3. import Token from "./Token";
  4. import {gameService} from './services/GameService';
  5. const TOKENS = ['hat-cowboy-side', 'dog', 'cat', 'car', 'ship', 'frog'];
  6. export default class SelectPlayerDialog extends React.Component {
  7. state = {
  8. newPlayer: {
  9. name: '',
  10. token: '',
  11. error: ''
  12. }
  13. }
  14. observerMode = () => {
  15. gameService.currentPlayer = 1; // As bank, anyone can observe :)
  16. gameService.sendToWs('dull', 'dull');
  17. }
  18. setPlayerName = (event) => {
  19. const player = this.state.newPlayer;
  20. player.name = event.target.value;
  21. this.setState({newPlayer: player});
  22. }
  23. selectToken = (token) => {
  24. const player = this.state.newPlayer;
  25. player.token = token;
  26. this.setState({newPlayer: player});
  27. }
  28. addPlayer = () => {
  29. const player = this.state.newPlayer;
  30. if (player.name.length === 0) {
  31. this.setState({error: 'Name is empty'})
  32. return;
  33. }
  34. if (player.token.length === 0) {
  35. this.setState({error: 'You need to select a token'})
  36. return;
  37. }
  38. if (this.props.game.players.some(p => p.name.toLowerCase() === player.name.toLowerCase() || p.token === player.token)) {
  39. this.setState({error: 'Player with the same name or token already exist'})
  40. return;
  41. }
  42. gameService.addNewPlayer(player);
  43. }
  44. selectPlayer = (player) => {
  45. gameService.currentPlayer = player.id;
  46. gameService.sendToWs('dull', 'dull');
  47. }
  48. render() {
  49. const availablePlayers = this.props.game.players.filter(p => p.id !== 1);
  50. const availableTokens = TOKENS.filter(t => availablePlayers.findIndex(p => p.token === t) === -1);
  51. return (<Dialog>
  52. <div className="select-player-dialog">
  53. {availablePlayers.length > 0 && <div className="select-player">
  54. <h1>Play as</h1>
  55. {availablePlayers.map(p => <div key={p.id} onClick={() => this.selectPlayer(p)} className="player">
  56. <Token token={p.token}/>
  57. {p.name}
  58. </div>)}
  59. </div>}
  60. {!this.props.game.started && <div className="new-player">
  61. {availablePlayers.length > 0 && <h3>Or create a new Player</h3>}
  62. {availablePlayers.length === 0 && <h1>Create a new Player</h1>}
  63. <div>
  64. <input type="text" placeholder="Player name" value={this.state.newPlayer.name}
  65. onChange={this.setPlayerName}/>
  66. </div>
  67. <p>Select token:</p>
  68. <div className="tokens">
  69. {availableTokens.map(t => <span key={t} onClick={() => this.selectToken(t)}>
  70. <Token token={t} selected={this.state.newPlayer.token === t}/>
  71. </span>)}
  72. </div>
  73. <button onClick={this.addPlayer}>Start</button>
  74. <button onClick={this.observerMode}>Watch as observer</button>
  75. &nbsp;{this.state.error}
  76. </div>}
  77. </div>
  78. </Dialog>)
  79. }
  80. }