]> git.cworth.org Git - lmno.games/blobdiff - tictactoe/tictactoe.jsx
tictactoe: Don't let the user send an illegal move
[lmno.games] / tictactoe / tictactoe.jsx
index 5d1845d7d6bd15f28dd46d788538481ce50df3d2..d92b698fe57b913e8d8625643b18376bf0262947 100644 (file)
@@ -36,18 +36,31 @@ events.addEventListener("game-state", event => {
 });
 
 function Square(props) {
+  let className = "square";
+
+  if (props.value) {
+    className += " occupied";
+  } else if (props.active) {
+    className += " open";
+  }
+
+  const onClick = props.active ? props.onClick : null;
+
   return (
-    <button className="square" onClick={props.onClick}>
+    <div className={className}
+         onClick={onClick}>
       {props.value}
-    </button>
+    </div>
   );
 }
 
 class Board extends React.Component {
   renderSquare(i) {
+    const value = this.props.squares[i];
     return (
       <Square
-        value={this.props.squares[i]}
+        value={value}
+        active={! this.props.gameOver && ! value}
         onClick={() => this.props.onClick(i)}
       />
     );
@@ -139,9 +152,9 @@ class Game extends React.Component {
   async handleClick(i) {
     const response = await this.sendMove(i);
     if (response.status == 200) {
-      const legal = await response.json();
-      if (! legal)
-        add_message("danger", `Illegal move.`);
+      const result = await response.json();
+      if (! result.legal)
+        add_message("danger", result.message);
     } else {
       add_message("danger", `Error occurred sending move`);
     }
@@ -173,6 +186,7 @@ class Game extends React.Component {
         </div>
         <div className="game-board">
           <Board
+            gameOver={winner}
             squares={current.squares}
             onClick={i => this.handleClick(i)}
           />