//@flow strict import * as React from 'react'; import type {ColorTypes} from '../../types/typography'; import classify from '../../utils/classify'; import type {IconProps} from '../Icon'; import {Icon} from '../Icon'; import type {TextProps} from '../Text'; import {ButtonTextMedium, TEXT_COLORS} from '../Text'; import {Truncate} from '../Truncate'; import css from './SubMenu.module.css'; export const SubMenuItemIcon = ({ className, ...props }: IconProps): React.Node => ( ); SubMenuItemIcon.displayName = 'SubMenuItemIcon'; export const SubMenuItemText = ({ children, className, ...props }: TextProps): React.Node => ( {children} ); SubMenuItemText.displayName = 'SubMenuItemText'; export type SubMenuItemBadgesProps = { children?: React.Node, className?: string, ... }; export const SubMenuItemBadges = ({ children, className, ...props }: SubMenuItemBadgesProps): React.Node => (
{children}
); SubMenuItemBadges.displayName = 'SubMenuItemBadges'; export type SubMenuItemActionProps = { isMenuItemSelected?: boolean, children?: React.Node, color?: ColorTypes, className?: string, ... }; export const SubMenuItemAction: React$AbstractComponent< SubMenuItemActionProps, HTMLElement, > = React.forwardRef( ( {children, className, ...props}: SubMenuItemActionProps, ref, ): React.Node => (
{children}
), ); SubMenuItemAction.displayName = 'SubMenuItemAction'; type ClassNames = $ReadOnly<{wrapper?: string}>; export type SubMenuItemProps = { classNames?: ClassNames, children?: React.Node, selectedMenuKey?: string, disabled?: boolean, onChange?: (selectedMenuKey: string) => mixed, menuKey: string, ... }; export const SubMenuItem: React$AbstractComponent< SubMenuItemProps, HTMLElement, > = React.forwardRef( ( { children, selectedMenuKey, disabled, classNames, onChange, menuKey, ...props }: SubMenuItemProps, ref, ): React.Node => { const onChangeHandler = () => { if (!disabled) { onChange?.(menuKey); } }; const onKeyDownHandler = (e) => { if (e.key === 'Enter') { onChangeHandler(); } }; const selected = selectedMenuKey === menuKey; const getNamedComp = (comp: string) => { const childrenArray = React.Children.toArray(children); if (childrenArray.length) { const nodes: React.Node[] = []; for (const child of childrenArray) { if (child?.type?.displayName === comp) { nodes.push( React.cloneElement(child, { selected, disabled, }), ); } } return nodes.length > 1 ? nodes : nodes[0]; } return null; }; return (
{getNamedComp('SubMenuItemIcon')} {getNamedComp('SubMenuItemText')} {getNamedComp('SubMenuItemBadges')}
{getNamedComp('SubMenuItemAction')}
); }, );