Advertisement
Guest User

Untitled

a guest
Mar 17th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import React, { Component } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { connect } from 'react-redux';
  4. import { Link } from 'react-router-dom';
  5. import { CognitoState, Logout } from 'react-cognito';
  6.  
  7. import styles from './Navbar.scss';
  8.  
  9. import LogoutButton from './LogoutButton';
  10.  
  11.  
  12. class Navbar extends Component {
  13.  
  14.   static propTypes = {
  15.     location: PropTypes.string,
  16.     authState: PropTypes.string,
  17.     user: PropTypes.objectOf(PropTypes.any)
  18.   }
  19.  
  20.   constructor() {
  21.     super();
  22.     this.state = {
  23.       dropdown: false
  24.     };
  25.   }
  26.  
  27.   componentWillMount() {
  28.     document.addEventListener('mousedown', this.handleClick, false);
  29.   }
  30.  
  31.   componentWillUnmount() {
  32.     document.removeEventListener('mousedown', this.handleClick, false);
  33.   }
  34.  
  35.   handleClick = (e) => {
  36.     if (e.target.parentNode.id === 'dropdown-menu' || e.target.parentNode.parentNode.id === 'dropdown-menu') {
  37.       if ([0, 1].includes(e.button)) {
  38.         e.target.click();
  39.         this.setDropdown(false);
  40.       }
  41.       return;
  42.     }
  43.  
  44.     if (e.target.id === 'dropdown-button' || e.target.parentNode.id === 'dropdown-button') {
  45.       return;
  46.     }
  47.  
  48.     this.setDropdown(false);
  49.   }
  50.  
  51.   setDropdown = (bool) => this.setState({ dropdown: bool });
  52.  
  53.   toggleDropdown = () => this.setState({ dropdown: !this.state.dropdown });
  54.  
  55.   render() {
  56.     const { location, authState, user } = this.props;
  57.  
  58.     const overview = (location === '/overview');
  59.     const items = (location.substring(0, 6) === '/items');
  60.     const settings = (location === '/settings');
  61.     const messages = (location === '/messages');
  62.  
  63.     const username = (authState === CognitoState.LOGGED_IN && user) ? user.getUsername() : 'error';
  64.  
  65.     const dropdownStyle = (this.state.dropdown)
  66.       ? `${styles.dropdownContent} ${styles.show}`
  67.       : styles.dropdownContent;
  68.  
  69.     return (
  70.       <nav className={styles.navbar}>
  71.         <div className={styles.navContainer}>
  72.           <div className={styles.navContent}>
  73.             <Link to="/overview" className={overview ? styles.active : ''}>
  74.               {'Overview'}
  75.             </Link>
  76.             <Link to="/items" className={items ? styles.active : ''}>
  77.               {'Taskies'}
  78.             </Link>
  79.             <div className={styles.profile}>
  80.               <a className={styles.toggle} onClick={this.toggleDropdown} id="dropdown-button">
  81.                 <span className={styles.username}>{username}</span>
  82.                 <i className="fas fa-user" />
  83.               </a>
  84.               <div className={dropdownStyle} id="dropdown-menu">
  85.                 <Link to="/messages" className={messages ? styles.active : ''}>
  86.                   {'Messages'}
  87.                   <i className="fas fa-comments" />
  88.                 </Link>
  89.                 <Link to="/settings" className={settings ? styles.active : ''}>
  90.                   {'Settings'}
  91.                   <i className="fas fa-cog" />
  92.                 </Link>
  93.                 <Logout>
  94.                   <LogoutButton />
  95.                 </Logout>
  96.               </div>
  97.             </div>
  98.           </div>
  99.         </div>
  100.       </nav>
  101.     );
  102.   }
  103.  
  104. }
  105.  
  106. const mapStateToProps = (state) => ({
  107.   location: state.router.location.pathname,
  108.   authState: state.cognito.state,
  109.   user: state.cognito.user
  110. });
  111.  
  112. export default connect(mapStateToProps, null)(Navbar);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement