UNPKG

2.6 kBJavaScriptView Raw
1import React from 'react';
2import PropTypes from 'prop-types';
3import classNames from 'classnames';
4import { DropdownContext } from './DropdownContext';
5import { mapToCssModules, omit, tagPropType } from './utils';
6
7const propTypes = {
8 children: PropTypes.node,
9 active: PropTypes.bool,
10 disabled: PropTypes.bool,
11 divider: PropTypes.bool,
12 tag: tagPropType,
13 header: PropTypes.bool,
14 onClick: PropTypes.func,
15 className: PropTypes.string,
16 cssModule: PropTypes.object,
17 toggle: PropTypes.bool,
18 text: PropTypes.bool,
19};
20
21class DropdownItem extends React.Component {
22 constructor(props) {
23 super(props);
24
25 this.onClick = this.onClick.bind(this);
26 this.getTabIndex = this.getTabIndex.bind(this);
27 }
28
29 onClick(e) {
30 const { disabled, header, divider, text } = this.props;
31 if (disabled || header || divider || text) {
32 e.preventDefault();
33 return;
34 }
35
36 if (this.props.onClick) {
37 this.props.onClick(e);
38 }
39
40 if (this.props.toggle ?? true) {
41 this.context.toggle(e);
42 }
43 }
44
45 getRole() {
46 if (this.context.menuRole === 'listbox') {
47 return 'option';
48 }
49 return 'menuitem';
50 }
51
52 getTabIndex() {
53 const { disabled, header, divider, text } = this.props;
54 if (disabled || header || divider || text) {
55 return '-1';
56 }
57
58 return '0';
59 }
60
61 render() {
62 const tabIndex = this.getTabIndex();
63 const role = tabIndex > -1 ? this.getRole() : undefined;
64 let {
65 className,
66 cssModule,
67 divider,
68 tag: Tag = 'button',
69 header,
70 active,
71 text,
72 ...props
73 } = omit(this.props, ['toggle']);
74
75 const classes = mapToCssModules(
76 classNames(className, {
77 disabled: props.disabled,
78 'dropdown-item': !divider && !header && !text,
79 active: active,
80 'dropdown-header': header,
81 'dropdown-divider': divider,
82 'dropdown-item-text': text,
83 }),
84 cssModule,
85 );
86
87 if (Tag === 'button') {
88 if (header) {
89 Tag = 'h6';
90 } else if (divider) {
91 Tag = 'div';
92 } else if (props.href) {
93 Tag = 'a';
94 } else if (text) {
95 Tag = 'span';
96 }
97 }
98
99 return (
100 <Tag
101 type={
102 Tag === 'button' && (props.onClick || this.props.toggle)
103 ? 'button'
104 : undefined
105 }
106 {...props}
107 tabIndex={tabIndex}
108 role={role}
109 className={classes}
110 onClick={this.onClick}
111 />
112 );
113 }
114}
115
116DropdownItem.propTypes = propTypes;
117DropdownItem.contextType = DropdownContext;
118
119export default DropdownItem;