Newer
Older
import React from 'react';
import PropTypes from 'prop-types';
import intl from 'react-intl-universal';
import AppBar from '@material-ui/core/AppBar';
import Toolbar from '@material-ui/core/Toolbar';
import IconButton from '@material-ui/core/IconButton';
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';
import TopBarInfoButton from './TopBarInfoButton';
import TopBarLanguageButton from './TopBarLanguageButton';
root: {
//width: '100%',
},
grow: {
flexGrow: 1,
sectionDesktop: {
display: 'none',
display: 'flex',
},
sectionMobile: {
display: 'flex',
display: 'none',
},
appBarButton: {
color: 'white !important',
border: `1px solid ${theme.palette.primary.main}`
appBarButtonActive: {
border: '1px solid white'
},
appBarDivider: {
marginLeft: theme.spacing(1),
marginRight: theme.spacing(1),
borderLeft: '2px solid white'
});
class TopBar extends React.Component {
state = {
mobileMoreAnchorEl: null,
this.setState({ infoAnchorEl: event.currentTarget });
handleInfoMenuClose = () => {
this.setState({ infoAnchorEl: null });
handleMobileMenuOpen = event => {
this.setState({ mobileMoreAnchorEl: event.currentTarget });
handleMobileMenuClose = () => {
this.setState({ mobileMoreAnchorEl: null });
// https://material-ui.com/components/buttons/#third-party-routing-library
AdapterLink = React.forwardRef((props, ref) => <Link innerRef={ref} {...props} />);
AdapterNavLink = React.forwardRef((props, ref) => <NavLink innerRef={ref} {...props} />);
renderMobileMenuItem = perspective => {
if (has(perspective, 'externalUrl')) {
return(
<a className={this.props.classes.link}
key={perspective.id}
href={perspective.externalUrl}
target='_blank'
rel='noopener noreferrer'
>
<MenuItem>
{intl.get(`perspectives.${perspective.id}.label`).toUpperCase()}
</MenuItem>
</a>
);
} else {
return(
<MenuItem
key={perspective.id}
component={this.AdapterLink}
to={`/${perspective.id}/faceted-search`}
>
{intl.get(`perspectives.${perspective.id}.label`).toUpperCase()}
renderDesktopTopMenuItem = perspective => {
if (has(perspective, 'externalUrl')) {
return(
<a className={this.props.classes.link}
key={perspective.id}
href={perspective.externalUrl}
target='_blank'
rel='noopener noreferrer'
>
<Button
className={this.props.classes.appBarButton}
{intl.get(`perspectives.${perspective.id}.label`).toUpperCase()}
</Button>
</a>
);
} else {
return(
<Button
key={perspective.id}
className={this.props.classes.appBarButton}
component={this.AdapterNavLink}
to={`/${perspective.id}/faceted-search`}
isActive={(match, location) => location.pathname.startsWith(`/${perspective.id}`)}
activeClassName={this.props.classes.appBarButtonActive}
>
{intl.get(`perspectives.${perspective.id}.label`).toUpperCase()}
renderMobileMenu = perspectives =>
<Menu
anchorEl={this.state.mobileMoreAnchorEl}
anchorOrigin={{ vertical: 'top', horizontal: 'right' }}
transformOrigin={{ vertical: 'top', horizontal: 'right' }}
open={Boolean(this.state.mobileMoreAnchorEl)}
onClose={this.handleMobileMenuClose}
>
{perspectives.map(perspective => this.renderMobileMenuItem(perspective))}
<Divider />
<MenuItem
key='feedback'
component={this.AdapterLink}
to={`/feedback`}
>
FEEDBACK
</MenuItem>
<MenuItem
key={0}
component={this.AdapterLink}
to={`/about`}
>
ABOUT THE PROJECT
</MenuItem>
<a className={this.props.classes.link}
key={1}
href='http://mappingmanuscriptmigrations.org'
target='_blank'
rel='noopener noreferrer'
>
<MenuItem>
BLOG
</MenuItem>
</a>
<MenuItem
key='info'
component={this.AdapterLink}
to={`/instructions`}
>
INSTRUCTIONS
</MenuItem>
</Menu>
const { classes, perspectives, currentLocale, availableLocales } = this.props;
return (
<div className={classes.root}>
<AppBar position="absolute">
<Toolbar>
<Button
className={classes.appBarButton}
<Typography className={classes.title} variant="h6" color="inherit">
MMM
</Typography>
</Button>
<TopBarSearchField
fetchResultsClientSide={this.props.fetchResultsClientSide}
clearResults={this.props.clearResults}
/>
<div className={classes.grow} />
<div className={classes.sectionDesktop}>
{perspectives.map((perspective, index) => this.renderDesktopTopMenuItem(perspective, index))}
<div className={classes.appBarDivider}></div>
<Button
className={classes.appBarButton}
component={this.AdapterNavLink}
to={`/feedback`}
isActive={(match, location) => location.pathname.startsWith(`/feedback`)}
activeClassName={this.props.classes.appBarButtonActive}
>
Feedback
</Button>
<Button
className={classes.appBarButton}
component={this.AdapterNavLink}
to={`/instructions`}
isActive={(match, location) => location.pathname.startsWith(`/instructions`)}
activeClassName={this.props.classes.appBarButtonActive}
>
Instructions
</Button>
currentLocale={currentLocale}
availableLocales={availableLocales}
loadLocales={this.props.loadLocales}
</div>
<div className={classes.sectionMobile}>
<IconButton aria-haspopup="true" onClick={this.handleMobileMenuOpen} color="inherit">
<MoreIcon />
</IconButton>
</div>
</Toolbar>
</AppBar>
);
}
}
TopBar.propTypes = {
classes: PropTypes.object.isRequired,
fetchResultsClientSide: PropTypes.func.isRequired,
clearResults: PropTypes.func.isRequired,
loadLocales: PropTypes.func.isRequired,
perspectives: PropTypes.array.isRequired,
currentLocale: PropTypes.string.isRequired,
availableLocales: PropTypes.array.isRequired
};
export default withStyles(styles)(TopBar);