]> git.cworth.org Git - lmno.games/blobdiff - tictactoe/tictactoe.jsx
Add two buttons to allow the player to choose a team to join
[lmno.games] / tictactoe / tictactoe.jsx
index 7ea8c6fa202106d88471e69404e09804bac19027..f1426ecff4f443c8837237fffd8caeef3f751153 100644 (file)
@@ -38,6 +38,19 @@ events.addEventListener("game-info", event => {
   window.game.set_game_info(info);
 });
 
+events.addEventListener("player-info", event => {
+  const info = JSON.parse(event.data);
+
+  window.game.set_player_info(info);
+});
+
+events.addEventListener("player-update", event => {
+  const info = JSON.parse(event.data);
+
+  if (info.id === window.game.state.player_info.id)
+    window.game.set_player_info(info);
+});
+
 events.addEventListener("move", event => {
   const move = JSON.parse(event.data);
 
@@ -67,6 +80,15 @@ function GameInfo(props) {
   );
 }
 
+function PlayerInfo(props) {
+  return (
+    <div className="player-info">
+      <h2>Player</h2>
+      {props.name}, ID: {props.id}, on team: {props.team}
+    </div>
+  );
+}
+
 function Square(props) {
   let className = "square";
 
@@ -121,9 +143,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'
     },
@@ -132,11 +154,20 @@ 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);
     this.state = {
       game_info: {},
+      player_info: {},
       history: [
         {
           squares: Array(9).fill(null)
@@ -153,6 +184,12 @@ class Game extends React.Component {
     });
   }
 
+  set_player_info(info) {
+    this.setState({
+      player_info: info
+    });
+  }
+
   send_move(i) {
     return fetch_post_json("move", { move: i });
   }
@@ -204,6 +241,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];
@@ -218,10 +259,22 @@ class Game extends React.Component {
 
     return [
       <GameInfo
+        key="game-info"
         id={this.state.game_info.id}
         url={this.state.game_info.url}
       />,
-      <div className="game">
+      <PlayerInfo
+        key="player-info"
+        id={this.state.player_info.id}
+        name={this.state.player_info.name}
+        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