Skip to content

Commit 031a11f

Browse files
committed
feat(CommandPalette): add new component * 7
1 parent 547f76b commit 031a11f

File tree

2 files changed

+19
-11
lines changed

2 files changed

+19
-11
lines changed

src/components/actions/CommandMenu/CommandMenu.tsx

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,13 +118,14 @@ function CommandMenuBase<T extends object>(
118118
? new Set(defaultSelectedKeys)
119119
: undefined;
120120

121-
// Convert Set<Key> to string[] for the callback
122121
const handleSelectionChange = onSelectionChange
123122
? (keys: any) => {
124123
if (keys === 'all') {
125-
// Handle 'all' selection case - for now, we'll pass an empty array
126-
// This is a rare edge case that might need special handling
127-
onSelectionChange([]);
124+
// Handle 'all' selection case - collect all available keys
125+
const allKeys = Array.from(treeState.collection.getKeys()).map(
126+
(key: any) => String(key),
127+
);
128+
onSelectionChange(allKeys);
128129
} else if (keys instanceof Set) {
129130
onSelectionChange(Array.from(keys).map((key) => String(key)));
130131
} else {
@@ -239,6 +240,7 @@ function CommandMenuBase<T extends object>(
239240
};
240241

241242
const treeState = useTreeState(treeStateProps);
243+
242244
const collectionItems = [...treeState.collection];
243245
const hasSections = collectionItems.some((item) => item.type === 'section');
244246

@@ -304,7 +306,12 @@ function CommandMenuBase<T extends object>(
304306

305307
// Use menu hook for accessibility
306308
const { menuProps } = useMenu(
307-
{ ...treeStateProps, 'aria-label': 'Command palette menu' },
309+
{
310+
...completeProps,
311+
'aria-label': 'Command palette menu',
312+
filter: collectionFilter,
313+
shouldUseVirtualFocus: true,
314+
},
308315
treeState,
309316
menuRef,
310317
);

src/components/actions/Menu/Menu.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { useSyncRef } from '@react-aria/utils';
22
import { useDOMRef } from '@react-spectrum/utils';
33
import { DOMRef, FocusStrategy, ItemProps, Key } from '@react-types/shared';
4-
import React, { ReactElement, ReactNode, useMemo } from 'react';
4+
import React, { ReactElement, ReactNode, useMemo, useRef } from 'react';
55
import { AriaMenuProps, useMenu } from 'react-aria';
66
import {
77
Item as BaseItem,
@@ -95,13 +95,14 @@ function Menu<T extends object>(
9595
? new Set(defaultSelectedKeys)
9696
: undefined;
9797

98-
// Convert Set<Key> to string[] for the callback
9998
const handleSelectionChange = onSelectionChange
10099
? (keys: any) => {
101100
if (keys === 'all') {
102-
// Handle 'all' selection case - for now, we'll pass an empty array
103-
// This is a rare edge case that might need special handling
104-
onSelectionChange([]);
101+
// Handle 'all' selection case - collect all available keys
102+
const allKeys = Array.from(state.collection.getKeys()).map(
103+
(key: any) => String(key),
104+
);
105+
onSelectionChange(allKeys);
105106
} else if (keys instanceof Set) {
106107
onSelectionChange(Array.from(keys).map((key) => String(key)));
107108
} else {
@@ -123,7 +124,7 @@ function Menu<T extends object>(
123124
const collectionItems = [...state.collection];
124125
const hasSections = collectionItems.some((item) => item.type === 'section');
125126

126-
const { menuProps } = useMenu(treeProps, state, domRef);
127+
const { menuProps } = useMenu(completeProps, state, domRef);
127128
const styles = useMemo(
128129
() => extractStyles(completeProps, CONTAINER_STYLES),
129130
[completeProps],

0 commit comments

Comments
 (0)