- Removes the intermediate `CommandMenuItemConfig` / `CommandConfigContext` / `CommandMenuItemDisplay` abstraction layers, replacing them with a single `CommandMenuItemRenderer` that renders directly from the command menu items from the backend - Eliminates the server-items/ subdirectory by moving its contents (hooks/, contexts/, states/, display/, edit/) up into the parent command-menu-item/ module, removing an unnecessary nesting level.
59 lines
1.9 KiB
TypeScript
59 lines
1.9 KiB
TypeScript
import {
|
|
CommandMenuContext,
|
|
type CommandMenuContextType,
|
|
} from '@/command-menu-item/contexts/CommandMenuContext';
|
|
import { commandMenuItemsSelector } from '@/command-menu-item/states/commandMenuItemsSelector';
|
|
import { doesCommandMenuItemMatchObjectMetadataId } from '@/command-menu-item/utils/doesCommandMenuItemMatchObjectMetadataId';
|
|
import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue';
|
|
import { useMemo } from 'react';
|
|
import { type CommandMenuContextApi } from 'twenty-shared/types';
|
|
import { evaluateConditionalAvailabilityExpression } from 'twenty-shared/utils';
|
|
|
|
type CommandMenuContextProviderContentProps = {
|
|
displayType: CommandMenuContextType['displayType'];
|
|
containerType: CommandMenuContextType['containerType'];
|
|
children: React.ReactNode;
|
|
commandMenuContextApi: CommandMenuContextApi;
|
|
};
|
|
|
|
export const CommandMenuContextProviderContent = ({
|
|
displayType,
|
|
containerType,
|
|
children,
|
|
commandMenuContextApi,
|
|
}: CommandMenuContextProviderContentProps) => {
|
|
const commandMenuItems = useAtomStateValue(commandMenuItemsSelector);
|
|
|
|
const filteredCommandMenuItems = useMemo(() => {
|
|
const currentObjectMetadataItemId =
|
|
commandMenuContextApi.objectMetadataItem.id;
|
|
|
|
return commandMenuItems
|
|
.filter(
|
|
doesCommandMenuItemMatchObjectMetadataId(currentObjectMetadataItemId),
|
|
)
|
|
.filter((item) =>
|
|
evaluateConditionalAvailabilityExpression(
|
|
item.conditionalAvailabilityExpression,
|
|
commandMenuContextApi,
|
|
),
|
|
)
|
|
.sort(
|
|
(firstItem, secondItem) => firstItem.position - secondItem.position,
|
|
);
|
|
}, [commandMenuItems, commandMenuContextApi]);
|
|
|
|
return (
|
|
<CommandMenuContext.Provider
|
|
value={{
|
|
displayType,
|
|
containerType,
|
|
commandMenuItems: filteredCommandMenuItems,
|
|
commandMenuContextApi,
|
|
}}
|
|
>
|
|
{children}
|
|
</CommandMenuContext.Provider>
|
|
);
|
|
};
|