From bf1e911d459ca1c0f98afb76c03eecc04611e7bc Mon Sep 17 00:00:00 2001 From: gagik Date: Thu, 3 Jul 2025 12:21:43 +0200 Subject: [PATCH] feat(compass-context-menu): add context menu closing on scroll COMPASS-9471 --- .../src/context-menu-provider.tsx | 4 ++++ .../src/use-context-menu.spec.tsx | 23 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/packages/compass-context-menu/src/context-menu-provider.tsx b/packages/compass-context-menu/src/context-menu-provider.tsx index 802ffa2f2f8..51a8006e9f4 100644 --- a/packages/compass-context-menu/src/context-menu-provider.tsx +++ b/packages/compass-context-menu/src/context-menu-provider.tsx @@ -76,10 +76,14 @@ export function ContextMenuProvider({ document.addEventListener('contextmenu', handleContextMenu); window.addEventListener('resize', handleClosingEvent); + window.addEventListener('scroll', handleClosingEvent, { capture: true }); return () => { document.removeEventListener('contextmenu', handleContextMenu); window.removeEventListener('resize', handleClosingEvent); + window.removeEventListener('scroll', handleClosingEvent, { + capture: true, + }); }; }, [disabled, handleClosingEvent, parentContext]); diff --git a/packages/compass-context-menu/src/use-context-menu.spec.tsx b/packages/compass-context-menu/src/use-context-menu.spec.tsx index e6cde2deae7..37a6cb46c20 100644 --- a/packages/compass-context-menu/src/use-context-menu.spec.tsx +++ b/packages/compass-context-menu/src/use-context-menu.spec.tsx @@ -263,5 +263,28 @@ describe('useContextMenu', function () { expect(() => screen.getByTestId('test-menu')).to.throw; }); }); + + describe('menu closing behavior', function () { + for (const event of ['scroll', 'resize', 'click']) { + it(`closes menu on window ${event} event`, function () { + render( + + + + ); + + const trigger = screen.getByTestId('test-trigger'); + userEvent.click(trigger, { button: 2 }); + + // Verify menu is open + expect(screen.getByTestId('menu-item-Test Item')).to.exist; + + window.dispatchEvent(new Event(event)); + + // Verify menu is closed + expect(() => screen.getByTestId('test-menu')).to.throw; + }); + } + }); }); });