import classNames from 'classnames'; import * as React from 'react'; import EllipsisOutlined from '@ant-design/icons/EllipsisOutlined'; import Button from '../button'; import { ConfigContext } from '../config-provider'; import Space from '../space'; import { useCompactItemContext } from '../space/Compact'; import Dropdown from './dropdown'; import useStyle from './style'; import type { ButtonProps, ButtonHTMLType } from '../button'; import type { ButtonGroupProps } from '../button/button-group'; import type { DropdownProps } from './dropdown'; export type DropdownButtonType = 'default' | 'primary' | 'ghost' | 'dashed' | 'link' | 'text'; export interface DropdownButtonProps extends ButtonGroupProps, DropdownProps { type?: DropdownButtonType; htmlType?: ButtonHTMLType; danger?: boolean; disabled?: boolean; loading?: ButtonProps['loading']; onClick?: React.MouseEventHandler; icon?: React.ReactNode; href?: string; children?: React.ReactNode; title?: string; buttonsRender?: (buttons: React.ReactNode[]) => React.ReactNode[]; } type CompoundedComponent = React.FC & { /** @internal */ __ANT_BUTTON: boolean; }; const DropdownButton: CompoundedComponent = (props) => { const { getPopupContainer: getContextPopupContainer, getPrefixCls, direction, } = React.useContext(ConfigContext); const { prefixCls: customizePrefixCls, type = 'default', danger, disabled, loading, onClick, htmlType, children, className, menu, arrow, autoFocus, overlay, trigger, align, open, onOpenChange, placement, getPopupContainer, href, icon = , title, buttonsRender = (buttons: React.ReactNode[]) => buttons, mouseEnterDelay, mouseLeaveDelay, overlayClassName, overlayStyle, destroyPopupOnHide, dropdownRender, ...restProps } = props; const prefixCls = getPrefixCls('dropdown', customizePrefixCls); const buttonPrefixCls = `${prefixCls}-button`; const [wrapSSR, hashId] = useStyle(prefixCls); const dropdownProps: DropdownProps = { menu, arrow, autoFocus, align, disabled, trigger: disabled ? [] : trigger, onOpenChange, getPopupContainer: getPopupContainer || getContextPopupContainer, mouseEnterDelay, mouseLeaveDelay, overlayClassName, overlayStyle, destroyPopupOnHide, dropdownRender, }; const { compactSize, compactItemClassnames } = useCompactItemContext(prefixCls, direction); const classes = classNames(buttonPrefixCls, compactItemClassnames, className, hashId); if ('overlay' in props) { dropdownProps.overlay = overlay; } if ('open' in props) { dropdownProps.open = open; } if ('placement' in props) { dropdownProps.placement = placement; } else { dropdownProps.placement = direction === 'rtl' ? 'bottomLeft' : 'bottomRight'; } const leftButton = ( ); const rightButton =