Newer
Older
piotr.kupczyk@id.ethz.ch
committed
import _ from 'lodash'
piotr.kupczyk@id.ethz.ch
committed
import { connect } from 'react-redux'
import { withStyles } from '@material-ui/core/styles'
piotr.kupczyk@id.ethz.ch
committed
import logger from '@src/js/common/logger.js'
import util from '@src/js/common/util.js'
import pages from '@src/js/common/consts/pages.js'
import actions from '@src/js/store/actions/actions.js'
import selectors from '@src/js/store/selectors/selectors.js'
piotr.kupczyk@id.ethz.ch
committed
import Loading from '@src/js/components/common/loading/Loading.jsx'
import Error from '@src/js/components/common/error/Error.jsx'
import Menu from '@src/js/components/common/menu/Menu.jsx'
piotr.kupczyk@id.ethz.ch
committed
import Login from '@src/js/components/login/Login.jsx'
piotr.kupczyk@id.ethz.ch
committed
import Users from '@src/js/components/users/Users.jsx'
import Types from '@src/js/components/types/Types.jsx'
piotr.kupczyk@id.ethz.ch
committed
import Tools from '@src/js/components/tools/Tools.jsx'
piotr.kupczyk@id.ethz.ch
committed
piotr.kupczyk@id.ethz.ch
committed
const styles = {
piotr.kupczyk@id.ethz.ch
committed
container: {
height: '100%',
display: 'flex',
flexDirection: 'column'
},
page: {
flex: '1 1 100%',
display: 'flex',
overflow: 'hidden'
},
piotr.kupczyk@id.ethz.ch
committed
visible: {
piotr.kupczyk@id.ethz.ch
committed
display: 'flex'
piotr.kupczyk@id.ethz.ch
committed
},
hidden: {
piotr.kupczyk@id.ethz.ch
committed
display: 'none'
piotr.kupczyk@id.ethz.ch
committed
}
piotr.kupczyk@id.ethz.ch
committed
}
const pageToComponent = {
piotr.kupczyk@id.ethz.ch
committed
[pages.TYPES]: Types,
piotr.kupczyk@id.ethz.ch
committed
[pages.USERS]: Users,
[pages.TOOLS]: Tools
piotr.kupczyk@id.ethz.ch
committed
}
piotr.kupczyk@id.ethz.ch
committed
function mapStateToProps(state) {
piotr.kupczyk@id.ethz.ch
committed
initialized: selectors.getInitialized(state),
piotr.kupczyk@id.ethz.ch
committed
loading: selectors.getLoading(state),
session: selectors.getSession(state),
piotr.kupczyk@id.ethz.ch
committed
currentPage: selectors.getCurrentPage(state),
error: selectors.getError(state)
}
}
piotr.kupczyk@id.ethz.ch
committed
function mapDispatchToProps(dispatch) {
piotr.kupczyk@id.ethz.ch
committed
init: () => {
dispatch(actions.init())
},
errorClosed: () => {
dispatch(actions.errorChange(null))
}
piotr.kupczyk@id.ethz.ch
committed
componentDidMount() {
piotr.kupczyk@id.ethz.ch
committed
logger.log(logger.DEBUG, 'App.render')
piotr.kupczyk@id.ethz.ch
committed
<Loading loading={this.props.loading}>
<Error error={this.props.error} errorClosed={this.props.errorClosed}>
piotr.kupczyk@id.ethz.ch
committed
{this.props.initialized && this.renderPage()}
</Error>
</Loading>
)
}
piotr.kupczyk@id.ethz.ch
committed
renderPage() {
piotr.kupczyk@id.ethz.ch
committed
const classes = this.props.classes
piotr.kupczyk@id.ethz.ch
committed
if (this.props.session) {
piotr.kupczyk@id.ethz.ch
committed
<div className={classes.container}>
piotr.kupczyk@id.ethz.ch
committed
<Menu page={this.props.currentPage} />
piotr.kupczyk@id.ethz.ch
committed
{_.map(pageToComponent, (PageComponent, page) => {
let visible = this.props.currentPage === page
return (
<div
key={page}
className={util.classNames(
classes.page,
visible ? classes.visible : classes.hidden
)}
>
<PageComponent />
</div>
)
})}
piotr.kupczyk@id.ethz.ch
committed
} else {
return <Login disabled={this.props.loading} />
piotr.kupczyk@id.ethz.ch
committed
export default _.flow(
piotr.kupczyk@id.ethz.ch
committed
connect(mapStateToProps, mapDispatchToProps),
piotr.kupczyk@id.ethz.ch
committed
withStyles(styles)
)(App)