src/common/AsideMenu.js   A
last analyzed

Complexity

Total Complexity 1
Complexity/F 0

Size

Lines of Code 82
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Test Coverage

Coverage 92.31%

Importance

Changes 0
Metric Value
wmc 1
eloc 72
mnd 1
bc 1
fnc 0
dl 0
loc 82
ccs 12
cts 13
cp 0.9231
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
rs 10
1
import {
2
  faList as listIcon,
3
  faLink as createIcon,
4
  faTags as tagsIcon,
5
  faPen as editIcon,
6
} from '@fortawesome/free-solid-svg-icons';
7
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
8
import React from 'react';
9
import { NavLink } from 'react-router-dom';
10
import PropTypes from 'prop-types';
11
import classNames from 'classnames';
12
import { serverType } from '../servers/prop-types';
13
import './AsideMenu.scss';
14
15 1
const AsideMenuItem = ({ children, to, className, ...rest }) => (
16
  <NavLink
17
    className={classNames('aside-menu__item', className)}
18
    activeClassName="aside-menu__item--selected"
19
    to={to}
20
    {...rest}
21
  >
22
    {children}
23
  </NavLink>
24
);
25
26 1
AsideMenuItem.propTypes = {
27
  children: PropTypes.node.isRequired,
28
  to: PropTypes.string.isRequired,
29
  className: PropTypes.string,
30
};
31
32 1
const propTypes = {
33
  selectedServer: serverType,
34
  className: PropTypes.string,
35
  showOnMobile: PropTypes.bool,
36
};
37
38 1
const AsideMenu = (DeleteServerButton) => {
39 2
  const AsideMenu = ({ selectedServer, className, showOnMobile }) => {
40 2
    const serverId = selectedServer ? selectedServer.id : '';
41 2
    const asideClass = classNames('aside-menu', className, {
42
      'aside-menu--hidden': !showOnMobile,
43
    });
44 2
    const shortUrlsIsActive = (match, location) => location.pathname.match('/list-short-urls');
45 8
    const buildPath = (suffix) => `/server/${serverId}${suffix}`;
46
47 2
    return (
48
      <aside className={asideClass}>
49
        <nav className="nav flex-column aside-menu__nav">
50
          <AsideMenuItem to={buildPath('/list-short-urls/1')} isActive={shortUrlsIsActive}>
51
            <FontAwesomeIcon icon={listIcon} />
52
            <span className="aside-menu__item-text">List short URLs</span>
53
          </AsideMenuItem>
54
          <AsideMenuItem to={buildPath('/create-short-url')}>
55
            <FontAwesomeIcon icon={createIcon} flip="horizontal" />
56
            <span className="aside-menu__item-text">Create short URL</span>
57
          </AsideMenuItem>
58
          <AsideMenuItem to={buildPath('/manage-tags')}>
59
            <FontAwesomeIcon icon={tagsIcon} />
60
            <span className="aside-menu__item-text">Manage tags</span>
61
          </AsideMenuItem>
62
          <AsideMenuItem to={buildPath('/edit')} className="aside-menu__item--push">
63
            <FontAwesomeIcon icon={editIcon} />
64
            <span className="aside-menu__item-text">Edit this server</span>
65
          </AsideMenuItem>
66
          <DeleteServerButton
67
            className="aside-menu__item aside-menu__item--danger"
68
            textClassName="aside-menu__item-text"
69
            server={selectedServer}
70
          />
71
        </nav>
72
      </aside>
73
    );
74
  };
75
76 2
  AsideMenu.propTypes = propTypes;
77
78 2
  return AsideMenu;
79
};
80
81
export default AsideMenu;
82