Skip to content
Snippets Groups Projects
TopBar.js 4.01 KiB
Newer Older
import React from 'react';
import PropTypes from 'prop-types';
import AppBar from '@material-ui/core/AppBar';
import Toolbar from '@material-ui/core/Toolbar';
import IconButton from '@material-ui/core/IconButton';
Esko Ikkala's avatar
Esko Ikkala committed
import Typography from '@material-ui/core/Typography';
import MenuItem from '@material-ui/core/MenuItem';
import Menu from '@material-ui/core/Menu';
import { withStyles } from '@material-ui/core/styles';
import MoreIcon from '@material-ui/icons/MoreVert';
import Button from '@material-ui/core/Button';
import { Link, NavLink } from 'react-router-dom';
import TopBarSearchField from './TopBarSearchField';

const styles = theme => ({
  root: {
    //width: '100%',
  },
  grow: {
    flexGrow: 1,
esikkala's avatar
esikkala committed
    // 
  sectionDesktop: {
    display: 'none',
    [theme.breakpoints.up('md')]: {
      display: 'flex',
    },
  sectionMobile: {
    display: 'flex',
    [theme.breakpoints.up('md')]: {
      display: 'none',
    },
  appBarButton: {
    color: 'white !important'
  appBarButtonActive: {
    border: '1px solid white'
  }
});

class TopBar extends React.Component {
  state = {
    anchorEl: null,
  handleProfileMenuOpen = event => {
    this.setState({ anchorEl: event.currentTarget });
  };

  handleMenuClose = () => {
    this.setState({ anchorEl: null });
    this.handleMobileMenuClose();
  handleMobileMenuOpen = event => {
    this.setState({ mobileMoreAnchorEl: event.currentTarget });
  handleMobileMenuClose = () => {
    this.setState({ mobileMoreAnchorEl: null });
  render() {
esikkala's avatar
esikkala committed
    const { mobileMoreAnchorEl } = this.state;
    const { classes } = this.props;
    const isMobileMenuOpen = Boolean(mobileMoreAnchorEl);
esikkala's avatar
esikkala committed
    const perspectives = [ 'manuscripts', 'works', 'events', 'people',
      'organizations', 'places' ];
    const renderMobileMenu = (
      <Menu
        anchorEl={mobileMoreAnchorEl}
        anchorOrigin={{ vertical: 'top', horizontal: 'right' }}
        transformOrigin={{ vertical: 'top', horizontal: 'right' }}
        open={isMobileMenuOpen}
        onClose={this.handleMobileMenuClose}
      >
esikkala's avatar
esikkala committed
        {perspectives.map(perspective =>
          <MenuItem
            key={perspective}
            component={Link}
            to={`/${perspective}`}
          >
            {perspective.toUpperCase()}
          </MenuItem>
        )}
    return (
      <div className={classes.root}>
        <AppBar position="absolute">
          <Toolbar>
            <Button
              className={classes.appBarButton}
              component={Link}
              to='/'
            >
esikkala's avatar
esikkala committed
              <Typography className={classes.title} variant="h6" color="inherit">
            <TopBarSearchField
              fetchResultsClientSide={this.props.fetchResultsClientSide}
              clearResults={this.props.clearResults}
            />
            <div className={classes.grow} />
            <div className={classes.sectionDesktop}>
esikkala's avatar
esikkala committed
              {perspectives.map(perspective =>
                <Button
                  key={perspective}
                  className={classes.appBarButton}
                  component={NavLink}
                  to={`/${perspective}`}
                  isActive={(match, location) => location.pathname.startsWith(`/${perspective}`)}
                  activeClassName={classes.appBarButtonActive}
                >
                  {perspective}
                </Button>
              )}
            </div>
            <div className={classes.sectionMobile}>
              <IconButton aria-haspopup="true" onClick={this.handleMobileMenuOpen} color="inherit">
                <MoreIcon />
              </IconButton>
            </div>
          </Toolbar>
        </AppBar>
        {renderMobileMenu}
      </div>
    );
  }
}

TopBar.propTypes = {
  classes: PropTypes.object.isRequired,
  fetchResultsClientSide: PropTypes.func.isRequired,
  clearResults: PropTypes.func.isRequired,
};

export default withStyles(styles)(TopBar);