-
Notifications
You must be signed in to change notification settings - Fork 615
/
DropdownWithSwitchToggle.tsx
78 lines (74 loc) · 1.93 KB
/
DropdownWithSwitchToggle.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import * as React from 'react';
import { MenuToggle, Popper } from '@patternfly/react-core';
const DropdownWithSwitchToggle: React.FC<DropdownWithSwitchToggleProps> = ({
isDisabled,
isFullWidth,
isOpen,
label,
menu,
menuRef,
onToggle,
}) => {
const toggleRef = React.useRef(null);
const containerRef = React.useRef(null);
React.useEffect(() => {
const handleMenuKeys = (event: KeyboardEvent) => {
if (
event.key === 'Tab' &&
event.target instanceof Node &&
!menuRef.current?.contains(event.target)
) {
onToggle(false);
}
};
const handleMenuClick = (event: MouseEvent) => {
if (
menuRef.current &&
event.target instanceof Node &&
!menuRef.current.contains(event.target) &&
!toggleRef.current.contains(event.target)
) {
onToggle(false);
}
};
window.addEventListener('keyup', handleMenuKeys);
window.addEventListener('click', handleMenuClick);
return () => {
window.removeEventListener('keyup', handleMenuKeys);
window.removeEventListener('click', handleMenuClick);
};
}, [menuRef, onToggle]);
return (
<div ref={containerRef}>
<Popper
appendTo={containerRef.current}
direction="down"
enableFlip={false}
isVisible={isOpen}
popper={menu}
position="left"
trigger={
<MenuToggle
isDisabled={isDisabled}
isFullWidth={isFullWidth}
isExpanded={isOpen}
onClick={() => onToggle(!isOpen)}
ref={toggleRef}
>
{label}
</MenuToggle>
}
/>
</div>
);
};
type DropdownWithSwitchToggleProps = {
isDisabled?: boolean;
isFullWidth?: boolean;
isOpen: boolean;
label: string;
menu: React.ReactElement;
menuRef: React.RefObject<HTMLElement>;
onToggle: (state: boolean) => void;
};
export default DropdownWithSwitchToggle;