Navbar.jsx 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import React, { Component } from "react";
  2. import PropTypes from "prop-types";
  3. import { connect } from "react-redux";
  4. import { NavLink } from "react-router-dom";
  5. import { translate } from "react-i18next";
  6. @connect(state => ({
  7. loggedIn: state.user.get("loggedIn"),
  8. }))
  9. @translate(["navbar"], { wait: true })
  10. export default class Menu extends Component {
  11. static propTypes = {
  12. loggedIn: PropTypes.bool,
  13. t: PropTypes.func,
  14. };
  15. static defaultProps = {
  16. loggedIn: false,
  17. t: () => {},
  18. };
  19. constructor(props) {
  20. super(props);
  21. this.state = {
  22. showNavbar: false,
  23. };
  24. }
  25. getLink(to, text, canShow = true) {
  26. return (canShow) ? <NavLink to={ to } onClick={ this.closeNavbar } >{ text }</NavLink> : "";
  27. }
  28. toggleNavbar = () => {
  29. this.setState({
  30. showNavbar: !this.state.showNavbar,
  31. });
  32. }
  33. closeNavbar = () => {
  34. this.setState({
  35. showNavbar: false,
  36. });
  37. }
  38. render() {
  39. const { t } = this.props;
  40. return (
  41. <header>
  42. {this.getLink("/", <img src="/assets/images/wordmark-white.svg" />)}
  43. <button className="hamburger" onClick={ this.toggleNavbar }>
  44. <span></span>
  45. <span></span>
  46. <span></span>
  47. </button>
  48. <navbar className={ (this.state.showNavbar) ? "show" : "" }>
  49. {this.getLink("/", t("navbar:home"))}
  50. {this.getLink("/login", t("navbar:login"), !this.props.loggedIn)}
  51. {this.getLink("/register", t("navbar:register"), !this.props.loggedIn)}
  52. {this.getLink("/settings", t("navbar:settings"), this.props.loggedIn)}
  53. {this.getLink("/logout", t("navbar:logout"), this.props.loggedIn)}
  54. </navbar>
  55. </header>
  56. );
  57. }
  58. }