Skip to content

Commit 632c11a

Browse files
committed
MenubarSubmenu: update context interfaces, wip, no-verify
1 parent ff0100b commit 632c11a

File tree

2 files changed

+25
-7
lines changed

2 files changed

+25
-7
lines changed

client/components/Menubar/MenubarSubmenu.tsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,10 @@ export function useMenuProps(id: string) {
6363
* </li>
6464
*/
6565

66-
const MenubarTrigger = React.forwardRef(({ role, hasPopup, ...props }, ref) => {
66+
const MenubarTrigger = React.forwardRef<
67+
HTMLButtonElement,
68+
{ role?: string; hasPopup?: string } & React.ComponentProps<'button'>
69+
>(({ role, hasPopup, ...props }, ref) => {
6770
const {
6871
setActiveIndex,
6972
menuItems,
@@ -231,10 +234,10 @@ function MenubarSubmenu({
231234
const { isOpen, handlers } = useMenuProps(id);
232235
const [submenuActiveIndex, setSubmenuActiveIndex] = useState(0);
233236
const { setMenuOpen, toggleMenuOpen } = useContext(MenubarContext);
234-
const submenuItems = useRef(new Set()).current;
237+
const submenuItems = useRef<Set<HTMLElement>>(new Set()).current;
235238

236-
const buttonRef = useRef(null);
237-
const listItemRef = useRef(null);
239+
const buttonRef = useRef<HTMLButtonElement | null>(null);
240+
const listItemRef = useRef<HTMLLIElement | null>(null);
238241

239242
const triggerRole = customTriggerRole || 'menuitem';
240243
const listRole = customListRole || 'menu';
@@ -315,7 +318,7 @@ function MenubarSubmenu({
315318
[submenuItems]
316319
);
317320

318-
const keyHandlers = {
321+
const keyHandlers: Record<string, (e: React.KeyboardEvent) => void> = {
319322
ArrowUp: (e) => {
320323
if (!isOpen) return;
321324
e.preventDefault();

client/components/Menubar/contexts.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,28 +21,43 @@ interface MenubarContextType {
2121
onFocus: (e: React.FocusEvent) => void;
2222
}>;
2323
toggleMenuOpen: (id: string) => void;
24+
setActiveIndex: (idx: number) => void;
25+
registerTopLevelItem: (
26+
ref: React.ForwardedRef<HTMLButtonElement>,
27+
id: string
28+
) => void;
29+
setMenuOpen: (id: string) => void;
30+
menuItems: Set<HTMLElement>;
2431
hasFocus: boolean;
2532
}
2633

2734
export const MenubarContext = createContext<MenubarContextType>({
2835
createMenuHandlers: () => ({}),
2936
createMenuItemHandlers: () => ({}),
3037
toggleMenuOpen: () => {},
38+
setActiveIndex: () => {},
39+
registerTopLevelItem: () => {},
40+
setMenuOpen: () => {},
41+
menuItems: new Set(),
3142
hasFocus: false
3243
});
3344

3445
export interface SubmenuContextType {
35-
submenuItems: Set<RefObject<HTMLElement>>;
3646
setSubmenuActiveIndex: (index: number) => void;
3747
registerSubmenuItem: (ref: RefObject<HTMLElement>) => () => void;
48+
first: () => void;
49+
last: () => void;
50+
submenuItems: Set<HTMLElement>;
3851
id: string;
3952
title: string;
4053
}
4154

4255
export const SubmenuContext = createContext<SubmenuContextType>({
43-
submenuItems: new Set(),
4456
setSubmenuActiveIndex: () => {},
4557
registerSubmenuItem: () => () => {},
58+
first: () => {},
59+
last: () => {},
60+
submenuItems: new Set<HTMLElement>(),
4661
id: '',
4762
title: ''
4863
});

0 commit comments

Comments
 (0)