Skip to content

Commit a300c52

Browse files
committed
feat: menubaritem registers self and determines if active or not
1 parent 49e3ddb commit a300c52

File tree

1 file changed

+37
-3
lines changed

1 file changed

+37
-3
lines changed

client/components/Menubar/MenubarItem.jsx

+37-3
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,25 @@
11
import PropTypes from 'prop-types';
2-
import React, { useContext, useMemo } from 'react';
2+
import React, { useEffect, useContext, useRef, useMemo } from 'react';
33
import ButtonOrLink from '../../common/ButtonOrLink';
44
import { MenubarContext, ParentMenuContext } from './contexts';
55

66
function MenubarItem({
7+
id,
78
hideIf,
89
className,
910
role: customRole,
1011
selected,
1112
...rest
1213
}) {
14+
const submenuItemRef = useRef(null);
1315
const parent = useContext(ParentMenuContext);
1416

15-
const { createMenuItemHandlers } = useContext(MenubarContext);
17+
const {
18+
createMenuItemHandlers,
19+
registerSubmenuItem,
20+
submenuActiveIndex,
21+
submenuItems
22+
} = useContext(MenubarContext);
1623

1724
const handlers = useMemo(() => createMenuItemHandlers(parent), [
1825
createMenuItemHandlers,
@@ -25,22 +32,49 @@ function MenubarItem({
2532

2633
const role = customRole || 'menuitem';
2734
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]);
2859

2960
return (
3061
<li className={className}>
3162
<ButtonOrLink
63+
ref={submenuItemRef}
3264
{...rest}
3365
{...handlers}
3466
{...ariaSelected}
3567
role={role}
36-
tabIndex={-1}
68+
tabIndex={isActive ? 0 : -1}
69+
id={id}
3770
/>
3871
</li>
3972
);
4073
}
4174

4275
MenubarItem.propTypes = {
4376
...ButtonOrLink.propTypes,
77+
id: PropTypes.string.isRequired,
4478
onClick: PropTypes.func,
4579
value: PropTypes.string,
4680
/**

0 commit comments

Comments
 (0)