Passed
Pull Request — master (#163)
by Alejandro
06:15
created

src/servers/ServersDropdown.js   A

Complexity

Total Complexity 4
Complexity/F 2

Size

Lines of Code 65
Function Count 2

Duplication

Duplicated Lines 0
Ratio 0 %

Test Coverage

Coverage 84.21%

Importance

Changes 0
Metric Value
wmc 4
eloc 53
mnd 2
bc 2
fnc 2
dl 0
loc 65
ccs 16
cts 19
cp 0.8421
rs 10
bpm 1
cpm 2
noi 0
c 0
b 0
f 0

2 Functions

Rating   Name   Duplication   Size   Complexity  
A .render 0 5 1
A .renderServers 0 33 3
1
import { isEmpty, values } from 'ramda';
2
import React from 'react';
3
import { DropdownItem, DropdownMenu, DropdownToggle, UncontrolledDropdown } from 'reactstrap';
4
import PropTypes from 'prop-types';
5
import { serverType } from './prop-types';
6
7 5
const ServersDropdown = (serversExporter) => class ServersDropdown extends React.Component {
8 5
  static propTypes = {
9
    servers: PropTypes.object,
10
    selectedServer: serverType,
11
    selectServer: PropTypes.func,
12
    listServers: PropTypes.func,
13
    history: PropTypes.shape({
14
      push: PropTypes.func,
15
    }),
16
  };
17
18 7
  renderServers = () => {
19 7
    const { servers: { list, loading }, selectedServer, selectServer } = this.props;
20 7
    const servers = values(list);
21 7
    const { push } = this.props.history;
22 7
    const loadServer = (id) => {
23
      selectServer(id)
24
        .then(() => push(`/server/${id}/list-short-urls/1`))
25
        .catch(() => {});
26
    };
27
28 7
    if (loading) {
29 1
      return <DropdownItem disabled><i>Trying to load servers...</i></DropdownItem>;
30
    }
31
32 6
    if (isEmpty(servers)) {
33 1
      return <DropdownItem disabled><i>Add a server first...</i></DropdownItem>;
34
    }
35
36 5
    return (
37
      <React.Fragment>
38
        {servers.map(({ name, id }) => (
39 15
          <DropdownItem key={id} active={selectedServer && selectedServer.id === id} onClick={() => loadServer(id)}>
40
            {name}
41
          </DropdownItem>
42
        ))}
43
        <DropdownItem divider />
44
        <DropdownItem
45
          className="servers-dropdown__export-item"
46
          onClick={() => serversExporter.exportServers()}
47
        >
48
          Export servers
49
        </DropdownItem>
50
      </React.Fragment>
51
    );
52
  };
53
54 7
  componentDidMount = this.props.listServers;
55
56 7
  render = () => (
57 7
    <UncontrolledDropdown nav inNavbar>
58
      <DropdownToggle nav caret>Servers</DropdownToggle>
59
      <DropdownMenu right>{this.renderServers()}</DropdownMenu>
60
    </UncontrolledDropdown>
61
  );
62
};
63
64
export default ServersDropdown;
65