Skip to content
Snippets Groups Projects
Header.js 5.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • import React, { Component } from 'react';
    
    Tamás Szabó's avatar
    Tamás Szabó committed
    import { Link } from 'react-router-dom';
    
    import {
      Menu,
      Container,
      Button,
      Segment,
      Visibility,
    
      Responsive,
      Sidebar,
      Icon
    
    } from 'semantic-ui-react';
    import { connect } from 'react-redux';
    
    Tamás Szabó's avatar
    Tamás Szabó committed
    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: '',
    
      {
        text: 'Házi feladatok',
        to: '/homework',
        prefix: '',
    
    const FixedMenu = ({ user }) => (
      <Menu fixed='top' size='large' pointing>
    
          {menuItems.map((item, i) =>
            (user.permission >= item.permissionLevel ||
              (item.permissionLevel === 0)
              ?
    
                <Menu.Item key={i} as={Link} to={item.to}>{item.text}</Menu.Item>
    
          <Menu.Menu position='right'>
            <Menu.Item className='item'>
              {
                user.id ?
    
    Tamás Szabó's avatar
    Tamás Szabó committed
                  <Button.Group>
                    <Button primary as={Link} to='/profile'>Profilom</Button>
    
                    <Button as='a' href='/api/v1/logout/'icon='sign out' />
    
    Tamás Szabó's avatar
    Tamás Szabó committed
                  </Button.Group>
    
                  <Button as='a' href='/api/v1/login/authsch/' >Bejelentkezés</Button>
    
    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 });
      }
    
        const { visible } = this.state.visible;
        const { children, user } = this.props;
    
          <Responsive {...Responsive.onlyComputer}>
    
            {visible ? <FixedMenu user={this.props.user} /> : null}
    
              onBottomPassed={() => this.showFixedMenu()}
              onBottomVisible={() => this.hideFixedMenu()}
    
              <Segment inverted textAlign='center' vertical>
    
                  <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>
                          :
    
                    <Menu.Item position='right'>
                      {
                        this.props.user.id ?
    
    Tamás Szabó's avatar
    Tamás Szabó committed
                          <Button.Group>
    
    Tamás Szabó's avatar
    Tamás Szabó committed
                            <Button inverted as={Link} to='/profile'>Profilom</Button>
    
                            <Button as='a' href='/api/v1/logout/' icon='sign out' />
    
    Tamás Szabó's avatar
    Tamás Szabó committed
                          </Button.Group>
    
                          <Button as='a' href='/api/v1/login/authsch/' inverted>Bejelentkezés</Button>
    
            {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,
    });
    
    
    Tamás Szabó's avatar
    Tamás Szabó committed
    export default connect(mapStateToProps, { getUserData })(Header);