twreporter-react
Version:
React-Redux site for The Reporter Foundation in Taiwan
166 lines (142 loc) • 5.72 kB
JavaScript
import React from 'react';
import ReactDOM from 'react-dom';
import BurgerMenu from 'react-burger-menu';
import classNames from 'classnames';
let MenuWrap = React.createClass({
getInitialState() {
return { hidden : false };
},
componentWillReceiveProps(nextProps) {
const sideChanged = this.props.children.props.right !== nextProps.children.props.right;
if (sideChanged) {
this.setState({ hidden : true });
setTimeout(() => {
this.show();
}, this.props.wait);
}
},
show() {
this.setState({ hidden : false });
},
render() {
let style;
if (this.state.hidden) {
style = { display: 'none' };
}
return (
<div style={ style } className={ this.props.side }>
{ this.props.children }
</div>
);
}
});
let Demo = React.createClass({
changeMenu(menu) {
this.setState({ currentMenu: menu });
},
changeSide(side) {
this.setState({ side });
},
getItems() {
let items;
switch (this.props.menus[this.state.currentMenu].items) {
case 1:
items = [
<a key="0" href=""><i className="fa fa-fw fa-star-o"></i><span>Favorites</span></a>,
<a key="1" href=""><i className="fa fa-fw fa-bell-o"></i><span>Alerts</span></a>,
<a key="2" href=""><i className="fa fa-fw fa-envelope-o"></i><span>Messages</span></a>,
<a key="3" href=""><i className="fa fa-fw fa-comment-o"></i><span>Comments</span></a>,
<a key="4" href=""><i className="fa fa-fw fa-bar-chart-o"></i><span>Analytics</span></a>,
<a key="5" href=""><i className="fa fa-fw fa-newspaper-o"></i><span>Reading List</span></a>
];
break;
case 2:
items = [
<h2 key="0"><i className="fa fa-fw fa-inbox fa-2x"></i><span>Sidebar</span></h2>,
<a key="1" href=""><i className="fa fa-fw fa-database"></i><span>Data Management</span></a>,
<a key="2" href=""><i className="fa fa-fw fa-map-marker"></i><span>Location</span></a>,
<a key="3" href=""><i className="fa fa-fw fa-mortar-board"></i><span>Study</span></a>,
<a key="4" href=""><i className="fa fa-fw fa-picture-o"></i><span>Collections</span></a>,
<a key="5" href=""><i className="fa fa-fw fa-money"></i><span>Credits</span></a>
];
break;
default:
items = [
<a key="0" href=""><i className="fa fa-fw fa-star-o"></i><span>Favorites</span></a>,
<a key="1" href=""><i className="fa fa-fw fa-bell-o"></i><span>Alerts</span></a>,
<a key="2" href=""><i className="fa fa-fw fa-envelope-o"></i><span>Messages</span></a>,
<a key="3" href=""><i className="fa fa-fw fa-comment-o"></i><span>Comments</span></a>,
<a key="4" href=""><i className="fa fa-fw fa-bar-chart-o"></i><span>Analytics</span></a>,
<a key="5" href=""><i className="fa fa-fw fa-newspaper-o"></i><span>Reading List</span></a>
];
}
return items;
},
getMenu() {
const Menu = BurgerMenu[this.state.currentMenu];
const items = this.getItems();
let jsx;
if (this.state.side === 'right') {
jsx = (
<MenuWrap wait={ 20 } side={ this.state.side }>
<Menu id={ this.state.currentMenu } pageWrapId={ "page-wrap" } outerContainerId={ "outer-container" } right>
{ items }
</Menu>
</MenuWrap>
);
} else {
jsx = (
<MenuWrap wait={ 20 }>
<Menu id={ this.state.currentMenu } pageWrapId={ "page-wrap" } outerContainerId={ "outer-container" }>
{ items }
</Menu>
</MenuWrap>
);
}
return jsx;
},
getInitialState() {
return {
currentMenu: 'slide',
side: 'left'
};
},
render() {
const buttons = Object.keys(this.props.menus).map((menu) => {
return (
<a key={ menu }
className={ classNames({'current-demo': menu === this.state.currentMenu}) }
onClick={ this.changeMenu.bind(this, menu) }>
{ this.props.menus[menu].buttonText }
</a>
);
});
return (
<div id="outer-container" style={ { height: '100%' } }>
{ this.getMenu() }
<main id="page-wrap">
<h1><a href="https://github.com/negomi/react-burger-menu">react-burger-menu</a></h1>
<a className={ classNames({'side-button': true, 'left': true, 'active': this.state.side === 'left'}) } onClick={ this.changeSide.bind(this, 'left') }>Left</a>
<a className={ classNames({'side-button': true, 'right': true, 'active': this.state.side === 'right'}) } onClick={ this.changeSide.bind(this, 'right') }>Right</a>
<h2 className="description">An off-canvas sidebar React component with a collection of effects and styles using CSS transitions and SVG path animations.</h2>
<nav className="demo-buttons">
{ buttons }
</nav>
Inspired by <a href="https://github.com/codrops/OffCanvasMenuEffects">Off-Canvas Menu Effects</a> and <a href="https://github.com/codrops/SidebarTransitions">Sidebar Transitions</a> by Codrops
</main>
</div>
);
}
});
const menus = {
slide: { buttonText: 'Slide', items: 1 },
stack: { buttonText: 'Stack', items: 1 },
elastic: { buttonText: 'Elastic', items: 1 },
bubble: { buttonText: 'Bubble', items: 1 },
push: { buttonText: 'Push', items: 1 },
pushRotate: { buttonText: 'Push Rotate', items: 2 },
scaleDown: { buttonText: 'Scale Down', items: 2 },
scaleRotate: { buttonText: 'Scale Rotate', items: 2 },
fallDown: { buttonText: 'Fall Down', items: 2 }
};
ReactDOM.render(<Demo menus={ menus } />, document.getElementById('app'));