ChessboardInterface.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. 'use strict';
  2. const React = require('react/addons');
  3. const GameStore = require('../stores/GameStore');
  4. const GameActions = require('../actions/GameActions');
  5. const onGameChange = require('../mixins/onGameChange');
  6. const Chessboard = require('./Chessboard');
  7. const CapturedPieces = require('./CapturedPieces');
  8. const TableOfMoves = require('./TableOfMoves');
  9. const cx = require('classnames');
  10. const ChessboardInterface = React.createClass({
  11. propTypes: {
  12. io: React.PropTypes.object.isRequired,
  13. soundsEnabled: React.PropTypes.bool.isRequired,
  14. color: React.PropTypes.oneOf(['white', 'black']).isRequired
  15. },
  16. mixins: [React.addons.PureRenderMixin, onGameChange],
  17. getInitialState() {
  18. return GameStore.getState();
  19. },
  20. render() {
  21. const {promotion, turn, gameOver} = this.state;
  22. const cxFeedback = cx({
  23. feedback: true,
  24. whitefeedback: turn === 'w',
  25. blackfeedback: turn === 'b'
  26. });
  27. const goType = gameOver.get('type');
  28. const loser = gameOver.get('winner') === 'White' ? 'Black' : 'White';
  29. return (
  30. <div id="board-moves-wrapper" className="clearfix">
  31. <audio preload="auto" ref="moveSnd">
  32. <source src="/snd/move.mp3" />
  33. </audio>
  34. <div id="board-wrapper">
  35. <CapturedPieces />
  36. <Chessboard
  37. io={this.props.io}
  38. maybePlaySound={this._maybePlaySound}
  39. color={this.props.color} />
  40. </div>
  41. <TableOfMoves />
  42. <span className="promotion">
  43. <label>
  44. <span>Promotion: </span>
  45. <select value={promotion}
  46. onChange={this._onPromotionChange}>
  47. <option value="q">Queen</option>
  48. <option value="r">Rook</option>
  49. <option value="n">Knight</option>
  50. <option value="b">Bishop</option>
  51. </select>
  52. </label>
  53. </span>
  54. <span className={cxFeedback}>
  55. {!gameOver.get('status') ?
  56. <span className="feedback-move">
  57. {`${turn === 'w' ? 'White' : 'Black'} to move.`}
  58. </span> :
  59. <span className="feedback-status">
  60. {goType === 'checkmate' ?
  61. `Checkmate. ${gameOver.get('winner')} wins!`
  62. :goType === 'timeout' ?
  63. `${loser}‘s time is out. ${gameOver.get('winner')} wins!`
  64. :goType === 'resign' ?
  65. `${loser} has resigned. ${gameOver.get('winner')} wins!`
  66. :goType === 'draw' ?
  67. 'Draw.'
  68. :goType === 'stalemate' ?
  69. 'Draw (Stalemate).'
  70. :goType === 'threefoldRepetition' ?
  71. 'Draw (Threefold Repetition).'
  72. :goType === 'insufficientMaterial' ?
  73. 'Draw (Insufficient Material)'
  74. :null}
  75. </span>
  76. }
  77. </span>
  78. </div>
  79. );
  80. },
  81. _onGameChange() {
  82. this.setState(GameStore.getState());
  83. },
  84. _onPromotionChange(e) {
  85. GameActions.changePromotion(e.target.value);
  86. },
  87. _maybePlaySound() {
  88. if (this.props.soundsEnabled) {
  89. this.refs.moveSnd.getDOMNode().play();
  90. }
  91. }
  92. });
  93. module.exports = ChessboardInterface;