Skip to content
Snippets Groups Projects
Select Git revision
  • 1e07b5b011cebfb3f877b3b72483a19ee7cf3862
  • master default protected
  • 2023-ujoncdelutan
  • 2023-update
  • 1.4.7 protected
  • 1.4.6 protected
  • 1.4.5 protected
  • 1.4.4 protected
  • 1.4.3 protected
  • 1.4.2 protected
  • 1.4.1 protected
  • 1.4.0 protected
  • 1.3.19 protected
  • 1.3.18 protected
  • 1.3.17 protected
  • 1.3.16 protected
  • 1.3.15 protected
  • 1.3.14 protected
  • 1.3.13 protected
  • 1.3.12 protected
  • 1.3.10 protected
  • 1.3.11 protected
  • 1.3.9 protected
  • 1.3.8 protected
24 results

Header.js

  • Header.js 8.30 KiB
    import {
      Button,
      Container,
      Icon,
      Image,
      Menu,
      Popup,
      Responsive,
      Segment,
    } from 'semantic-ui-react';
    import React, { Component } from 'react';
    
    import KSZKlogo from './images/kszk_logo.svg';
    import { Link } from 'react-router-dom';
    import { connect } from 'react-redux';
    import { getUserData } from '../actions';
    
    // 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,
      },
      {
        text: 'Mentorok',
        to: '/mentors',
        prefix: '',
        permissionLevel: 1,
      },
      {
        text: 'Statisztika',
        to: '/statistics',
        prefix: '',
        permissionLevel: 3,
      },
      {
        text: 'Jelentkezések',
        to: '/applications',
        prefix: '',
        permissionLevel: 3,
      },
      {
        text: 'Házi feladatok',
        to: '/homework',
        prefix: '',
        permissionLevel: 2,
      },
    ];
    
    class Header extends Component {
      constructor(props) {
        super(props);
        this.state = {
          isOpen: false,
        };
      }
    
      // Fetch the userData-s
      UNSAFE_componentWillMount() {
        this.props.getUserData();
      }
    
      // Hide the menu after clicking an item on mobile
      handleOpen = () => {
        this.setState({ isOpen: true });
      };
    
      handleClose = () => {
        this.setState({ isOpen: false });
      };
    
      renderHeader(inHeader) {
        let renderedItemNum = 0;
        let current = 0;
        let maxNum = 0;
        if (this.props.user.id) {
          maxNum = menuItems.filter(
            (item) => 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) => {
                  if (item.permissionLevel === 0) {
                    renderedItemNum += 1;
                    return (
                      <Menu.Item key={Math.random()} as={Link} to={item.to}>
                        {item.prefix}
                        {item.text}
                      </Menu.Item>
                    );
                  }
                  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={Math.random()} as={Link} to={item.to}>
                        {item.prefix}
                        {item.text}
                      </Menu.Item>
                    );
                  }
                  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) =>
                        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 */}
                <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>
        );
      }
    
      render() {
        return (
          <div>
            {/* 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)}</Responsive>
            {/* Mobile view */}
            <Responsive maxWidth={599}>
              <Segment inverted textAlign="center" vertical>
                <Container>
                  <Menu inverted secondary size="large">
                    {/* 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"
                      open={this.state.isOpen}
                      onOpen={this.handleOpen}
                      on="click"
                      size="huge"
                    >
                      <Menu vertical inverted secondary size="large">
                        {menuItems.map((item, i) =>
                          (this.props.user.permission >= item.permissionLevel ||
                            item.permissionLevel === 0) &&
                          i > 0 ? (
                            <Menu.Item
                              onClick={this.handleClose}
                              key={Math.random()}
                              as={Link}
                              to={item.to}
                            >
                              {item.prefix}
                              {item.text}
                            </Menu.Item>
                          ) : null
                        )}
                        <Menu.Item>
                          {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>
                          )}
                        </Menu.Item>
                      </Menu>
                    </Popup>
                  </Menu>
                </Container>
              </Segment>
            </Responsive>
          </div>
        );
      }
    }
    
    const mapStateToProps = ({ user }) => ({
      user,
    });
    
    export default connect(mapStateToProps, { getUserData })(Header);