@@ -6,9 +6,10 @@ import React, {
6
6
useRef ,
7
7
useState
8
8
} from 'react' ;
9
+ import useKeyDownHandlers from '../../modules/IDE/hooks/useKeyDownHandlers' ;
9
10
import { MenuOpenContext , NavBarContext } from './contexts' ;
10
11
11
- function NavBar ( { children } ) {
12
+ function NavBar ( { children, className } ) {
12
13
const [ dropdownOpen , setDropdownOpen ] = useState ( 'none' ) ;
13
14
14
15
const timerRef = useRef ( null ) ;
@@ -31,18 +32,9 @@ function NavBar({ children }) {
31
32
} ;
32
33
} , [ nodeRef , setDropdownOpen ] ) ;
33
34
34
- // TODO: replace with `useKeyDownHandlers` after #2052 is merged
35
- useEffect ( ( ) => {
36
- function handleKeyDown ( e ) {
37
- if ( e . keyCode === 27 ) {
38
- setDropdownOpen ( 'none' ) ;
39
- }
40
- }
41
- document . addEventListener ( 'keydown' , handleKeyDown , false ) ;
42
- return ( ) => {
43
- document . removeEventListener ( 'keydown' , handleKeyDown , false ) ;
44
- } ;
45
- } , [ setDropdownOpen ] ) ;
35
+ useKeyDownHandlers ( {
36
+ escape : ( ) => setDropdownOpen ( 'none' )
37
+ } ) ;
46
38
47
39
const clearHideTimeout = useCallback ( ( ) => {
48
40
if ( timerRef . current ) {
@@ -55,6 +47,15 @@ function NavBar({ children }) {
55
47
timerRef . current = setTimeout ( ( ) => setDropdownOpen ( 'none' ) , 10 ) ;
56
48
} , [ timerRef , setDropdownOpen ] ) ;
57
49
50
+ const toggleDropdownOpen = useCallback (
51
+ ( dropdown ) => {
52
+ setDropdownOpen ( ( prevState ) =>
53
+ prevState === dropdown ? 'none' : dropdown
54
+ ) ;
55
+ } ,
56
+ [ setDropdownOpen ]
57
+ ) ;
58
+
58
59
const contextValue = useMemo (
59
60
( ) => ( {
60
61
createDropdownHandlers : ( dropdown ) => ( {
@@ -64,31 +65,33 @@ function NavBar({ children }) {
64
65
) ;
65
66
} ,
66
67
onClick : ( ) => {
67
- setDropdownOpen ( ( prevState ) =>
68
- prevState === 'none' ? dropdown : 'none'
69
- ) ;
68
+ toggleDropdownOpen ( dropdown ) ;
70
69
} ,
71
70
onBlur : handleBlur ,
72
71
onFocus : clearHideTimeout
73
72
} ) ,
74
73
createMenuItemHandlers : ( dropdown ) => ( {
75
- onMouseUp : ( ) => {
74
+ onMouseUp : ( e ) => {
75
+ if ( e . button === 2 ) {
76
+ return ;
77
+ }
76
78
setDropdownOpen ( 'none' ) ;
77
79
} ,
78
80
onBlur : handleBlur ,
79
81
onFocus : ( ) => {
80
82
clearHideTimeout ( ) ;
81
83
setDropdownOpen ( dropdown ) ;
82
84
}
83
- } )
85
+ } ) ,
86
+ toggleDropdownOpen
84
87
} ) ,
85
- [ setDropdownOpen , clearHideTimeout , handleBlur ]
88
+ [ setDropdownOpen , toggleDropdownOpen , clearHideTimeout , handleBlur ]
86
89
) ;
87
90
88
91
return (
89
92
< NavBarContext . Provider value = { contextValue } >
90
93
< header >
91
- < nav className = "nav" ref = { nodeRef } >
94
+ < nav className = { className } ref = { nodeRef } >
92
95
< MenuOpenContext . Provider value = { dropdownOpen } >
93
96
{ children }
94
97
</ MenuOpenContext . Provider >
@@ -99,11 +102,13 @@ function NavBar({ children }) {
99
102
}
100
103
101
104
NavBar . propTypes = {
102
- children : PropTypes . node
105
+ children : PropTypes . node ,
106
+ className : PropTypes . string
103
107
} ;
104
108
105
109
NavBar . defaultProps = {
106
- children : null
110
+ children : null ,
111
+ className : 'nav'
107
112
} ;
108
113
109
114
export default NavBar ;
0 commit comments