Skip to content

Commit cd22a91

Browse files
committed
Add useContextMenuGroups hook
1 parent fc243d0 commit cd22a91

File tree

4 files changed

+36
-16
lines changed

4 files changed

+36
-16
lines changed

packages/compass-components/src/components/context-menu.tsx

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
import React, { useEffect, useMemo, useRef } from 'react';
22
import { Menu, MenuItem, MenuSeparator } from './leafygreen';
3-
import type { ContextMenuItem } from '@mongodb-js/compass-context-menu';
4-
import { useContextMenu } from '@mongodb-js/compass-context-menu';
5-
import { ContextMenuProvider as ContextMenuProviderBase } from '@mongodb-js/compass-context-menu';
6-
import type {
7-
ContextMenuItemGroup,
8-
ContextMenuWrapperProps,
3+
4+
import {
5+
ContextMenuProvider as ContextMenuProviderBase,
6+
useContextMenu,
7+
type ContextMenuItem,
8+
type ContextMenuItemGroup,
9+
type ContextMenuWrapperProps,
910
} from '@mongodb-js/compass-context-menu';
1011

12+
export type { ContextMenuItem } from '@mongodb-js/compass-context-menu';
13+
1114
export function ContextMenuProvider({
1215
children,
1316
}: {
@@ -100,3 +103,13 @@ export function useContextMenuItems(
100103
const contextMenu = useContextMenu();
101104
return contextMenu.registerItems(memoizedItems);
102105
}
106+
107+
export function useContextMenuGroups(
108+
getGroups: () => ContextMenuItem[][],
109+
dependencies: React.DependencyList | undefined
110+
): React.RefCallback<HTMLElement> {
111+
// eslint-disable-next-line react-hooks/exhaustive-deps
112+
const memoizedGroups = useMemo(getGroups, dependencies);
113+
const contextMenu = useContextMenu();
114+
return contextMenu.registerItems(...memoizedGroups);
115+
}

packages/compass-components/src/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,11 @@ export { ModalHeader } from './components/modals/modal-header';
100100
export { FormModal } from './components/modals/form-modal';
101101
export { InfoModal } from './components/modals/info-modal';
102102

103-
export { useContextMenuItems } from './components/context-menu';
103+
export {
104+
useContextMenuItems,
105+
useContextMenuGroups,
106+
type ContextMenuItem,
107+
} from './components/context-menu';
104108

105109
export type {
106110
FileInputBackend,

packages/compass-context-menu/src/context-menu-content.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ export function getContextMenuContent(
1414

1515
export function appendContextMenuContent(
1616
event: EnhancedMouseEvent,
17-
content: ContextMenuItemGroup
17+
...groups: ContextMenuItemGroup[]
1818
) {
1919
// Initialize if not already patched
2020
if (!event[CONTEXT_MENUS_SYMBOL]) {
2121
event[CONTEXT_MENUS_SYMBOL] = [];
2222
}
23-
event[CONTEXT_MENUS_SYMBOL].push(content);
23+
event[CONTEXT_MENUS_SYMBOL].push(...groups);
2424
}

packages/compass-context-menu/src/use-context-menu.tsx

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ export type ContextMenuMethods<T extends ContextMenuItem> = {
88
/**
99
* Close the context menu.
1010
*/
11-
close: () => void;
11+
close(): void;
1212
/**
1313
* Register the menu items for the context menu.
1414
* @returns a callback ref to be passed onto the element responsible for triggering the menu.
1515
*/
16-
registerItems: (items: T[]) => RefCallback<HTMLElement>;
16+
registerItems(...groups: T[][]): RefCallback<HTMLElement>;
1717
};
1818

1919
export function useContextMenu<
@@ -34,12 +34,15 @@ export function useContextMenu<
3434
/**
3535
* @returns a callback ref, passed onto the element responsible for triggering the menu.
3636
*/
37-
registerItems(items: ContextMenuItem[]) {
37+
registerItems(...groups: ContextMenuItem[][]) {
3838
function listener(event: MouseEvent): void {
39-
appendContextMenuContent(event, {
40-
items,
41-
originListener: listener,
42-
});
39+
appendContextMenuContent(
40+
event,
41+
...groups.map((items) => ({
42+
items,
43+
originListener: listener,
44+
}))
45+
);
4346
}
4447

4548
return (trigger: HTMLElement | null) => {

0 commit comments

Comments
 (0)