import * as React from 'react'; import { forwardRef, useImperativeHandle, useRef } from 'react'; import type { MenuRef as RcMenuRef } from 'rc-menu'; import { ItemGroup } from 'rc-menu'; import { SiderContext } from '../layout/Sider'; import type { ItemType, MenuItemType } from './interface'; import type { MenuProps } from './menu'; import InternalMenu from './menu'; import type { MenuTheme } from './MenuContext'; import MenuDivider from './MenuDivider'; import Item from './MenuItem'; import type { MenuItemProps } from './MenuItem'; import SubMenu from './SubMenu'; import type { SubMenuProps } from './SubMenu'; export type { MenuItemGroupProps } from 'rc-menu'; export type { MenuDividerProps } from './MenuDivider'; export type { MenuItemProps, MenuProps, MenuTheme, SubMenuProps }; export type MenuRef = { menu: RcMenuRef | null; focus: (options?: FocusOptions) => void; }; type ComponentProps = MenuProps & React.RefAttributes; type GenericItemType = T extends infer U extends MenuItemType ? unknown extends U ? ItemType : ItemType : ItemType; type GenericComponentProps = Omit & { items?: GenericItemType[]; }; type CompoundedComponent = React.ForwardRefExoticComponent & { Item: typeof Item; SubMenu: typeof SubMenu; Divider: typeof MenuDivider; ItemGroup: typeof ItemGroup; }; interface GenericComponent extends Omit { (props: GenericComponentProps): ReturnType; } const Menu = forwardRef((props, ref) => { const menuRef = useRef(null); const context = React.useContext(SiderContext); useImperativeHandle(ref, () => ({ menu: menuRef.current, focus: (options) => { menuRef.current?.focus(options); }, })); return ; }) as GenericComponent; Menu.Item = Item; Menu.SubMenu = SubMenu; Menu.Divider = MenuDivider; Menu.ItemGroup = ItemGroup; if (process.env.NODE_ENV !== 'production') { Menu.displayName = 'Menu'; } export default Menu;