Skip to content
Snippets Groups Projects
Header.js 8.3 KiB
Newer Older
  • Learn to ignore specific revisions
  • Rafael László's avatar
    Rafael László committed
      Container,
      Icon,
    
    Rafael László's avatar
    Rafael László committed
      Menu,
    
    Rafael László's avatar
    Rafael László committed
      Popup,
    
    Rafael László's avatar
    Rafael László committed
      Responsive,
    
    Rafael László's avatar
    Rafael László committed
      Segment,
    
    } from 'semantic-ui-react';
    
    Rafael László's avatar
    Rafael László committed
    import React, { Component } from 'react';
    
    Rafael László's avatar
    Rafael László committed
    
    
    Rafael László's avatar
    Rafael László committed
    import KSZKlogo from './images/kszk_logo.svg';
    import { Link } from 'react-router-dom';
    
    import { connect } from 'react-redux';
    
    Tamás Szabó's avatar
    Tamás Szabó committed
    import { getUserData } from '../actions';
    
    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',
    
    Rafael László's avatar
    Rafael László committed
        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: '',
    
    Rafael László's avatar
    Rafael László committed
        permissionLevel: 2,
    
    Rafael László's avatar
    Rafael László committed
      },
    
      {
        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
    
    
    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 });
    
    Rafael László's avatar
    Rafael László committed
      };
    
    Rafael László's avatar
    Rafael László committed
    
    
      handleClose = () => {
        this.setState({ isOpen: false });
    
    Rafael László's avatar
    Rafael László committed
      };
    
    Rafael László's avatar
    Rafael László committed
      renderHeader(inHeader) {
        let renderedItemNum = 0;
        let current = 0;
        let maxNum = 0;
        if (this.props.user.id) {
    
    Rafael László's avatar
    Rafael László committed
          maxNum = menuItems.filter(
            (item) => this.props.user.permission >= item.permissionLevel
          ).length;
    
    Rafael László's avatar
    Rafael László committed
          maxNum = 3;
    
    Rafael László's avatar
    Rafael László committed
    
    
    Rafael László's avatar
    Rafael László committed
          <Segment inverted textAlign="center" vertical>
    
    Rafael László's avatar
    Rafael László committed
              <Menu inverted secondary size="large">
    
                {/* Default Menu items */}
    
    Rafael László's avatar
    Rafael László committed
                {menuItems.map((item) => {
    
                  if (item.permissionLevel === 0) {
    
    Rafael László's avatar
    Rafael László committed
                    renderedItemNum += 1;
    
    Rafael László's avatar
    Rafael László committed
                      <Menu.Item key={Math.random()} as={Link} to={item.to}>
                        {item.prefix}
                        {item.text}
                      </Menu.Item>
                    );
    
    Rafael László's avatar
    Rafael László committed
                  return null;
                })}
    
                {/* After default menu items */}
                {menuItems.map((item, i) => {
    
    Rafael László's avatar
    Rafael László committed
                  if (
                    this.props.user.permission >= item.permissionLevel &&
                    item.permissionLevel > 0 &&
                    renderedItemNum < inHeader &&
                    current < i
                  ) {
    
    Rafael László's avatar
    Rafael László committed
                    renderedItemNum += 1;
                    current = i;
    
    Rafael László's avatar
    Rafael László committed
                      <Menu.Item key={Math.random()} as={Link} to={item.to}>
                        {item.prefix}
                        {item.text}
    
    Rafael László's avatar
    Rafael László committed
                    );
    
    Rafael László's avatar
    Rafael László committed
                  return null;
                })}
    
                {/* Arrow menu */}
    
    Rafael László's avatar
    Rafael László committed
                {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) =>
                        this.props.user.permission >= item.permissionLevel &&
                        item.permissionLevel > 0 &&
                        current < i ? (
                          <Menu.Item key={Math.random()} as={Link} to={item.to}>
                            {item.prefix}
                            {item.text}
                          </Menu.Item>
                        ) : null
                      )}
                    </Menu>
                  </Popup>
                ) : null}
    
                {/* Login Button */}
    
    Rafael László's avatar
    Rafael László committed
                <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
        );
    
    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>
    
    Rafael László's avatar
    Rafael László committed
            <Responsive minWidth={1201}>{this.renderHeader(8)}</Responsive>
    
    Rafael László's avatar
    Rafael László committed
            {/* Mobile view */}
    
    Rafael László's avatar
    Rafael László committed
            <Responsive maxWidth={599}>
    
    Rafael László's avatar
    Rafael László committed
              <Segment inverted textAlign="center" vertical>
    
    Rafael László's avatar
    Rafael László committed
                <Container>
    
    Rafael László's avatar
    Rafael László committed
                  <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}>
    
    Rafael László's avatar
    Rafael László committed
                      {menuItems[0].prefix}
                      {menuItems[0].text}
                    </Menu.Item>
    
    Rafael László's avatar
    Rafael László committed
                    {/* Sandwich menu */}
    
    Rafael László's avatar
    Rafael László committed
                    <Popup
                      flowing
                      hoverable
                      inverted
    
    Rafael László's avatar
    Rafael László committed
                      trigger={
                        <Menu.Item onClick={this.handleClose} position="right">
                          <Icon name="bars" size="large" />
    
    Rafael László's avatar
    Rafael László committed
                        </Menu.Item>
    
    Rafael László's avatar
    Rafael László committed
                      }
                      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
                      on="click"
                      size="huge"
    
    Rafael László's avatar
    Rafael László committed
                    >
    
    Rafael László's avatar
    Rafael László committed
                      <Menu vertical inverted secondary size="large">
                        {menuItems.map((item, i) =>
                          (this.props.user.permission >= item.permissionLevel ||
                            item.permissionLevel === 0) &&
                          i > 0 ? (
    
    Rafael László's avatar
    Rafael László committed
                            <Menu.Item
                              onClick={this.handleClose}
                              key={Math.random()}
                              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>
                          ) : (
                            <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);