UNPKG

3.53 kBJavaScriptView Raw
1import _extends from "@babel/runtime/helpers/esm/extends";
2import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3var _excluded = ["bsPrefix", "drop", "show", "className", "alignRight", "onSelect", "onToggle", "focusFirstItemOnShow", "as", "navbar"];
4import classNames from 'classnames';
5import React, { useContext } from 'react';
6import BaseDropdown from 'react-overlays/Dropdown';
7import { useUncontrolled } from 'uncontrollable';
8import useEventCallback from '@restart/hooks/useEventCallback';
9import DropdownItem from './DropdownItem';
10import DropdownMenu from './DropdownMenu';
11import DropdownToggle from './DropdownToggle';
12import SelectableContext from './SelectableContext';
13import { useBootstrapPrefix } from './ThemeProvider';
14import createWithBsPrefix from './createWithBsPrefix';
15var DropdownHeader = createWithBsPrefix('dropdown-header', {
16 defaultProps: {
17 role: 'heading'
18 }
19});
20var DropdownDivider = createWithBsPrefix('dropdown-divider', {
21 defaultProps: {
22 role: 'separator'
23 }
24});
25var DropdownItemText = createWithBsPrefix('dropdown-item-text', {
26 Component: 'span'
27});
28var defaultProps = {
29 navbar: false
30};
31var Dropdown = /*#__PURE__*/React.forwardRef(function (pProps, ref) {
32 var _useUncontrolled = useUncontrolled(pProps, {
33 show: 'onToggle'
34 }),
35 bsPrefix = _useUncontrolled.bsPrefix,
36 drop = _useUncontrolled.drop,
37 show = _useUncontrolled.show,
38 className = _useUncontrolled.className,
39 alignRight = _useUncontrolled.alignRight,
40 onSelect = _useUncontrolled.onSelect,
41 onToggle = _useUncontrolled.onToggle,
42 focusFirstItemOnShow = _useUncontrolled.focusFirstItemOnShow,
43 _useUncontrolled$as = _useUncontrolled.as,
44 Component = _useUncontrolled$as === void 0 ? 'div' : _useUncontrolled$as,
45 _4 = _useUncontrolled.navbar,
46 props = _objectWithoutPropertiesLoose(_useUncontrolled, _excluded);
47
48 var onSelectCtx = useContext(SelectableContext);
49 var prefix = useBootstrapPrefix(bsPrefix, 'dropdown');
50 var handleToggle = useEventCallback(function (nextShow, event, source) {
51 if (source === void 0) {
52 source = event.type;
53 }
54
55 if (event.currentTarget === document && (source !== 'keydown' || event.key === 'Escape')) source = 'rootClose';
56
57 if (onToggle) {
58 onToggle(nextShow, event, {
59 source: source
60 });
61 }
62 });
63 var handleSelect = useEventCallback(function (key, event) {
64 if (onSelectCtx) onSelectCtx(key, event);
65 if (onSelect) onSelect(key, event);
66 handleToggle(false, event, 'select');
67 });
68 return /*#__PURE__*/React.createElement(SelectableContext.Provider, {
69 value: handleSelect
70 }, /*#__PURE__*/React.createElement(BaseDropdown, {
71 drop: drop,
72 show: show,
73 alignEnd: alignRight,
74 onToggle: handleToggle,
75 focusFirstItemOnShow: focusFirstItemOnShow,
76 itemSelector: "." + prefix + "-item:not(.disabled):not(:disabled)"
77 }, /*#__PURE__*/React.createElement(Component, _extends({}, props, {
78 ref: ref,
79 className: classNames(className, show && 'show', (!drop || drop === 'down') && prefix, drop === 'up' && 'dropup', drop === 'right' && 'dropright', drop === 'left' && 'dropleft')
80 }))));
81});
82Dropdown.displayName = 'Dropdown';
83Dropdown.defaultProps = defaultProps;
84Dropdown.Divider = DropdownDivider;
85Dropdown.Header = DropdownHeader;
86Dropdown.Item = DropdownItem;
87Dropdown.ItemText = DropdownItemText;
88Dropdown.Menu = DropdownMenu;
89Dropdown.Toggle = DropdownToggle;
90export default Dropdown;
\No newline at end of file