Navbar.jsx 1.6 KB

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