Skip to content

Commit e4ab489

Browse files
authored
Do not close overlays on scroll (#3742)
1 parent 9e1010a commit e4ab489

File tree

5 files changed

+4
-65
lines changed

5 files changed

+4
-65
lines changed

packages/@react-aria/overlays/src/useCloseOnScroll.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export function useCloseOnScroll(opts: CloseOnScrollOptions) {
3030
let {triggerRef, isOpen, onClose} = opts;
3131

3232
useEffect(() => {
33-
if (!isOpen) {
33+
if (!isOpen || onClose === null) {
3434
return;
3535
}
3636

packages/@react-aria/overlays/src/useOverlayPosition.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ export function useOverlayPosition(props: AriaPositionProps): PositionAria {
179179
useCloseOnScroll({
180180
triggerRef: targetRef,
181181
isOpen,
182-
onClose: onClose ? close : undefined
182+
onClose: onClose && close
183183
});
184184

185185
return {

packages/@react-aria/overlays/src/usePopover.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ export function usePopover(props: AriaPopoverProps, state: OverlayTriggerState):
8888
...otherProps,
8989
targetRef: triggerRef,
9090
overlayRef: popoverRef,
91-
isOpen: state.isOpen
91+
isOpen: state.isOpen,
92+
onClose: null
9293
});
9394

9495
// Delay preventing scroll until popover is positioned to avoid extra scroll padding.

packages/@react-spectrum/menu/test/MenuTrigger.test.js

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -370,26 +370,6 @@ describe('MenuTrigger', function () {
370370
act(() => {jest.runAllTimers();}); // FocusScope raf
371371
}
372372

373-
it.each`
374-
Name | Component | props
375-
${'MenuTrigger'} | ${MenuTrigger} | ${{onOpenChange}}
376-
`('$Name closes the menu upon trigger body scroll', function ({Component, props}) {
377-
tree = renderComponent(Component, props);
378-
let button = tree.getByRole('button');
379-
triggerPress(button);
380-
act(() => {jest.runAllTimers();});
381-
382-
let menu = tree.getByRole('menu');
383-
expect(menu).toBeTruthy();
384-
385-
let scrollable = tree.getByTestId('scrollable');
386-
fireEvent.scroll(scrollable);
387-
act(() => {jest.runAllTimers();}); // FocusScope useLayoutEffect cleanup
388-
act(() => {jest.runAllTimers();}); // FocusScope raf
389-
expect(menu).not.toBeInTheDocument();
390-
expect(document.activeElement).toBe(button);
391-
});
392-
393373
// Can't figure out why this isn't working for the v2 component
394374
it.each`
395375
Name | Component | props

packages/@react-spectrum/picker/test/Picker.test.js

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -586,48 +586,6 @@ describe('Picker', function () {
586586
expect(document.activeElement).toBe(picker);
587587
});
588588

589-
it('closes on scroll on a parent element', function () {
590-
let onOpenChange = jest.fn();
591-
let {getByRole, getByTestId, queryByRole} = render(
592-
<Provider theme={theme}>
593-
<div data-testid="scrollable">
594-
<Picker label="Test" onOpenChange={onOpenChange}>
595-
<Item>One</Item>
596-
<Item>Two</Item>
597-
<Item>Three</Item>
598-
</Picker>
599-
</div>
600-
</Provider>
601-
);
602-
603-
expect(queryByRole('listbox')).toBeNull();
604-
605-
let picker = getByRole('button');
606-
triggerPress(picker);
607-
act(() => jest.runAllTimers());
608-
609-
let listbox = getByRole('listbox');
610-
expect(listbox).toBeVisible();
611-
expect(onOpenChange).toBeCalledTimes(1);
612-
expect(onOpenChange).toHaveBeenCalledWith(true);
613-
expect(picker).toHaveAttribute('aria-expanded', 'true');
614-
expect(picker).toHaveAttribute('aria-controls', listbox.id);
615-
616-
let scrollable = getByTestId('scrollable');
617-
fireEvent.scroll(scrollable);
618-
act(() => jest.runAllTimers());
619-
620-
expect(listbox).not.toBeInTheDocument();
621-
expect(picker).toHaveAttribute('aria-expanded', 'false');
622-
expect(picker).not.toHaveAttribute('aria-controls');
623-
expect(onOpenChange).toBeCalledTimes(2);
624-
expect(onOpenChange).toHaveBeenCalledWith(false);
625-
626-
// run restore focus rAF
627-
act(() => jest.runAllTimers());
628-
expect(document.activeElement).toBe(picker);
629-
});
630-
631589
it('tabs to the next element after the trigger and closes the menu', function () {
632590
let onOpenChange = jest.fn();
633591
let {getByRole, getByTestId} = render(

0 commit comments

Comments
 (0)