predix-ui
Version:
px-* web components as React styled components
140 lines (124 loc) • 3.8 kB
JavaScript
import React from 'react';
import classnames from 'classnames';
import PropTypes from 'prop-types';
import Drawer from '../../Drawer';
import BrandingBar from '../../BrandingBar';
import AppNav from '../../AppNav';
import Navbar from '../../Navbar';
import BaseComponent from '../../BaseComponent';
import IronMediaQuery from '../../../iron/IronMediaQuery';
class DrawerLayout extends BaseComponent {
constructor(props) {
super(props, { displayName: 'DrawerLayout' });
this.isAttached = false;
this.state = {
isNarrow: false
};
this.handleMediaChange = this.handleMediaChange.bind(this);
}
componentDidMount() {
this.isAttached = true;
}
// TODO: Implement changes to position containter based on drawer width;
handleMediaChange(e) {
const narrow = !e.queryMatches;
const { contentContainer, drawer } = this;
const drawerWidth = drawer.offsetWidth || '256';
if (narrow) {
contentContainer.style.marginLeft = '';
contentContainer.style.marginRight = '';
} else if (drawer.props.align === 'right') {
contentContainer.style.marginLeft = '';
contentContainer.style.marginRight = `${drawerWidth}px`;
} else {
contentContainer.style.marginLeft = `${drawerWidth}px`;
contentContainer.style.marginRight = '';
}
this.setState({ isNarrow: narrow });
}
_handleDrawerToggle() {
this.drawer.toggle();
}
render() {
const {
title,
responsiveWidth,
navItems,
drawerContent,
navbarContent,
children
} = this.props;
const {
isOpen,
isNarrow
} = this.state;
const baseClassNames = classnames(
'px-drawer-layout',
{ 'px-drawer-layout--is-narrow': isNarrow },
'l-drawer-layout'
);
const headerContent = (
<div className="flex">
<div className="flex__item">
<BrandingBar title={title} />
</div>
</div>
);
return (
<div className={baseClassNames} ref={(el) => { this.baseElement = el; }}>
{!isNarrow && headerContent}
<div id="container" className="l-drawer-layout__container" ref={(el) => { this.container = el; }}>
<div id="drawerContainer" className="l-drawer-layout__drawer" ref={(el) => { this.drawerContainer = el; }}>
<Drawer
ref={(el) => { this.drawer = el; }}
open={isOpen}
docked={!isNarrow}
onOverlayClick={() => this.setState({ isOpen: false })}
>
<AppNav
vertical
items={navItems}
/>
{drawerContent}
</Drawer>
</div>
<div id="contentContainer" className="l-drawer-layout__content" ref={(el) => { this.contentContainer = el; }}>
<nav id="navbarContent">
{ navbarContent }
<Navbar
title={title}
showMenuButton={isNarrow}
onMenuButtonClick={e => this._handleDrawerToggle(e)}
/>
</nav>
<div id="content">{children}</div>
</div>
</div>
<IronMediaQuery
onChange={this.handleMediaChange}
query={`(min-width: ${responsiveWidth})`}
full
/>
</div>
);
}
}
DrawerLayout.defaultProps = {
title: null,
navbarContent: null,
drawerContainer: null,
drawerContent: null,
forceNarrow: false,
responsiveWidth: '768px',
narrow: false
};
DrawerLayout.propTypes = {
title: PropTypes.string,
navbarContent: PropTypes.node,
drawerContainer: PropTypes.node,
drawerContent: PropTypes.node,
forceNarrow: PropTypes.bool,
responsiveWidth: PropTypes.string,
narrow: PropTypes.bool
};
export default DrawerLayout;