UNPKG

materialuiupgraded

Version:

Material-UI's workspace package

230 lines (211 loc) 6.93 kB
import React from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import compose from 'recompose/compose'; import NProgress from 'nprogress'; import Router from 'next/router'; import { withStyles } from '@material-ui/core/styles'; import Typography from '@material-ui/core/Typography'; import AppBar from '@material-ui/core/AppBar'; import Toolbar from '@material-ui/core/Toolbar'; import IconButton from '@material-ui/core/IconButton'; import Tooltip from '@material-ui/core/Tooltip'; import CssBaseline from '@material-ui/core/CssBaseline'; import MenuIcon from '@material-ui/icons/Menu'; import ColorsIcon from '@material-ui/icons/InvertColors'; import LightbulbOutlineIcon from '@material-ui/docs/svgIcons/LightbulbOutline'; import LightbulbFullIcon from '@material-ui/docs/svgIcons/LightbulbFull'; import NProgressBar from '@material-ui/docs/NProgressBar'; import FormatTextdirectionLToR from '@material-ui/icons/FormatTextdirectionLToR'; import FormatTextdirectionRToL from '@material-ui/icons/FormatTextdirectionRToL'; import GithubIcon from '@material-ui/docs/svgIcons/GitHub'; import Link from 'docs/src/modules/components/Link'; import AppDrawer from 'docs/src/modules/components/AppDrawer'; import AppSearch from 'docs/src/modules/components/AppSearch'; import Notifications from 'docs/src/modules/components/Notifications'; import { pageToTitle } from 'docs/src/modules/utils/helpers'; import actionTypes from 'docs/src/modules/redux/actionTypes'; Router.onRouteChangeStart = () => { NProgress.start(); }; Router.onRouteChangeComplete = () => { NProgress.done(); }; Router.onRouteChangeError = () => { NProgress.done(); }; const styles = theme => ({ root: { display: 'flex', }, grow: { flex: '1 1 auto', }, title: { marginLeft: 24, flex: '0 1 auto', }, appBar: { transition: theme.transitions.create('width'), '@media print': { position: 'absolute', }, }, appBarHome: { boxShadow: 'none', }, appBarShift: { [theme.breakpoints.up('lg')]: { width: 'calc(100% - 240px)', }, }, drawer: { [theme.breakpoints.up('lg')]: { width: 240, }, }, navIconHide: { [theme.breakpoints.up('lg')]: { display: 'none', }, }, }); class AppFrame extends React.Component { state = { mobileOpen: false, }; handleDrawerOpen = () => { this.setState({ mobileOpen: true }); }; handleDrawerClose = () => { this.setState({ mobileOpen: false }); }; handleTogglePaletteType = () => { this.props.dispatch({ type: actionTypes.THEME_CHANGE_PALETTE_TYPE, payload: { paletteType: this.props.uiTheme.paletteType === 'light' ? 'dark' : 'light', }, }); }; handleToggleDirection = () => { this.props.dispatch({ type: actionTypes.THEME_CHANGE_DIRECTION, payload: { direction: this.props.uiTheme.direction === 'ltr' ? 'rtl' : 'ltr', }, }); }; render() { const { children, classes, uiTheme } = this.props; if (!this.context.activePage) { throw new Error('Missing activePage.'); } const title = this.context.activePage.title !== false ? pageToTitle(this.context.activePage) : null; let disablePermanent = false; let navIconClassName = ''; let appBarClassName = classes.appBar; if (title === null) { // home route, don't shift app bar or dock drawer disablePermanent = true; appBarClassName += ` ${classes.appBarHome}`; } else { navIconClassName = classes.navIconHide; appBarClassName += ` ${classes.appBarShift}`; } return ( <div className={classes.root}> <NProgressBar /> <CssBaseline /> <AppBar className={appBarClassName}> <Toolbar> <IconButton color="inherit" aria-label="Open drawer" onClick={this.handleDrawerOpen} className={navIconClassName} > <MenuIcon /> </IconButton> {title !== null && ( <Typography className={classes.title} variant="h6" color="inherit" noWrap> {title} </Typography> )} <div className={classes.grow} /> <AppSearch /> <Tooltip title="Edit docs colors" enterDelay={300}> <IconButton color="inherit" aria-label="Edit docs colors" component={Link} href="/style/color/#color-tool" > <ColorsIcon /> </IconButton> </Tooltip> <Tooltip title="Toggle light/dark theme" enterDelay={300}> <IconButton color="inherit" onClick={this.handleTogglePaletteType} aria-label="Toggle light/dark theme" > {uiTheme.paletteType === 'light' ? <LightbulbOutlineIcon /> : <LightbulbFullIcon />} </IconButton> </Tooltip> <Tooltip title="Toggle right-to-left/left-to-right" enterDelay={300}> <IconButton color="inherit" onClick={this.handleToggleDirection} aria-label="Toggle right-to-left/left-to-right" > {uiTheme.direction === 'rtl' ? ( <FormatTextdirectionLToR /> ) : ( <FormatTextdirectionRToL /> )} </IconButton> </Tooltip> <Tooltip title="GitHub repository" enterDelay={300}> <IconButton component="a" color="inherit" href="https://github.com/mui-org/material-ui" aria-label="GitHub repository" > <GithubIcon /> </IconButton> </Tooltip> </Toolbar> </AppBar> <Notifications /> <AppDrawer className={classes.drawer} disablePermanent={disablePermanent} onClose={this.handleDrawerClose} onOpen={this.handleDrawerOpen} mobileOpen={this.state.mobileOpen} /> {children} </div> ); } } AppFrame.propTypes = { children: PropTypes.node.isRequired, classes: PropTypes.object.isRequired, dispatch: PropTypes.func.isRequired, uiTheme: PropTypes.object.isRequired, }; AppFrame.contextTypes = { activePage: PropTypes.shape({ pathname: PropTypes.string.isRequired, }).isRequired, }; export default compose( withStyles(styles), connect(state => ({ uiTheme: state.theme, })), )(AppFrame);