Passed
Pull Request — main (#339)
by Alejandro
04:00
created

src/domains/DomainSelector.tsx   A

Complexity

Total Complexity 1
Complexity/F 0

Size

Lines of Code 96
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Test Coverage

Coverage 75%

Importance

Changes 0
Metric Value
wmc 1
eloc 85
mnd 1
bc 1
fnc 0
dl 0
loc 96
ccs 9
cts 12
cp 0.75
rs 10
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
1
import { useEffect } from 'react';
2
import {
3
  Button,
4
  Dropdown,
5
  DropdownItem,
6
  DropdownMenu,
7
  DropdownToggle,
8
  Input,
9
  InputGroup,
10
  InputGroupAddon,
11
  InputProps,
12
  UncontrolledTooltip,
13
} from 'reactstrap';
14
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
15
import { faUndo } from '@fortawesome/free-solid-svg-icons';
16
import { isEmpty, pipe } from 'ramda';
17
import classNames from 'classnames';
18
import { useToggle } from '../utils/helpers/hooks';
19
import { DomainsList } from './reducers/domainsList';
20
import './DomainSelector.scss';
21
22
export interface DomainSelectorProps extends Omit<InputProps, 'onChange'> {
23
  value?: string;
24
  onChange: (domain: string) => void;
25
}
26
27
interface DomainSelectorConnectProps extends DomainSelectorProps {
28
  listDomains: Function;
29
  domainsList: DomainsList;
30
}
31
32 1
export const DomainSelector = ({ listDomains, value, domainsList, onChange }: DomainSelectorConnectProps) => {
33 4
  const [ inputDisplayed,, showInput, hideInput ] = useToggle();
34 4
  const [ isDropdownOpen, toggleDropdown ] = useToggle();
35 4
  const { domains } = domainsList;
36 4
  const valueIsEmpty = isEmpty(value);
37 4
  const unselectDomain = () => onChange('');
38
39 4
  useEffect(() => {
40
    listDomains();
41
  }, []);
42
43 4
  return inputDisplayed ? (
44
    <InputGroup>
45
      <Input
46
        value={value}
47
        placeholder="Domain"
48
        onChange={(e) => onChange(e.target.value)}
49
      />
50
      <InputGroupAddon addonType="append">
51
        <Button
52
          id="backToDropdown"
53
          outline
54
          type="button"
55
          className="domains-dropdown__back-btn"
56
          onClick={pipe(unselectDomain, hideInput)}
57
        >
58
          <FontAwesomeIcon icon={faUndo} />
59
        </Button>
60
        <UncontrolledTooltip target="backToDropdown" placement="left" trigger="hover">
61
          Existing domains
62
        </UncontrolledTooltip>
63
      </InputGroupAddon>
64
    </InputGroup>
65
  ) : (
66
    <Dropdown isOpen={isDropdownOpen} toggle={toggleDropdown}>
67
      <DropdownToggle
68
        caret
69
        className={classNames(
70
          'domains-dropdown__toggle-btn btn-block',
71
          { 'domains-dropdown__toggle-btn--active': !valueIsEmpty },
72
        )}
73
      >
74
        {valueIsEmpty && <>Domain</>}
75
        {!valueIsEmpty && <>Domain: {value}</>}
76
      </DropdownToggle>
77
      <DropdownMenu className="domains-dropdown__menu">
78
        {domains.map(({ domain, isDefault }) => (
79 6
          <DropdownItem
80
            key={domain}
81
            active={value === domain || isDefault && valueIsEmpty}
82
            onClick={() => onChange(domain)}
83
          >
84
            {domain}
85
            {isDefault && <span className="float-right text-muted">default</span>}
86
          </DropdownItem>
87
        ))}
88
        <DropdownItem divider />
89
        <DropdownItem onClick={pipe(unselectDomain, showInput)}>
90
          <i>New domain</i>
91
        </DropdownItem>
92
      </DropdownMenu>
93
    </Dropdown>
94
  );
95
};
96