From b985cfaf1bee9c92438bc68c8b73b19693a0c3ac Mon Sep 17 00:00:00 2001
From: Joni Laukka <jonilaukka@hotmail.com>
Date: Mon, 15 Jul 2019 20:01:25 +0300
Subject: [PATCH] Role changes are saved to database

---
 src/components/PlayerlistFaction.js    |   1 +
 src/components/PlayerlistPlayerCard.js | 102 ++++++++++++++++++++++---
 src/components/PlayerlistView.js       |   1 +
 3 files changed, 94 insertions(+), 10 deletions(-)

diff --git a/src/components/PlayerlistFaction.js b/src/components/PlayerlistFaction.js
index 1d12d6a..b4e5ed6 100644
--- a/src/components/PlayerlistFaction.js
+++ b/src/components/PlayerlistFaction.js
@@ -31,6 +31,7 @@ export default class PlayerlistFaction extends React.Component {
           key={member.gamepersonId}
           player={member}
           role={this.props.role}
+          gameId={this.props.gameId}
         />
       );
     });
diff --git a/src/components/PlayerlistPlayerCard.js b/src/components/PlayerlistPlayerCard.js
index c29944e..08d4562 100644
--- a/src/components/PlayerlistPlayerCard.js
+++ b/src/components/PlayerlistPlayerCard.js
@@ -2,21 +2,92 @@ import React, { Fragment } from "react";
 
 export default class PlayerlistPlayerCard extends React.Component {
   state = {
-    edit: false
+    edit: false,
+    roleInput: this.props.player.role
+  };
+
+  handleSave = () => {
+    let token = sessionStorage.getItem("token");
+
+    if (this.state.roleInput === "") {
+      return alert("Error: Selected role is not valid");
+    }
+
+    if (
+      window.confirm(
+        `Change ${this.props.player.person.name}'s role to "${
+          this.state.roleInput
+        }"?`
+      )
+    ) {
+      fetch(
+        `${process.env.REACT_APP_API_URL}/faction/promote/${this.props.gameId}`,
+        {
+          method: "PUT",
+          headers: {
+            Authorization: "Bearer " + token,
+            Accept: "application/json",
+            "Content-Type": "application/json"
+          },
+          body: JSON.stringify({
+            role: this.state.roleInput,
+            player: this.props.player.gamepersonId
+          })
+        }
+      )
+        .then(res => {
+          return res.json();
+        })
+        .then(res => {
+          alert(
+            `Player ${this.props.player.person.name}'s role was changed to "${
+              res.role
+            }"`
+          );
+        })
+        .catch(error => console.log(error));
+    }
+
+    this.setState({ edit: false, roleInput: this.props.player.role });
   };
 
   render() {
-    console.log(this.props.player);
+    // Normal user view
+    if (this.props.role !== "admin") {
+      return (
+        <div>
+          {this.props.player.person.name} : {this.props.player.role}
+        </div>
+      );
+    }
+
+    // Admin edit view
+    if (this.state.edit) {
+      return (
+        <div>
+          {this.props.player.person.name} :{" "}
+          <select
+            value={this.state.roleInput}
+            onChange={e => this.setState({ roleInput: e.target.value })}
+          >
+            {roleOptions()}
+          </select>
+          <button onClick={this.handleSave}>Save</button>
+          <button
+            onClick={() => {
+              this.setState({ edit: false, roleInput: this.props.player.role });
+            }}
+          >
+            Cancel
+          </button>
+        </div>
+      );
+    }
+
+    // Admin view without editing
     return (
       <div>
-        {this.props.player.person.name} :{" "}
-        {this.state.edit && (
-          <select>
-            <option value="soldier">Soldier</option>
-            <option value="factionleader">Faction Leader</option>
-            <option value="admin">Admin</option>
-          </select>
-        )}
+        {this.props.player.person.name} : {this.state.edit && roleOptions()}
         {!this.state.edit && this.props.player.role}
         {this.props.role === "admin" && !this.state.edit && (
           <button onClick={() => this.setState({ edit: !this.state.edit })}>
@@ -33,3 +104,14 @@ export default class PlayerlistPlayerCard extends React.Component {
     );
   }
 }
+
+// Available options for user roles
+function roleOptions() {
+  return (
+    <Fragment>
+      <option value="soldier">Soldier</option>
+      <option value="factionleader">Faction Leader</option>
+      <option value="admin">Admin</option>
+    </Fragment>
+  );
+}
diff --git a/src/components/PlayerlistView.js b/src/components/PlayerlistView.js
index 1097820..0eff9bc 100644
--- a/src/components/PlayerlistView.js
+++ b/src/components/PlayerlistView.js
@@ -65,6 +65,7 @@ export default class PlayerlistView extends React.Component {
           key={faction.factionId}
           faction={faction}
           role={this.props.role}
+          gameId={this.props.gameId}
         />
       );
     });
-- 
GitLab