rmwc
Version:
A thin React wrapper for Material Design (Web) Components
191 lines (170 loc) • 6.16 kB
JavaScript
import * as React from 'react';
import { Route, Link, Switch as RouterSwitch } from 'react-router-dom';
import { menuContent } from './menuContent';
import { version } from 'rmwc/rmwc';
import {
TopAppBar,
TopAppBarRow,
TopAppBarSection,
TopAppBarTitle,
TopAppBarNavigationIcon,
TopAppBarActionItem
} from 'rmwc/TopAppBar';
import { Theme } from 'rmwc/Theme';
import { Drawer, DrawerContent } from 'rmwc/Drawer';
import { ListItem, ListItemText } from 'rmwc/List';
import Submenu from './Submenu';
import Home from './Home';
const MenuItem = ({ url, label }) => {
return (
<ListItem
onClick={() => window.scrollTo(0, 0)}
activated={
window.location.pathname.split('/').pop() === url.split('/').pop()
}
>
<Link to={url}>
<ListItemText>{label}</ListItemText>
</Link>
</ListItem>
);
};
export class App extends React.Component {
componentDidMount() {
window.addEventListener('resize', () => this.doSizeCheck());
this.doSizeCheck(true);
}
componentDidUpdate(prevProps, prevState) {
// a hack to help components layout that depend on window events
// The size of the content changes on drawer open and close
if (prevState.menuIsOpen !== this.state.menuIsOpen) {
setTimeout(() => {
window.dispatchEvent(new Event('resize'));
}, 300);
}
}
state = {
menuIsOpen: false,
isMobile: true
};
doSizeCheck(initial) {
const isMobile = window.innerWidth < 640;
const menuIsOpen =
initial && window.innerWidth > 640 ? true : this.state.menuIsOpen;
if (
this.state.isMobile !== isMobile ||
this.state.menuIsOpen !== menuIsOpen
) {
this.setState({ isMobile, menuIsOpen });
}
}
render() {
const pageId = `page-${window.location.pathname.split('/').pop() ||
'home'}`;
return (
<Theme className="app__root" tag="div" id={pageId}>
<TopAppBar fixed className="app__top-app-bar">
<TopAppBarRow>
<TopAppBarSection alignStart>
<TopAppBarNavigationIcon
style={{ color: 'inherit', alignSelf: 'center' }}
onClick={evt =>
this.setState({ menuIsOpen: !this.state.menuIsOpen })
}
>
menu
</TopAppBarNavigationIcon>
<TopAppBarTitle tag={Link} to="/">
RMWC
</TopAppBarTitle>
</TopAppBarSection>
<TopAppBarSection alignEnd>
{!this.state.isMobile && (
<React.Fragment>
<span className="app__version">{version}</span>
</React.Fragment>
)}
<TopAppBarActionItem
tag="a"
href="https://github.com/jamesmfriedman/rmwc"
use={
<svg
style={{ width: '24px', height: '24px' }}
viewBox="0 0 24 24"
>
<path
fill="#ffffff"
d="M12,2A10,10 0 0,0 2,12C2,16.42 4.87,20.17 8.84,21.5C9.34,21.58 9.5,21.27 9.5,21C9.5,20.77 9.5,20.14 9.5,19.31C6.73,19.91 6.14,17.97 6.14,17.97C5.68,16.81 5.03,16.5 5.03,16.5C4.12,15.88 5.1,15.9 5.1,15.9C6.1,15.97 6.63,16.93 6.63,16.93C7.5,18.45 8.97,18 9.54,17.76C9.63,17.11 9.89,16.67 10.17,16.42C7.95,16.17 5.62,15.31 5.62,11.5C5.62,10.39 6,9.5 6.65,8.79C6.55,8.54 6.2,7.5 6.75,6.15C6.75,6.15 7.59,5.88 9.5,7.17C10.29,6.95 11.15,6.84 12,6.84C12.85,6.84 13.71,6.95 14.5,7.17C16.41,5.88 17.25,6.15 17.25,6.15C17.8,7.5 17.45,8.54 17.35,8.79C18,9.5 18.38,10.39 18.38,11.5C18.38,15.32 16.04,16.16 13.81,16.41C14.17,16.72 14.5,17.33 14.5,18.26C14.5,19.6 14.5,20.68 14.5,21C14.5,21.27 14.66,21.59 15.17,21.5C19.14,20.16 22,16.42 22,12A10,10 0 0,0 12,2Z"
/>
</svg>
}
/>
</TopAppBarSection>
</TopAppBarRow>
</TopAppBar>
<div className="demo-content">
{/* Nav */}
<Drawer
id="main-nav"
open={this.state.menuIsOpen}
persistent={!this.state.isMobile}
temporary={this.state.isMobile}
onClose={() => this.setState({ menuIsOpen: false })}
>
<DrawerContent>
{menuContent.map(m => {
if (m.options) {
return (
<Submenu label={m.label} key={m.label}>
{m.options.map(v => (
<MenuItem key={v.label} label={v.label} url={v.url} />
))}
</Submenu>
);
}
return <MenuItem label={m.label} url={m.url} key={m.label} />;
})}
</DrawerContent>
</Drawer>
{/* End Nav */}
<main className="app__content">
<RouterSwitch>
<Route path={'/'} exact component={Home} />
{menuContent.map(m => {
if (m.options) {
return m.options.map(v => (
<Route
path={v.url}
exact
render={() => {
document.title = `RMWC | React Material Web Components | ${
v.label
}`;
return <v.component />;
}}
key={v.label + 'sub'}
/>
));
}
return (
<Route
path={m.url}
exact
key={m.label}
render={() => {
document.title = `RMWC | React Material Web Components | ${
m.label
}`;
return <m.component />;
}}
/>
);
})}
</RouterSwitch>
</main>
</div>
</Theme>
);
}
}
export default App;