import React from 'react'; import type { DropdownMenuItem, DropdownMenuProps as GravityDropdownMenuProps, IconProps, } from '@gravity-ui/uikit'; import {Flex, DropdownMenu as GravityDropdownMenu, Icon, Text} from '@gravity-ui/uikit'; import {cn} from '../../utils/cn'; import './DropdownMenu.scss'; const b = cn('ydb-dropdown-menu'); export interface DropdownMenuItemWithDescription extends Omit, 'text' | 'iconStart' | 'title'> { title: React.ReactNode; description?: React.ReactNode; iconStart?: IconProps['data']; } export interface DropdownMenuProps extends Omit, 'items'> { items: (DropdownMenuItemWithDescription | DropdownMenuItemWithDescription[])[]; } function renderMenuItemText({ title, description, }: Pick) { return ( {typeof title === 'string' ? {title} : title} {description ? ( {description} ) : null} ); } function mapMenuItem( item: DropdownMenuItemWithDescription, ): DropdownMenuItem { const {title, description, iconStart, className, ...restItem} = item; return { ...restItem, text: renderMenuItemText({title, description}), iconStart: iconStart ? ( ) : undefined, className: [className, b('menu-item', {'with-description': Boolean(description)})] .filter(Boolean) .join(' '), } as DropdownMenuItem; } export function DropdownMenu({items, ...props}: DropdownMenuProps) { const mappedItems = React.useMemo['items']>(() => { return items.map((group) => { if (Array.isArray(group)) { return group.map(mapMenuItem); } return mapMenuItem(group); }); }, [items]); return ; }