Completed
Push — master ( 158ed8...34f194 )
by Alejandro
04:53 queued 02:19
created

src/common/MainHeader.js   A

Complexity

Total Complexity 4
Complexity/F 1.33

Size

Lines of Code 66
Function Count 3

Duplication

Duplicated Lines 0
Ratio 0 %

Test Coverage

Coverage 5.88%

Importance

Changes 0
Metric Value
wmc 4
eloc 55
mnd 1
bc 1
fnc 3
dl 0
loc 66
ccs 1
cts 17
cp 0.0588
rs 10
bpm 0.3333
cpm 1.3333
noi 0
c 0
b 0
f 0

3 Functions

Rating   Name   Duplication   Size   Complexity  
A .handleToggle 0 3 1
A MainHeader.js ➔ render 0 33 1
A MainHeader.js ➔ componentDidUpdate 0 4 2
1
import { faPlus as plusIcon, faChevronDown as arrowIcon } from '@fortawesome/free-solid-svg-icons';
2
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
3
import React from 'react';
4
import { Link } from 'react-router-dom';
5
import { Collapse, Nav, Navbar, NavbarBrand, NavbarToggler, NavItem, NavLink } from 'reactstrap';
6
import classnames from 'classnames';
7
import PropTypes from 'prop-types';
8
import shlinkLogo from './shlink-logo-white.png';
9
import './MainHeader.scss';
10
11
const MainHeader = (ServersDropdown) => class MainHeader extends React.Component {
12
  static propTypes = {
13
    location: PropTypes.object,
14
  };
15
16
  state = { isOpen: false };
17
  handleToggle = () => {
18
    this.setState(({ isOpen }) => ({
19
      isOpen: !isOpen,
20
    }));
21
  };
22
23
  componentDidUpdate(prevProps) {
24 2
    if (this.props.location !== prevProps.location) {
25
      this.setState({ isOpen: false });
26
    }
27
  }
28
29
  render() {
30
    const { location } = this.props;
31
    const createServerPath = '/server/create';
32
    const toggleClass = classnames('main-header__toggle-icon', {
33
      'main-header__toggle-icon--opened': this.state.isOpen,
34
    });
35
36
    return (
37
      <Navbar color="primary" dark fixed="top" className="main-header" expand="md">
38
        <NavbarBrand tag={Link} to="/">
39
          <img src={shlinkLogo} alt="Shlink" className="main-header__brand-logo" /> Shlink
40
        </NavbarBrand>
41
42
        <NavbarToggler onClick={this.handleToggle}>
43
          <FontAwesomeIcon icon={arrowIcon} className={toggleClass} />
44
        </NavbarToggler>
45
46
        <Collapse navbar isOpen={this.state.isOpen}>
47
          <Nav navbar className="ml-auto">
48
            <NavItem>
49
              <NavLink
50
                tag={Link}
51
                to={createServerPath}
52
                active={location.pathname === createServerPath}
53
              >
54
                <FontAwesomeIcon icon={plusIcon} />&nbsp; Add server
55
              </NavLink>
56
            </NavItem>
57
            <ServersDropdown />
58
          </Nav>
59
        </Collapse>
60
      </Navbar>
61
    );
62
  }
63
};
64
65
export default MainHeader;
66