Chessboard.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. 'use strict';
  2. const React = require('react');
  3. const GameStore = require('../stores/GameStore');
  4. const GameActions = require('../actions/GameActions');
  5. const ChessPieces = require('../constants/ChessPieces');
  6. const onGameChange = require('../mixins/onGameChange');
  7. const maybeReverse = require('../mixins/maybeReverse');
  8. const Immutable = require('immutable');
  9. const {Seq, Repeat} = Immutable;
  10. const PureRenderMixin = React.addons.PureRenderMixin;
  11. const Chessboard = React.createClass({
  12. propTypes: {
  13. io: React.PropTypes.object.isRequired,
  14. maybePlaySound: React.PropTypes.func.isRequired,
  15. color: React.PropTypes.oneOf(['white', 'black']).isRequired
  16. },
  17. mixins: [PureRenderMixin, onGameChange, maybeReverse],
  18. getInitialState() {
  19. return {
  20. fen: GameStore.getFEN()
  21. };
  22. },
  23. render() {
  24. const fen = this.state.fen;
  25. const placement = fen.split(' ')[0];
  26. const rows = this._maybeReverse(placement.split('/'));
  27. return (
  28. <table className="chessboard">
  29. {rows.map((placement, i) =>
  30. <Row placement={placement} color={this.props.color} key={i} />)}
  31. </table>
  32. );
  33. },
  34. _onGameChange() {
  35. this.setState({
  36. fen: GameStore.getFEN()
  37. });
  38. }
  39. });
  40. const Row = React.createClass({
  41. propTypes: {
  42. placement: React.PropTypes.string.isRequired,
  43. color: React.PropTypes.oneOf(['white', 'black']).isRequired
  44. },
  45. mixins: [PureRenderMixin, maybeReverse],
  46. render() {
  47. const placement = this.props.placement;
  48. let pieces;
  49. if (placement.length < 8) {
  50. pieces = this._maybeReverse(
  51. Seq(placement).flatMap(piece => (
  52. /^\d$/.test(piece) ? Repeat('-', parseInt(piece, 10)) : piece
  53. ))
  54. ).toArray();
  55. } else {
  56. pieces = this._maybeReverse(placement.split(''));
  57. }
  58. return (
  59. <tr>
  60. {pieces.map((piece, i) =>
  61. <Column piece={piece} key={i} />)}
  62. </tr>
  63. );
  64. }
  65. });
  66. const Column = React.createClass({
  67. propTypes: {
  68. piece: React.PropTypes.string.isRequired
  69. },
  70. mixins: [PureRenderMixin],
  71. render() {
  72. return <td>{ChessPieces[this.props.piece]}</td>;
  73. }
  74. });
  75. module.exports = Chessboard;