materialuiupgraded
Version:
Material-UI's workspace package
134 lines (121 loc) • 3.32 kB
JavaScript
import React from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import { withStyles } from '@material-ui/core/styles';
import ListItem from '@material-ui/core/ListItem';
import Button from '@material-ui/core/Button';
import Collapse from '@material-ui/core/Collapse';
import Link from 'docs/src/modules/components/Link';
const styles = theme => ({
item: {
display: 'block',
paddingTop: 0,
paddingBottom: 0,
},
itemLeaf: {
display: 'flex',
paddingTop: 0,
paddingBottom: 0,
},
button: {
letterSpacing: 0,
justifyContent: 'flex-start',
textTransform: 'none',
width: '100%',
},
buttonLeaf: {
letterSpacing: 0,
justifyContent: 'flex-start',
textTransform: 'none',
width: '100%',
fontWeight: theme.typography.fontWeightRegular,
'&.depth-0': {
fontWeight: theme.typography.fontWeightMedium,
},
},
active: {
color: theme.palette.primary.main,
fontWeight: theme.typography.fontWeightMedium,
},
});
class AppDrawerNavItem extends React.Component {
state = {
open: this.props.openImmediately,
};
componentDidMount() {
// So we only run this logic once.
if (!this.props.openImmediately) {
return;
}
// Center the selected item in the list container.
const activeElement = document.querySelector(`.${this.props.classes.active}`);
if (activeElement && activeElement.scrollIntoView) {
activeElement.scrollIntoView({});
}
}
handleClick = () => {
this.setState(state => ({ open: !state.open }));
};
render() {
const {
children,
classes,
depth,
href,
onClick,
openImmediately,
title,
...other
} = this.props;
const style = {
paddingLeft: 8 * (3 + 2 * depth),
};
if (href) {
return (
<ListItem className={classes.itemLeaf} disableGutters {...other}>
<Button
component={props => (
<Link variant="button" activeClassName={classes.active} href={href} {...props} />
)}
className={classNames(classes.buttonLeaf, `depth-${depth}`)}
disableRipple
onClick={onClick}
style={style}
>
{title}
</Button>
</ListItem>
);
}
return (
<ListItem className={classes.item} disableGutters {...other}>
<Button
classes={{
root: classes.button,
label: openImmediately ? 'algolia-lvl0' : '',
}}
onClick={this.handleClick}
style={style}
>
{title}
</Button>
<Collapse in={this.state.open} timeout="auto" unmountOnExit>
{children}
</Collapse>
</ListItem>
);
}
}
AppDrawerNavItem.propTypes = {
children: PropTypes.node,
classes: PropTypes.object.isRequired,
depth: PropTypes.number.isRequired,
href: PropTypes.string,
onClick: PropTypes.func,
openImmediately: PropTypes.bool,
title: PropTypes.string.isRequired,
};
AppDrawerNavItem.defaultProps = {
openImmediately: false,
};
export default withStyles(styles)(AppDrawerNavItem);