1
0
mirror of https://github.com/danbee/chess synced 2025-03-04 08:39:06 +00:00
chess/assets/js/components/chess-board-square.js
2018-02-28 11:02:59 -05:00

84 lines
1.9 KiB
JavaScript

import React from "react";
import _ from "lodash";
import $ from "jquery";
import classNames from "classnames";
import { setGame, selectPiece } from "../store/actions";
class ChessBoardSquare extends React.Component {
constructor(props) {
super(props);
}
squareCoords() {
return [this.props.file, this.props.rank];
}
selectSquare() {
let { piece, store } = this.props;
let { gameId, selectedSquare, player } = store.getState();
if (selectedSquare != null && this.moveIsValid()) {
$.ajax({
method: "PATCH",
url: "/api/games/" + gameId,
data: { move: { from: selectedSquare, to: this.squareCoords() } },
}).then((data) => store.dispatch(setGame(data)));
} else if (selectedSquare != null) {
store.dispatch(selectPiece(null));
} else if (this.playerCanSelectPiece(player, piece)) {
store.dispatch(selectPiece(this.squareCoords()));
}
}
moveIsValid() {
return !this.isSelectedSquare();
}
playerCanSelectPiece(player, piece) {
let { store } = this.props;
let { turn } = store.getState();
return piece !== undefined &&
piece.colour == player &&
player == turn;
}
isSelectedSquare() {
let { store } = this.props;
if (store.getState().selectedSquare == null) {
return false;
} else {
return _.isEqual(this.squareCoords(), store.getState().selectedSquare);
}
}
squareId() {
return `f${this.props.file}-r${this.props.rank}`;
}
squareClass() {
if (this.props.piece == undefined) {
return "board-square";
} else {
return classNames(
"board-square",
this.props.piece.type,
this.props.piece.colour,
{ "selected": this.isSelectedSquare() }
);
}
}
render() {
return <div
id={this.squareId()}
className={this.squareClass()}
onClick={this.selectSquare.bind(this)}
/>;
}
}
export default ChessBoardSquare;