import * as React from 'react'; import DownOutlined from '@ant-design/icons/DownOutlined'; import { devUseWarning } from '../_util/warning'; import { ConfigContext } from '../config-provider'; import type { DropdownProps } from '../dropdown/dropdown'; import Dropdown from '../dropdown/dropdown'; import type { ItemType } from './Breadcrumb'; import BreadcrumbSeparator from './BreadcrumbSeparator'; import { renderItem } from './useItemRender'; export interface SeparatorType { separator?: React.ReactNode; key?: React.Key; } type MenuType = NonNullable; interface MenuItem { key?: React.Key; title?: React.ReactNode; label?: React.ReactNode; path?: string; href?: string; } export interface BreadcrumbItemProps extends SeparatorType { prefixCls?: string; href?: string; menu?: Omit & { items?: MenuItem[]; }; dropdownProps?: DropdownProps; onClick?: React.MouseEventHandler; className?: string; children?: React.ReactNode; // Deprecated /** @deprecated Please use `menu` instead */ overlay?: DropdownProps['overlay']; } export const InternalBreadcrumbItem: React.FC = (props) => { const { prefixCls, separator = '/', children, menu, overlay, dropdownProps, href } = props; // Warning for deprecated usage if (process.env.NODE_ENV !== 'production') { const warning = devUseWarning('Breadcrumb.Item'); warning.deprecated(!('overlay' in props), 'overlay', 'menu'); } /** If overlay is have Wrap a Dropdown */ const renderBreadcrumbNode = (breadcrumbItem: React.ReactNode) => { if (menu || overlay) { const mergeDropDownProps: DropdownProps = { ...dropdownProps, }; if (menu) { const { items, ...menuProps } = menu || {}; mergeDropDownProps.menu = { ...menuProps, items: items?.map(({ key, title, label, path, ...itemProps }, index) => { let mergedLabel: React.ReactNode = label ?? title; if (path) { mergedLabel = {mergedLabel}; } return { ...itemProps, key: key ?? index, label: mergedLabel, }; }), }; } else if (overlay) { mergeDropDownProps.overlay = overlay; } return ( {breadcrumbItem} ); } return breadcrumbItem; }; // wrap to dropDown const link = renderBreadcrumbNode(children); if (link !== undefined && link !== null) { return ( <>
  • {link}
  • {separator && {separator}} ); } return null; }; type CompoundedComponent = React.FC & { /** @internal */ __ANT_BREADCRUMB_ITEM: boolean; }; const BreadcrumbItem: CompoundedComponent = (props) => { const { prefixCls: customizePrefixCls, children, href, ...restProps } = props; const { getPrefixCls } = React.useContext(ConfigContext); const prefixCls = getPrefixCls('breadcrumb', customizePrefixCls); return ( {renderItem(prefixCls, restProps as ItemType, children, href)} ); }; BreadcrumbItem.__ANT_BREADCRUMB_ITEM = true; export default BreadcrumbItem;