Skip to content
Snippets Groups Projects
Header.js 7.49 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';
    
    Rafael László's avatar
    Rafael László committed
      Popup,
      Icon,
    
    Rafael László's avatar
    Rafael László committed
      Responsive,
    
    } from 'semantic-ui-react';
    
    Rafael László's avatar
    Rafael László committed
    
    
    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';
    
    Rafael László's avatar
    Rafael László committed
    // Objects that will be converted to menu items in the render method
    
    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: 1,
    
    Rafael László's avatar
    Rafael László committed
      {
        text: 'Mentorok',
        to: '/mentors',
        prefix: '',
        permissionLevel: 1,
      },
    
      {
        text: 'Statisztika',
        to: '/statistics',
        prefix: '',
    
        permissionLevel: 3,
    
      {
        text: 'Jelentkezések',
        to: '/applications',
        prefix: '',
    
      {
        text: 'Házi feladatok',
        to: '/homework',
        prefix: '',
    
    class Header extends Component {
      constructor(props) {
        super(props);
        this.state = {
    
          isOpen: false,
    
    Rafael László's avatar
    Rafael László committed
      // Fetch the userData-s
    
      UNSAFE_componentWillMount() {
    
        this.props.getUserData();
      }
    
    Rafael László's avatar
    Rafael László committed
      // Hide the menu after clicking an item on mobile
    
      handleOpen = () => {
        this.setState({ isOpen: true });
      }
      handleClose = () => {
        this.setState({ isOpen: false });
    
      renderHeader(inHeader, hasArrowMenu) {
        let renderedItemNum = 0
        let current = 0
        let maxNum = 0
        if(this.props.user.id) {
          maxNum = menuItems.filter(item => {
            return this.props.user.permission >= item.permissionLevel
          }).length
        } else {
          maxNum = 3
        }
         
        return (
          <Segment inverted textAlign='center' vertical>
            <Container>
              <Menu inverted secondary size='large'>
                {/* Default Menu items */}
                {menuItems.map((item, i) => {
                  if (item.permissionLevel === 0) {
                    renderedItemNum += 1
                    return (
                      <Menu.Item key={i} as={Link} to={item.to}>
                      {item.prefix}{item.text}
                    </Menu.Item>
                    )
                  }else {
                    return null
                  }
                  })
                }
                {/* After default menu items */}
                {menuItems.map((item, i) => {
                  
                  if (this.props.user.permission >= item.permissionLevel
                  && item.permissionLevel > 0
                  && renderedItemNum < inHeader
                  && current < i) {
                    renderedItemNum += 1
                    current = i
                    return (
                      <Menu.Item key={i} as={Link} to={item.to}>
                        {item.prefix}{item.text}
                      </Menu.Item>
                    )
                  } else {
                    return null
                  }
                  })
                }
                {/* Arrow menu */}
                { this.props.user.id && (current + 1) < maxNum ?
                  <Popup flowing hoverable inverted 
                    trigger={
                      <Menu.Item>
                        <Icon name='angle down' size='large' />
                      </Menu.Item>
                    }
                    position='top center'
                  >
                    <Menu inverted secondary size='large'>
                      {menuItems.map((item, i) => {
                        return (this.props.user.permission >= item.permissionLevel
                          && item.permissionLevel > 0
                          && current < i ?
                            <Menu.Item key={i} as={Link} to={item.to}>
                                {item.prefix}{item.text}
                            </Menu.Item>
                          : null
                        )})
                      }
                    </Menu>
                  </Popup>
                  : null
                }
                {/* Login Button */}
                <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>
        )
      }
    
    
    Rafael László's avatar
    Rafael László committed
        return (
    
    Rafael László's avatar
    Rafael László committed
            {/* Tablet, Computer, ... view */}
    
            <Responsive minWidth={600} maxWidth={700}>
              {this.renderHeader(3)}
            </Responsive>
            <Responsive minWidth={701} maxWidth={800}>
              {this.renderHeader(4)}
            </Responsive>
            <Responsive minWidth={801} maxWidth={1000}>
              {this.renderHeader(5)}
            </Responsive>
            <Responsive minWidth={1001} maxWidth={1100}>
              {this.renderHeader(6)}
            </Responsive>
            <Responsive minWidth={1101} maxWidth={1200}>
              {this.renderHeader(7)}
            </Responsive>
            <Responsive minWidth={1201}>
              {this.renderHeader(8)}
    
    Rafael László's avatar
    Rafael László committed
            </Responsive>
    
    Rafael László's avatar
    Rafael László committed
            {/* Mobile view */}
    
    Rafael László's avatar
    Rafael László committed
            <Responsive maxWidth={599}>
    
              <Segment inverted textAlign='center' vertical>
    
    Rafael László's avatar
    Rafael László committed
                <Container>
    
                  <Menu inverted secondary size='large'>
    
    Rafael László's avatar
    Rafael László committed
                    {/* kszk logo + home link */}
                    <Menu.Item as={Link} to={menuItems[0].to}>
                      {menuItems[0].prefix}{menuItems[0].text}
                    </Menu.Item>     
                    {/* Sandwich menu */}
                    <Popup flowing hoverable inverted trigger={
                        <Menu.Item onClick={this.handleClose} 
                        position='right'>
                          <Icon name='bars' size='large' />
                        </Menu.Item>
                      }
    
                      position='top center'
    
    Rafael László's avatar
    Rafael László committed
                      open={this.state.isOpen}
                      onOpen={this.handleOpen}
    
    Rafael László's avatar
    Rafael László committed
                      size='huge'
                    >
    
                      <Menu vertical inverted secondary size='large'>
    
    Rafael László's avatar
    Rafael László committed
                        {menuItems.map((item, i) =>
    
    Rafael László's avatar
    Rafael László committed
                          ((this.props.user.permission >= item.permissionLevel 
                            ||item.permissionLevel === 0) && i>0?
    
                              <Menu.Item onClick={this.handleClose} 
                              key={i} as={Link} to={item.to}>
                                {item.prefix}{item.text}
                              </Menu.Item>
    
    Rafael László's avatar
    Rafael László committed
                              : null
                          ))
                        }
    
    Rafael László's avatar
    Rafael László committed
                        <Menu.Item>
    
    Rafael László's avatar
    Rafael László committed
                          {this.props.user.id ?
                            <Button.Group>
                              <Button onClick={this.handleClose} inverted as={Link} to='/profile'>Profilom</Button>
                              <Button onClick={this.handleClose} as='a' href='/api/v1/logout/' icon='sign out' />
                            </Button.Group>
    
    Rafael László's avatar
    Rafael László committed
                            <Button onClick={this.handleClose} as='a' href='/api/v1/login/authsch/' inverted>Bejelentkezés</Button>
    
    Rafael László's avatar
    Rafael László committed
                        </Menu.Item>
    
    Rafael László's avatar
    Rafael László committed
                      </Menu>
    
    Rafael László's avatar
    Rafael László committed
                    </Popup>
                  </Menu>
    
    Rafael László's avatar
    Rafael László committed
                </Container>
    
    Rafael László's avatar
    Rafael László committed
            </Responsive>
    
    
    const mapStateToProps = ({ user }) => ({
      user,
    });
    
    
    Rafael László's avatar
    Rafael László committed
    export default connect(mapStateToProps, { getUserData })(Header);