Skip to content

Commit 8f306e4

Browse files
committed
feat: memoize items for context menu
1 parent 915c597 commit 8f306e4

File tree

3 files changed

+7
-5
lines changed

3 files changed

+7
-5
lines changed

configs/eslint-config-compass/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ const tsxRules = {
4646
'react-hooks/exhaustive-deps': [
4747
'warn',
4848
{
49-
additionalHooks: 'useTrackOnChange',
49+
additionalHooks: '(useTrackOnChange|useContextMenuItems)',
5050
},
5151
],
5252
};

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ describe('useContextMenuItems', function () {
1818
children?: React.ReactNode;
1919
'data-testid'?: string;
2020
}) => {
21-
const ref = useContextMenuItems(items);
21+
const ref = useContextMenuItems(() => items, [items]);
2222

2323
return (
2424
<div data-testid={dataTestId} ref={ref}>

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useEffect } from 'react';
1+
import React, { useEffect, useMemo } from 'react';
22
import { Menu, MenuItem, MenuSeparator } from './leafygreen';
33
import type { ContextMenuItem } from '@mongodb-js/compass-context-menu';
44
import { useContextMenu } from '@mongodb-js/compass-context-menu';
@@ -88,8 +88,10 @@ export function ContextMenu({ menu }: ContextMenuWrapperProps) {
8888
}
8989

9090
export function useContextMenuItems(
91-
items: ContextMenuItem[]
91+
getItems: () => ContextMenuItem[],
92+
dependencies: React.DependencyList | undefined
9293
): React.RefCallback<HTMLElement> {
94+
const memoizedItems = useMemo(getItems, dependencies);
9395
const contextMenu = useContextMenu();
94-
return contextMenu.registerItems(items);
96+
return contextMenu.registerItems(memoizedItems);
9597
}

0 commit comments

Comments
 (0)