]> git.cworth.org Git - lmno.games/blobdiff - tictactoe/tictactoe.jsx
tictactoe: Improve player-info block for the case of no assigned team
[lmno.games] / tictactoe / tictactoe.jsx
index 5bb84f1b44790f9e08f22af22fef321c421b958c..f5951f1ff26a4bb738dd26a13c74f13feed08ccf 100644 (file)
@@ -72,6 +72,9 @@ events.addEventListener("game-state", event => {
  *********************************************************/
 
 function GameInfo(props) {
+  if (! props.id)
+    return null;
+
   return (
     <div className="game-info">
       <h2>{props.id}</h2>
@@ -81,10 +84,14 @@ function GameInfo(props) {
 }
 
 function PlayerInfo(props) {
+  if (! props.id)
+    return null;
+
   return (
     <div className="player-info">
       <h2>Player</h2>
-      {props.name}, ID: {props.id}, on team: {props.team}
+      {props.name}, ID: {props.id},
+      {props.team ? ` on team ${props.team}` : " not on a team"}
     </div>
   );
 }
@@ -143,9 +150,9 @@ class Board extends React.Component {
   }
 }
 
-function fetch_post_json(api = '', data = {}) {
+function fetch_method_json(method, api = '', data = {}) {
   const response = fetch(api, {
-    method: 'POST',
+    method: method,
     headers: {
       'Content-Type': 'application/json'
     },
@@ -154,6 +161,14 @@ function fetch_post_json(api = '', data = {}) {
   return response;
 }
 
+function fetch_post_json(api = '', data = {}) {
+  return fetch_method_json('POST', api, data);
+}
+
+async function fetch_put_json(api = '', data = {}) {
+  return fetch_method_json('PUT', api, data);
+}
+
 class Game extends React.Component {
   constructor(props) {
     super(props);
@@ -233,6 +248,10 @@ class Game extends React.Component {
     }
   }
 
+  join_team(team) {
+    fetch_put_json("player", {team: team});
+  }
+
   render() {
     const history = this.state.history;
     const current = history[this.state.step_number];
@@ -258,6 +277,11 @@ class Game extends React.Component {
         team={this.state.player_info.team}
       />,
       <div key="game" className="game">
+        <button className="inline"
+                onClick={() => this.join_team('X')}>Join Team X</button>
+        &nbsp;
+        <button className="inline"
+                onClick={() => this.join_team('O')}>Join Team O</button>
         <div>{status}</div>
         <div className="game-board">
           <Board