-
Notifications
You must be signed in to change notification settings - Fork 46
/
Copy pathManchetteMenuButton.tsx
76 lines (63 loc) · 2.16 KB
/
ManchetteMenuButton.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
import { useEffect, useRef, useState } from 'react';
import { Eye, KebabHorizontal } from '@osrd-project/ui-icons';
import cx from 'classnames';
import { useTranslation } from 'react-i18next';
import type { OSRDMenuItem } from 'common/OSRDMenu';
import OSRDMenu from 'common/OSRDMenu';
import useModalFocusTrap from 'utils/hooks/useModalFocusTrap';
type ManchetteMenuButtonProps = {
setWaypointsPanelIsOpen: (waypointsModalOpen: boolean) => void;
};
const ManchetteMenuButton = ({ setWaypointsPanelIsOpen }: ManchetteMenuButtonProps) => {
const { t } = useTranslation('simulation');
const [isMenuOpen, setIsMenuOpen] = useState(false);
const menuRef = useRef<HTMLDivElement>(null);
const menuButtonRef = useRef<HTMLButtonElement>(null);
const closeMenu = () => setIsMenuOpen(false);
const menuItems: OSRDMenuItem[] = [
{
title: t('manchetteSettings.waypointsVisibility'),
icon: <Eye />,
onClick: () => {
closeMenu();
setWaypointsPanelIsOpen(true);
},
},
];
useModalFocusTrap(menuRef, closeMenu, { focusOnFirstElement: true });
useEffect(() => {
// TODO : refacto useOutsideClick to accept a list of refs and use the hook here
const handleClickOutside = (event: MouseEvent) => {
if (
!menuRef.current?.contains(event.target as Node) &&
!menuButtonRef.current?.contains(event.target as Node)
) {
closeMenu();
}
};
if (isMenuOpen) {
document.addEventListener('mousedown', handleClickOutside);
} else {
document.removeEventListener('mousedown', handleClickOutside);
}
return () => {
document.removeEventListener('mousedown', handleClickOutside);
};
}, [isMenuOpen]);
return (
<>
<button
ref={menuButtonRef}
type="button"
className={cx('manchette-menu-button', { 'menu-open': isMenuOpen })}
aria-label={t('toggleManchetteMenu')}
title={t('toggleManchetteMenu')}
onClick={() => setIsMenuOpen(!isMenuOpen)}
>
<KebabHorizontal />
</button>
{isMenuOpen && <OSRDMenu menuRef={menuRef} items={menuItems} />}
</>
);
};
export default ManchetteMenuButton;