import React, { Component } from 'react'; import { Link } from 'react-router-dom'; import { Menu, Container, Button, Segment, Visibility, Image, Responsive, Sidebar, Icon } from 'semantic-ui-react'; import { connect } from 'react-redux'; import { getUserData } from '../actions'; import KSZKlogo from './images/kszk_logo.svg'; const menuItems = [ { text: 'Főoldal', to: '/home', prefix: <Image size='mini' src={KSZKlogo} style={{ marginRight: '1.5em' }} />, permissionLevel: 0, }, { text: 'Hírek', to: '/news', prefix: '', permissionLevel: 0, }, { text: 'Köreink', to: '/groups', prefix: '', permissionLevel: 0, }, { text: 'Ütemterv', to: '/schedule', prefix: '', permissionLevel: 2, }, { text: 'Statisztika', to: '/statistics', prefix: '', permissionLevel: 3, }, { text: 'Jelentkezések', to: '/applications', prefix: '', permissionLevel: 3, }, { text: 'Házi feladatok', to: '/homework', prefix: '', permissionLevel: 2, }, ]; const FixedMenu = ({ user }) => ( <Menu fixed='top' size='large' pointing> <Container> {menuItems.map((item, i) => (user.permission >= item.permissionLevel || (item.permissionLevel === 0) ? <Menu.Item key={i} as={Link} to={item.to}>{item.text}</Menu.Item> : null))} <Menu.Menu position='right'> <Menu.Item className='item'> { user.id ? <Button.Group> <Button primary as={Link} to='/profile'>Profilom</Button> <Button as='a' href='/api/v1/logout/'icon='sign out' /> </Button.Group> : <Button as='a' href='/api/v1/login/authsch/' >Bejelentkezés</Button> } </Menu.Item> </Menu.Menu> </Container> </Menu> ); class MobileContainer extends Component { constructor(props) { super(props); this.state = { sidebarVisible: false, }; } componentWillMount() { this.props.getUserData(); } render() { const visible = this.state.sidebarVisible; const { children, user } = this.props; return( <Responsive {...Responsive.onlyMobile}> <Segment inverted textAlign='center' vertical> <Container> <Menu inverted secondary> <Menu.Item onClick={visible ? this.handleHideClick : this.handleShowClick}><Icon name='sidebar'/></Menu.Item> </Menu> </Container> </Segment> <Sidebar.Pushable> <Sidebar as={Menu} animation='overlay' icon='labeled' inverted vertical visible={visible} width='thin' > {menuItems.map((item, i) => (this.props.user.permission >= item.permissionLevel || (item.permissionLevel === 0) ? <Menu.Item key={i} as={Link} to={item.to} onClick={this.handleSidebarHide}>{item.prefix}{item.text}</Menu.Item> : null))} </Sidebar> <Sidebar.Pusher onClick={this.handleSidebarHide}> {children} </Sidebar.Pusher> </Sidebar.Pushable> </Responsive>); } handleShowClick = () => this.setState({ sidebarVisible: true }) handleHideClick = () => this.setState({ sidebarVisible: false }) handleSidebarHide = () => this.setState({ sidebarVisible: false }) } class DesktopContainer extends Component { constructor(props) { super(props); this.state = { visible: false, }; } componentWillMount() { this.props.getUserData(); } hideFixedMenu() { this.setState({ visible: false }); } showFixedMenu() { this.setState({ visible: true }); } render() { const { visible } = this.state.visible; const { children, user } = this.props; return ( <Responsive {...Responsive.onlyComputer}> {visible ? <FixedMenu user={this.props.user} /> : null} <Visibility onBottomPassed={() => this.showFixedMenu()} onBottomVisible={() => this.hideFixedMenu()} once={false} > <Segment inverted textAlign='center' vertical> <Container> <Menu inverted secondary stackable size='large'> {menuItems.map((item, i) => (this.props.user.permission >= item.permissionLevel || (item.permissionLevel === 0) ? <Menu.Item key={i} as={Link} to={item.to}>{item.prefix}{item.text}</Menu.Item> : null))} <Menu.Item position='right'> { this.props.user.id ? <Button.Group> <Button inverted as={Link} to='/profile'>Profilom</Button> <Button as='a' href='/api/v1/logout/' icon='sign out' /> </Button.Group> : <Button as='a' href='/api/v1/login/authsch/' inverted>Bejelentkezés</Button> } </Menu.Item> </Menu> </Container> </Segment> </Visibility> {children} </Responsive> ); } } const Header = ({ children, user, getUserData }) => ( <div> <DesktopContainer user={user} getUserData={getUserData}>{children}</DesktopContainer> <MobileContainer user={user} getUserData={getUserData}>{children}</MobileContainer> </div> ) const mapStateToProps = ({ user }) => ({ user, }); export default connect(mapStateToProps, { getUserData })(Header);