IliyanID/Portfolio-Website

View on GitHub
client/src/Containers/App.js

Summary

Maintainability
A
0 mins
Test Coverage
import React, { PureComponent } from 'react';
import classNames from 'classnames/bind';
import styles from './App.css';

import Terminal from'./Terminal/Terminal'
import About from '../Components/About/About';
import ContactMe from '../Components/ContactMe/ContactMe';
import Experience from '../Components/Experience/Experience';
import Work from '../Components/Work/Work';

import github_api from '../Resources/util/github_api'
import links_icons from '../Resources/constants/links_icons'

class App extends PureComponent {
  state = {
    tabs:[
      {
        name:"Terminal"
        ,displayed:true,
        id:0
      }
    ],
    repos:[
      {
        name:"",
        link:"",
        description:"",
        languages:"",
        size:0
      }
    ]
  };

  componentDidMount(){
    github_api().then((result)=>{
      this.setState(result)
    });
  }

  addTab = (tabName) =>{
    let tempTabs = [...this.state.tabs];

    if(tabName !=="Terminal" && tempTabs.findIndex((tab)=>tab.name === tabName) !== -1){
      let id = tempTabs[tempTabs.findIndex((tab)=>tab.name === tabName)].id;
      this.selectTab(id);
      return false;
    }

    tempTabs.map((tab)=>tab.displayed = false);
    switch(tabName){   
      case "Terminal":{
        tempTabs.push({name:"Terminal",displayed:true});
        break;
      }

      case "About":{
        tempTabs.push({name:"About",displayed:true});
        break;
      }

      case "Experience":{
        tempTabs.push({name:"Experience",displayed:true});
        break;
      }

      case "Work":{
        tempTabs.push({name:"Work",displayed:true});
        break;
      }

      case "Contact":{
        tempTabs.push({name:"Contact",displayed:true});
        break;
      }
      
      default :{
        return false;
      }
    }
    this.setState({tabs:tempTabs});
    return true;
  }

  removeTab = (id) =>{
    const tempTabs = [...this.state.tabs];
    let index = tempTabs.findIndex((tab)=>tab.displayed === true);
    tempTabs[index].displayed = false;
    tempTabs[0].displayed = true;

    if(!Number.isInteger(parseFloat(id)))
      index = tempTabs.findIndex((tab)=>tab.name === id);
    else
      index = tempTabs.findIndex((tab)=>tab.id === id);
      
    if(index <= 0)
      return false;
    
    else
      tempTabs.splice(index, 1);
      
    this.setState({tabs:tempTabs})
    
    return true;
  }

  selectTab = (id) =>{
    let tempArr = [...this.state.tabs].reverse();
    let findIndex = () =>{
      for(let i = tempArr.length - 1; i >= 0 ;i--){
        if(tempArr[i].id === id)
          return i;
      }
      return -1;
    }
    let index = findIndex();


    for(let i = 0; i < tempArr.length; i++){
      if(i === index){
        tempArr[i].displayed = true;
      }
      else
        tempArr[i].displayed = false;
    }
    tempArr.reverse();
    this.setState({tabs:tempArr});
  }

  DisplayCurrentWindow = () =>{
    let index = this.state.tabs.findIndex((tab) => tab.displayed);
    let result = null;
    if(this.state.tabs[index].name === 'About')
      result = <About></About>
    else if(this.state.tabs[index].name === 'Experience')
      result = <Experience></Experience>
    else if(this.state.tabs[index].name === 'Work')
      result = <Work repos={this.state.repos}></Work>
    else if(this.state.tabs[index].name === 'Contact')
      result = <ContactMe></ContactMe>

    return result;
  }

  TerminalTabs(){
    let id = 0;
    let cx = classNames.bind(styles);
    return (
      <ol id="tabs">
        {
        this.state.tabs.map((tab)=>{
          let classes = cx({indTab:tab.id!==0},{terminal:tab.id===0},{selectedTab:tab.displayed});
          tab.id = id;
          let result = (<li key={id} onClick={()=>this.selectTab(tab.id)} className={classes}>{tab.name}<b onClick={(e)=> {e.stopPropagation();this.removeTab(tab.id);}} className="closeX">X</b></li>);
          id++;
          return result;  
        })}
        <li id="addTab">+</li>
      </ol>
    );
  }

  LeftBarLinks(){
    return <ul className="links">
            {
              links_icons.map((LinkObj,index)=>{
                const Icon = LinkObj.icon;
                return <li key={`link-key-${index}`}><a href={LinkObj.link} target="_blank" rel="noreferrer"><Icon className="svg" title=""/></a></li>
              })
            }
          </ul>
  }

  RightBarEmail(){
    return <div className="emailLine">
            <div className="email"><span onClick={()=> this.addTab("Contact")}>dev.iliyan.dimitrov@gmail.com</span></div>
           </div>
  }

  navigationButtons(){
    return  <ol id="navBar">
              <li onClick={()=> this.addTab("About")}>About</li>
              <li onClick={()=> this.addTab("Experience")}>Experience</li>
              <li onClick={()=> this.addTab("Work")}>Work</li>
              <li onClick={()=> this.addTab("Contact")}>Contact Me</li>
            </ol>
  }


  render () {
    return (      
    <div id="app">
      {this.navigationButtons()}
      
      {this.LeftBarLinks()}

      {this.RightBarEmail()}

      {this.TerminalTabs()}

      <Terminal 
        addTab = {this.addTab}
        removeTab = {this.removeTab}
        display = {this.state.tabs[0].displayed ? "" : "hideTerminal"}
        inView = {this.state.tabs[0].displayed}>   
      </Terminal>
      {this.DisplayCurrentWindow()}
      <a href="https://github.com/IliyanID/PortfolioWebsite" target="_blank" id="footer" rel="noreferrer">Created and Designed by Iliyan Dimitrov</a>
    </div>
    );
  }
}


export default App;