| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 | import React from 'react';import cls from 'classnames';import PropTypes from 'prop-types';import { cssClasses as css, strings } from '@douyinfe/semi-foundation/dropdown/constants';import DropdownContext from './context';import BaseComponent from '../_base/baseComponent';import { IconTick } from '@douyinfe/semi-icons';import { noop } from 'lodash';import type { BaseProps } from '../_base/baseComponent';import type { DropdownContextType } from './context';export type Type = 'primary' | 'secondary' | 'tertiary' | 'warning' | 'danger';export interface DropdownItemProps extends BaseProps {    disabled?: boolean;    selected?: boolean;    onClick?: React.MouseEventHandler<HTMLLIElement>;    onMouseEnter?: React.MouseEventHandler<HTMLLIElement>;    onMouseLeave?: React.MouseEventHandler<HTMLLIElement>;    onContextMenu?: React.MouseEventHandler<HTMLLIElement>;    forwardRef?: (ele: HTMLLIElement) => void;    type?: Type;    active?: boolean;    icon?: React.ReactNode;    onKeyDown?: (e: React.KeyboardEvent) => void;    showTick?: boolean;    /** internal prop, please do not use  */    hover?: boolean}const prefixCls = css.PREFIX;class DropdownItem extends BaseComponent<DropdownItemProps> {    static propTypes = {        children: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),        name: PropTypes.string,        disabled: PropTypes.bool,        selected: PropTypes.bool,        onClick: PropTypes.func,        onMouseEnter: PropTypes.func,        onMouseLeave: PropTypes.func,        onContextMenu: PropTypes.func,        className: PropTypes.string,        style: PropTypes.object,        forwardRef: PropTypes.func,        type: PropTypes.oneOf(strings.ITEM_TYPE),        active: PropTypes.bool,        icon: PropTypes.node,    };    static contextType = DropdownContext;    static elementType: string;    context: DropdownContextType;    static defaultProps = {        disabled: false,        divided: false,        selected: false,        onMouseEnter: noop,        onMouseLeave: noop,        forwardRef: noop,    };    render() {        const {            children,            disabled,            className,            forwardRef,            style,            type,            active,            icon,            onKeyDown,            showTick,            hover        } = this.props;        const { showTick: contextShowTick } = this.context;        const realShowTick = contextShowTick ?? showTick;        const itemclass = cls(className, {            [`${prefixCls}-item`]: true,            [`${prefixCls}-item-disabled`]: disabled,            [`${prefixCls}-item-hover`]: hover,            [`${prefixCls}-item-withTick`]: realShowTick,            [`${prefixCls}-item-${type}`]: type,            [`${prefixCls}-item-active`]: active,        });        const events = {};        if (!disabled) {            ['onClick', 'onMouseEnter', 'onMouseLeave', 'onContextMenu'].forEach(eventName => {                const isInAnotherDropdown = this.context.level !== 1;                if (isInAnotherDropdown && eventName === "onClick") {                    events["onMouseDown"] = (e: React.MouseEvent<HTMLLIElement, MouseEvent>) => {                        if (e.button === 0) {                            this.props[eventName]?.(e);                        }                    };                } else {                    events[eventName] = this.props[eventName];                }            });        }        let tick = null;        switch (true) {            case realShowTick && active:                tick = <IconTick/>;                break;            case realShowTick && !active:                tick = <IconTick style={{ color: 'transparent' }}/>;                break;            default:                tick = null;                break;        }        let iconContent = null;        if (icon) {            iconContent = (                <div className={`${prefixCls}-item-icon`}>                    {icon}                </div>            );        }        return (            <li role="menuitem" tabIndex={-1} aria-disabled={disabled} {...events} onKeyDown={onKeyDown}                ref={ref => forwardRef(ref)} className={itemclass} style={style} {...this.getDataAttr(this.props)}>                {tick}                {iconContent}                {children}            </li>        );    }}DropdownItem.elementType = 'Dropdown.Item';export default DropdownItem;
 |