Display all players, not just a single component
authorCarl Worth <cworth@cworth.org>
Sat, 6 Jun 2020 03:17:46 +0000 (20:17 -0700)
committerCarl Worth <cworth@cworth.org>
Sat, 6 Jun 2020 11:46:51 +0000 (04:46 -0700)
It's a little trickier to deal with an array (both on the setState
side and when using the map() function to generate React elements) but
it's not too bad.

Thanks for the help, Richard!

tictactoe/tictactoe.jsx

index f0e9e88d6a83f6a9262cbb47a467f293a431b3a7..49c6005c38fe395c610502853f1ec69ab28d3438 100644 (file)
@@ -100,9 +100,13 @@ function PlayerInfo(props) {
       <h2>Players</h2>
       {props.player.name}
       {props.player.team ? ` (${props.player.team})` : ""}
-      {", "}
-      {props.opponent.name}
-      {props.opponent.team ? ` (${props.opponent.team})` : ""}
+      {props.opponents.map(opponent => (
+        <span key={opponent.id}>
+          {", "}
+          {opponent.name}
+          {opponent.team ? ` (${opponent.team})` : ""}
+        </span>
+      ))}
     </div>
   );
 }
@@ -186,7 +190,7 @@ class Game extends React.Component {
     this.state = {
       game_info: {},
       player_info: {},
-      opponent_info: {},
+      opponent_info: [],
       history: [
         {
           squares: Array(9).fill(null)
@@ -210,8 +214,15 @@ class Game extends React.Component {
   }
 
   set_opponent_info(info) {
+    const new_opponents = [...this.state.opponent_info];
+    const idx = new_opponents.findIndex(o => o.id === info.id);
+    if (idx >= 0) {
+      new_opponents[idx] = info;
+    } else {
+      new_opponents.push(info);
+    }
     this.setState({
-      opponent_info: info
+      opponent_info: new_opponents
     });
   }
 
@@ -322,7 +333,7 @@ class Game extends React.Component {
       <PlayerInfo
         key="player-info"
         player={state.player_info}
-        opponent={state.opponent_info}
+        opponents={state.opponent_info}
       />,
       <div key="game" className="game">
         <button className="inline"