1
1
import PropTypes from 'prop-types' ;
2
- import React , { useContext , useMemo } from 'react' ;
2
+ import React , { useEffect , useContext , useRef , useMemo } from 'react' ;
3
3
import ButtonOrLink from '../../common/ButtonOrLink' ;
4
4
import { MenubarContext , ParentMenuContext } from './contexts' ;
5
5
6
6
function MenubarItem ( {
7
+ id,
7
8
hideIf,
8
9
className,
9
10
role : customRole ,
10
11
selected,
11
12
...rest
12
13
} ) {
14
+ const submenuItemRef = useRef ( null ) ;
13
15
const parent = useContext ( ParentMenuContext ) ;
14
16
15
- const { createMenuItemHandlers } = useContext ( MenubarContext ) ;
17
+ const {
18
+ createMenuItemHandlers,
19
+ registerSubmenuItem,
20
+ submenuActiveIndex,
21
+ submenuItems
22
+ } = useContext ( MenubarContext ) ;
16
23
17
24
const handlers = useMemo ( ( ) => createMenuItemHandlers ( parent ) , [
18
25
createMenuItemHandlers ,
@@ -25,22 +32,49 @@ function MenubarItem({
25
32
26
33
const role = customRole || 'menuitem' ;
27
34
const ariaSelected = role === 'option' ? { 'aria-selected' : selected } : { } ;
35
+ const isActive = submenuItems [ submenuActiveIndex ] === id ;
36
+
37
+ useEffect ( ( ) => {
38
+ if ( isActive && submenuItemRef . current ) {
39
+ submenuItemRef . current . focus ( ) ;
40
+ }
41
+ } , [ isActive , submenuActiveIndex ] ) ;
42
+
43
+ useEffect ( ( ) => {
44
+ const unregister = registerSubmenuItem ( id ) ;
45
+ return unregister ;
46
+ } , [ id , registerSubmenuItem ] ) ;
47
+
48
+ useEffect ( ( ) => {
49
+ if ( isActive ) {
50
+ console . log ( 'MenubarItem Focus:' , {
51
+ id,
52
+ isActive,
53
+ parent,
54
+ submenuActiveIndex,
55
+ element : submenuItemRef . current
56
+ } ) ;
57
+ }
58
+ } , [ isActive , id , parent , submenuActiveIndex ] ) ;
28
59
29
60
return (
30
61
< li className = { className } >
31
62
< ButtonOrLink
63
+ ref = { submenuItemRef }
32
64
{ ...rest }
33
65
{ ...handlers }
34
66
{ ...ariaSelected }
35
67
role = { role }
36
- tabIndex = { - 1 }
68
+ tabIndex = { isActive ? 0 : - 1 }
69
+ id = { id }
37
70
/>
38
71
</ li >
39
72
) ;
40
73
}
41
74
42
75
MenubarItem . propTypes = {
43
76
...ButtonOrLink . propTypes ,
77
+ id : PropTypes . string . isRequired ,
44
78
onClick : PropTypes . func ,
45
79
value : PropTypes . string ,
46
80
/**
0 commit comments