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
|
|
|
|