Closes https://github.com/twentyhq/core-team-issues/issues/253 and https://github.com/twentyhq/core-team-issues/issues/256. - Created `CommandMenuList`, a component used at the root level of the command menu and inside the search page of the command menu - Refactored record agnostic actions - Added shortcuts to the action menu entries (`/` key for the search) and updated the design of the shortcuts - Reordered actions at the root level of the command menu https://github.com/user-attachments/assets/e1339cc4-ef5d-45c5-a159-6817a54b92e9
39 lines
1.1 KiB
TypeScript
39 lines
1.1 KiB
TypeScript
import { Command } from '@/command-menu/types/Command';
|
|
import { isNonEmptyString } from '@sniptt/guards';
|
|
import { useDebounce } from 'use-debounce';
|
|
|
|
export const useMatchCommands = ({
|
|
commandMenuSearch,
|
|
}: {
|
|
commandMenuSearch: string;
|
|
}) => {
|
|
const [deferredCommandMenuSearch] = useDebounce(commandMenuSearch, 300); // 200ms - 500ms
|
|
|
|
const checkInShortcuts = (cmd: Command, search: string) => {
|
|
const concatenatedString = cmd.hotKeys?.join('') ?? '';
|
|
return concatenatedString
|
|
.toLowerCase()
|
|
.includes(search.toLowerCase().trim());
|
|
};
|
|
|
|
const checkInLabels = (cmd: Command, search: string) => {
|
|
if (isNonEmptyString(cmd.label)) {
|
|
return cmd.label.toLowerCase().includes(search.toLowerCase());
|
|
}
|
|
return false;
|
|
};
|
|
|
|
const matchCommands = (commands: Command[]) => {
|
|
return commands.filter((cmd) =>
|
|
deferredCommandMenuSearch.length > 0
|
|
? checkInShortcuts(cmd, deferredCommandMenuSearch) ||
|
|
checkInLabels(cmd, deferredCommandMenuSearch)
|
|
: true,
|
|
);
|
|
};
|
|
|
|
return {
|
|
matchCommands,
|
|
};
|
|
};
|