Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
Header.js 3.22 KiB
import React from "react";

import LoginForm from "./LoginForm";
import RegisterForm from "./RegisterForm";
import TaskListButton from "./TaskListButton";
import GameSidebar from "./GameSidebar";

class Header extends React.Component {
  constructor(props) {
    super(props);
  }

  state = {
    form: "", // Popup form (login, register etc.)
    username: null,
    token: null,
    sidebar: false
  };

  // toggles the login/register view
  toggleView = view => {
    this.setState({
      form: view
    });
  };

  handleState = data => {
    sessionStorage.setItem("name", data.name);
    sessionStorage.setItem("token", data.token);
    this.setState({ username: data.name, token: data.token });
  };

  handleLogout = () => {
    this.setState({ username: null, token: null });
    sessionStorage.removeItem("token");
  };

  // verifies the token (if it exists) on element mount with backend server
  componentDidMount() {
    let token = sessionStorage.getItem("token");
    if (token) {
      fetch(`${process.env.REACT_APP_API_URL}/user/verify`, {
        headers: {
          Authorization: "Bearer " + token
        }
      })
        .then(res => res.json())
        .then(
          result => {
            // if token is still valid, login user
            if (result === true) {
              this.setState({
                username: sessionStorage.getItem("name"),
                token: token
              });
              // logout user if token has expired / is invalid
            } else {
              this.handleLogout();
            }
          },
          error => {
            console.log(error);
          }
        );
    }
  }

  render() {
    return (
      <div>
        <div className="header">
          {!this.state.username && (
            <button
              id="registerButton"
              onClick={() => this.toggleView("register")}
            >
              register
            </button>
          )}
          {!this.state.username && (
            <button id="loginButton" onClick={() => this.toggleView("login")}>
              login
            </button>
          )}

          {this.state.username && (
            <button id="logoutButton" onClick={this.handleLogout}>
              logout
            </button>
          )}
          {this.state.username && <button>{this.state.username}</button>}
          <button id="changeLayerButton" onClick={this.props.handleLayerChange}>
            change layer
          </button>
          {this.state.username && <TaskListButton />}
          <button
            id="sidebarButton"
            onClick={() => this.setState({ sidebar: !this.state.sidebar })}
          >
            Tools
          </button>
          {this.state.sidebar && (
            <GameSidebar loggedIn={this.state.username ? true : false} />
          )}
        </div>
        {this.state.form === "register" && (
          <RegisterForm
            view=""
            handleState={this.handleState}
            toggleView={this.toggleView}
          />
        )}
        {this.state.form === "login" && (
          <LoginForm
            view=""
            handleState={this.handleState}
            toggleView={this.toggleView}
          />
        )}
      </div>
    );
  }
}

export default Header;