Passed
Pull Request — main (#345)
by Alejandro
03:34
created

src/servers/ServersDropdown.tsx   A

Complexity

Total Complexity 1
Complexity/F 0

Size

Lines of Code 59
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Test Coverage

Coverage 90%

Importance

Changes 0
Metric Value
wmc 1
eloc 48
mnd 1
bc 1
fnc 0
dl 0
loc 59
ccs 9
cts 10
cp 0.9
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
rs 10
1
import { isEmpty, values } from 'ramda';
2
import { DropdownItem, DropdownMenu, DropdownToggle, UncontrolledDropdown } from 'reactstrap';
3
import { Link } from 'react-router-dom';
4
import { faPlus as plusIcon, faFileDownload as exportIcon, faServer as serverIcon } from '@fortawesome/free-solid-svg-icons';
5
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
6
import ServersExporter from './services/ServersExporter';
7
import { isServerWithId, SelectedServer, ServersMap } from './data';
8
9
export interface ServersDropdownProps {
10
  servers: ServersMap;
11
  selectedServer: SelectedServer;
12
}
13
14 4
const ServersDropdown = (serversExporter: ServersExporter) => ({ servers, selectedServer }: ServersDropdownProps) => {
15 5
  const serversList = values(servers);
16
  const createServerItem = (
17 5
    <DropdownItem tag={Link} to="/server/create">
18
      <FontAwesomeIcon icon={plusIcon} /> <span className="ml-1">Add server</span>
19
    </DropdownItem>
20
  );
21
22 5
  const renderServers = () => {
23 5
    if (isEmpty(serversList)) {
24 1
      return createServerItem;
25
    }
26
27 4
    return (
28
      <>
29
        {serversList.map(({ name, id }) => (
30 12
          <DropdownItem
31
            key={id}
32
            tag={Link}
33
            to={`/server/${id}`}
34
            active={isServerWithId(selectedServer) && selectedServer.id === id}
35
          >
36
            {name}
37
          </DropdownItem>
38
        ))}
39
        <DropdownItem divider />
40
        {createServerItem}
41
        <DropdownItem className="servers-dropdown__export-item" onClick={async () => serversExporter.exportServers()}>
42
          <FontAwesomeIcon icon={exportIcon} /> <span className="ml-1">Export servers</span>
43
        </DropdownItem>
44
      </>
45
    );
46
  };
47
48 5
  return (
49
    <UncontrolledDropdown nav inNavbar>
50
      <DropdownToggle nav caret>
51
        <FontAwesomeIcon icon={serverIcon} /> <span className="ml-1">Servers</span>
52
      </DropdownToggle>
53
      <DropdownMenu right>{renderServers()}</DropdownMenu>
54
    </UncontrolledDropdown>
55
  );
56
};
57
58
export default ServersDropdown;
59