Skip to content

Commit 2c229fd

Browse files
authored
RAC Submenu: remove SubmenuContext and pass portal container via PopoverContext (#5803)
* remove SubmenuContext and pass portal props via PopoverContext * fix tests * send down to through PopoverContext * fix test
1 parent 77fa19d commit 2c229fd

File tree

2 files changed

+5
-5
lines changed

2 files changed

+5
-5
lines changed

packages/react-aria-components/src/Menu.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import {AriaMenuProps, FocusScope, mergeProps, useFocusRing, useMenu, useMenuItem, useMenuSection, useMenuTrigger} from 'react-aria';
1515
import {BaseCollection, CollectionProps, ItemRenderProps, useCachedChildren, useCollection, useSSRCollectionNode} from './Collection';
1616
import {MenuTriggerProps as BaseMenuTriggerProps, Node, TreeState, useMenuTriggerState, useTreeState} from 'react-stately';
17-
import {ContextValue, forwardRefType, Provider, RenderProps, ScrollableProps, SlotProps, StyleProps, useContextProps, useRenderProps, useSlot} from './utils';
17+
import {ContextValue, forwardRefType, Provider, RenderProps, ScrollableProps, SlotProps, StyleProps, useContextProps, useRenderProps, useSlot, useSlottedContext} from './utils';
1818
import {filterDOMProps, mergeRefs, useObjectRef, useResizeObserver} from '@react-aria/utils';
1919
import {Header} from './Header';
2020
import {Key, LinkDOMProps} from '@react-types/shared';
@@ -31,7 +31,6 @@ import {UNSTABLE_useSubmenuTrigger} from '@react-aria/menu';
3131
export const MenuContext = createContext<ContextValue<MenuProps<any>, HTMLDivElement>>(null);
3232
export const MenuStateContext = createContext<TreeState<unknown> | null>(null);
3333
export const RootMenuTriggerStateContext = createContext<RootMenuTriggerState | null>(null);
34-
export const SubmenuContext = createContext<{popoverContainer: Element | null} | null>(null);
3534

3635
export interface MenuTriggerProps extends BaseMenuTriggerProps {
3736
children?: ReactNode
@@ -181,7 +180,7 @@ function MenuInner<T extends object>({props, collection, menuRef: ref}: MenuInne
181180
values={[
182181
[MenuStateContext, state],
183182
[SeparatorContext, {elementType: 'div'}],
184-
[SubmenuContext, {popoverContainer}]
183+
[PopoverContext, {UNSTABLE_portalContainer: popoverContainer || undefined}]
185184
]}>
186185
{children}
187186
</Provider>
@@ -347,9 +346,9 @@ interface MenuItemTriggerInnerProps<T> {
347346

348347
function MenuItemTriggerInner<T>({item, popover, parentMenuRef, delay}: MenuItemTriggerInnerProps<T>) {
349348
let state = useContext(MenuStateContext)!;
349+
let popoverContext = useSlottedContext(PopoverContext)!;
350350
let ref = useObjectRef<any>(item.props.ref);
351351
let rootMenuTriggerState = useContext(RootMenuTriggerStateContext)!;
352-
let submenuContext = useContext(SubmenuContext)!;
353352
let submenuTriggerState = UNSTABLE_useSubmenuTriggerState({triggerKey: item.key}, rootMenuTriggerState);
354353
let submenuRef = useRef<HTMLDivElement>(null);
355354
let {submenuTriggerProps, submenuProps, popoverProps} = UNSTABLE_useSubmenuTrigger({
@@ -398,7 +397,7 @@ function MenuItemTriggerInner<T>({item, popover, parentMenuRef, delay}: MenuItem
398397
trigger: 'SubmenuTrigger',
399398
triggerRef: ref,
400399
placement: 'end top',
401-
UNSTABLE_portalContainer: submenuContext.popoverContainer || undefined,
400+
UNSTABLE_portalContainer: popoverContext.UNSTABLE_portalContainer || undefined,
402401
...popoverProps
403402
}]
404403
]}>

packages/react-aria-components/test/Menu.test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -679,6 +679,7 @@ describe('Menu', () => {
679679
expect(document.activeElement).toBe(button);
680680
});
681681
it('should restore focus to menu trigger if nested submenu is closed with Escape key', async () => {
682+
document.elementFromPoint = jest.fn().mockImplementation(query => query);
682683
let {getByRole, getAllByRole} = render(
683684
<MenuTrigger>
684685
<Button aria-label="Menu"></Button>

0 commit comments

Comments
 (0)