Skip to content

Commit bcd1cd6

Browse files
authored
Add useContextMenuGroups hook (#7066)
* Add useContextMenuGroups hook * Adding useContextMenuGroups to additionalHooks
1 parent 56aee03 commit bcd1cd6

File tree

5 files changed

+32
-14
lines changed

5 files changed

+32
-14
lines changed

configs/eslint-config-compass/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ const tsxRules = {
4444
'react-hooks/exhaustive-deps': [
4545
'warn',
4646
{
47-
additionalHooks: '(useTrackOnChange|useContextMenuItems)',
47+
additionalHooks:
48+
'(useTrackOnChange|useContextMenuItems|useContextMenuGroups)',
4849
},
4950
],
5051
};

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
}: {
@@ -95,3 +98,13 @@ export function useContextMenuItems(
9598
const contextMenu = useContextMenu();
9699
return contextMenu.registerItems(memoizedItems);
97100
}
101+
102+
export function useContextMenuGroups(
103+
getGroups: () => ContextMenuItemGroup[],
104+
dependencies: React.DependencyList | undefined
105+
): React.RefCallback<HTMLElement> {
106+
// eslint-disable-next-line react-hooks/exhaustive-deps
107+
const memoizedGroups = useMemo(getGroups, dependencies);
108+
const contextMenu = useContextMenu();
109+
return contextMenu.registerItems(...memoizedGroups);
110+
}

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: 4 additions & 4 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,9 +34,9 @@ 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, items);
39+
appendContextMenuContent(event, ...groups);
4040
}
4141

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

0 commit comments

Comments
 (0)