tahnik/devRantron

View on GitHub
app/src/js/components/navigation/sidenav.js

Summary

Maintainability
A
0 mins
Test Coverage
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import Item from './items';
import CompactUserCard from '../user/compact_user_card';
import { ITEM } from '../../consts/types';

const { ipcRenderer } = require('electron');

class SideNav extends Component {
  constructor() {
    super();
    this.state = {
      hidden: false,
    };
  }
  componentDidMount() {
    this.handleResize();
    this.listener = () => {
      this.handleResize();
    };
    window.addEventListener('resize', this.listener);

    const { theme } = this.props;
    ipcRenderer.on('compose_rant', () => { this.props.open(); });
    document.addEventListener('keydown', (e) => {
      if (e.which === 13 && e.ctrlKey) {
        if (!this.props.modalItem) {
          this.props.open();
        }
      }
    });
    const thumbColor = theme.comment_card.backgroundColor;
    const styleElement = document.createElement('style');
    styleElement.appendChild(document.createTextNode(`div ::-webkit-scrollbar-thumb {background: ${thumbColor}}`));
    document.getElementsByTagName('head')[0].appendChild(styleElement);
  }
  componentWillUnmount() {
    window.removeEventListener('resize', this.listener);
  }
  handleResize() {
    const windowWidth = window.innerWidth;
    if (windowWidth < 1000) {
      this.setState({ hidden: true });
    } else {
      this.setState({ hidden: false });
    }
  }
  getUserCard() {
    const {
      user, logout, login, fetchUser, open, theme,
    } = this.props;
    return (<CompactUserCard
      user={user}
      login={login}
      logout={logout}
      fetchUser={fetchUser}
      open={open}
      theme={theme}
    />);
  }
  render() {
    const {
      sideNavItems, history, location, resetColumn, open, settings, theme,
    } = this.props;
    if (this.state.hidden) {
      return null;
    }
    return (
      <div
        className="sidenav_container"
        style={{ backgroundColor: theme.item_card.backgroundColor }}
      >
        <div className="navs">
          <div className="devRant_logo">
            { this.getUserCard() }
          </div>
          {
            sideNavItems.map(item => (
              <Item
                {...this.props}
                key={item.route}
                item={item}
                active={location.pathname === item.route ? 'active' : null}
                onClick={() => {
                  if (location.pathname !== item.route) {
                    resetColumn();
                    history.push(item.route);
                  }
                }}
              />
            ))
          }
          {
            settings.general.update.value &&
              <Item
                {...this.props}
                key="update"
                item={{ icon: 'ion-android-alert', name: 'Update Available', route: '/' }}
                active=""
                className="updateBtn"
                onClick={() => {
                  open(ITEM.RELEASE_INFO.NAME);
                }}
              />
          }
        </div>
        <div className="add_rant">
          <button
            onClick={() => open()}
            className="add_button"
            style={{
              backgroundColor: theme.plus_notif ? theme.plus_notif.backgroundColor : '#D55161',
              color: theme.id === 'dark_theme' ? '#ffffff' : theme.item_card.backgroundColor,
            }}
          >
            <i className="ion-plus-round" />
          </button>
        </div>
      </div>
    );
  }
}

SideNav.propTypes = {
  sideNavItems: PropTypes.array.isRequired,
  history: PropTypes.object.isRequired,
  user: PropTypes.object.isRequired,
  settings: PropTypes.object.isRequired,
  login: PropTypes.func.isRequired,
  logout: PropTypes.func.isRequired,
  location: PropTypes.object.isRequired,
  theme: PropTypes.object.isRequired,
  fetchUser: PropTypes.func.isRequired,
  resetColumn: PropTypes.func.isRequired,
  open: PropTypes.func.isRequired,
  modalItem: PropTypes.object,
};

export default SideNav;