UNPKG

8.58 kBJavaScriptView Raw
1import _extends from "@babel/runtime/helpers/esm/extends";
2import _typeof from "@babel/runtime/helpers/esm/typeof";
3import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
4import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
5import RightOutlined from "@ant-design/icons/es/icons/RightOutlined";
6import classNames from 'classnames';
7import RcDropdown from 'rc-dropdown';
8import useEvent from "rc-util/es/hooks/useEvent";
9import useMergedState from "rc-util/es/hooks/useMergedState";
10import * as React from 'react';
11import Menu from '../menu';
12import { ConfigContext } from '../config-provider';
13import { OverrideProvider } from '../menu/OverrideContext';
14import genPurePanel from '../_util/PurePanel';
15import getPlacements from '../_util/placements';
16import { cloneElement } from '../_util/reactNode';
17import { tuple } from '../_util/type';
18import warning from '../_util/warning';
19import DropdownButton from './dropdown-button';
20import useStyle from './style';
21var Placements = tuple('topLeft', 'topCenter', 'topRight', 'bottomLeft', 'bottomCenter', 'bottomRight', 'top', 'bottom');
22var Dropdown = function Dropdown(props) {
23 var _React$useContext = React.useContext(ConfigContext),
24 getContextPopupContainer = _React$useContext.getPopupContainer,
25 getPrefixCls = _React$useContext.getPrefixCls,
26 direction = _React$useContext.direction;
27 // Warning for deprecated usage
28 if (process.env.NODE_ENV !== 'production') {
29 [['visible', 'open'], ['onVisibleChange', 'onOpenChange']].forEach(function (_ref) {
30 var _ref2 = _slicedToArray(_ref, 2),
31 deprecatedName = _ref2[0],
32 newName = _ref2[1];
33 process.env.NODE_ENV !== "production" ? warning(!(deprecatedName in props), 'Dropdown', "`" + deprecatedName + "` is deprecated which will be removed in next major version, please use `" + newName + "` instead.") : void 0;
34 });
35 process.env.NODE_ENV !== "production" ? warning(!('overlay' in props), 'Dropdown', '`overlay` is deprecated. Please use `menu` instead.') : void 0;
36 }
37 var getTransitionName = function getTransitionName() {
38 var rootPrefixCls = getPrefixCls();
39 var _props$placement = props.placement,
40 placement = _props$placement === void 0 ? '' : _props$placement,
41 transitionName = props.transitionName;
42 if (transitionName !== undefined) {
43 return transitionName;
44 }
45 if (placement.includes('top')) {
46 return rootPrefixCls + "-slide-down";
47 }
48 return rootPrefixCls + "-slide-up";
49 };
50 var getPlacement = function getPlacement() {
51 var placement = props.placement;
52 if (!placement) {
53 return direction === 'rtl' ? 'bottomRight' : 'bottomLeft';
54 }
55 if (placement.includes('Center')) {
56 var newPlacement = placement.slice(0, placement.indexOf('Center'));
57 process.env.NODE_ENV !== "production" ? warning(!placement.includes('Center'), 'Dropdown', "You are using '" + placement + "' placement in Dropdown, which is deprecated. Try to use '" + newPlacement + "' instead.") : void 0;
58 return newPlacement;
59 }
60 return placement;
61 };
62 var menu = props.menu,
63 arrow = props.arrow,
64 customizePrefixCls = props.prefixCls,
65 children = props.children,
66 trigger = props.trigger,
67 disabled = props.disabled,
68 dropdownRender = props.dropdownRender,
69 getPopupContainer = props.getPopupContainer,
70 overlayClassName = props.overlayClassName,
71 open = props.open,
72 onOpenChange = props.onOpenChange,
73 visible = props.visible,
74 onVisibleChange = props.onVisibleChange,
75 _props$mouseEnterDela = props.mouseEnterDelay,
76 mouseEnterDelay = _props$mouseEnterDela === void 0 ? 0.15 : _props$mouseEnterDela,
77 _props$mouseLeaveDela = props.mouseLeaveDelay,
78 mouseLeaveDelay = _props$mouseLeaveDela === void 0 ? 0.1 : _props$mouseLeaveDela;
79 if (process.env.NODE_ENV !== 'production') {
80 [['visible', 'open'], ['onVisibleChange', 'onOpenChange']].forEach(function (_ref3) {
81 var _ref4 = _slicedToArray(_ref3, 2),
82 deprecatedName = _ref4[0],
83 newName = _ref4[1];
84 process.env.NODE_ENV !== "production" ? warning(!(deprecatedName in props), 'Dropdown', "`" + deprecatedName + "` is deprecated, please use `" + newName + "` instead.") : void 0;
85 });
86 }
87 var prefixCls = getPrefixCls('dropdown', customizePrefixCls);
88 var _useStyle = useStyle(prefixCls),
89 _useStyle2 = _slicedToArray(_useStyle, 2),
90 wrapSSR = _useStyle2[0],
91 hashId = _useStyle2[1];
92 var child = React.Children.only(children);
93 var dropdownTrigger = cloneElement(child, {
94 className: classNames(prefixCls + "-trigger", _defineProperty({}, prefixCls + "-rtl", direction === 'rtl'), child.props.className),
95 disabled: disabled
96 });
97 var triggerActions = disabled ? [] : trigger;
98 var alignPoint;
99 if (triggerActions && triggerActions.includes('contextMenu')) {
100 alignPoint = true;
101 }
102 // =========================== Open ============================
103 var _useMergedState = useMergedState(false, {
104 value: open !== null && open !== void 0 ? open : visible
105 }),
106 _useMergedState2 = _slicedToArray(_useMergedState, 2),
107 mergedOpen = _useMergedState2[0],
108 setOpen = _useMergedState2[1];
109 var onInnerOpenChange = useEvent(function (nextOpen) {
110 onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(nextOpen);
111 onVisibleChange === null || onVisibleChange === void 0 ? void 0 : onVisibleChange(nextOpen);
112 setOpen(nextOpen);
113 });
114 // =========================== Overlay ============================
115 var overlayClassNameCustomized = classNames(overlayClassName, hashId, _defineProperty({}, prefixCls + "-rtl", direction === 'rtl'));
116 var builtinPlacements = getPlacements({
117 arrowPointAtCenter: _typeof(arrow) === 'object' && arrow.pointAtCenter,
118 autoAdjustOverflow: true
119 });
120 var onMenuClick = React.useCallback(function () {
121 setOpen(false);
122 }, []);
123 var renderOverlay = function renderOverlay() {
124 // rc-dropdown already can process the function of overlay, but we have check logic here.
125 // So we need render the element to check and pass back to rc-dropdown.
126 var overlay = props.overlay;
127 var overlayNode;
128 if (menu === null || menu === void 0 ? void 0 : menu.items) {
129 overlayNode = /*#__PURE__*/React.createElement(Menu, _extends({}, menu));
130 } else if (typeof overlay === 'function') {
131 overlayNode = overlay();
132 } else {
133 overlayNode = overlay;
134 }
135 if (dropdownRender) {
136 overlayNode = dropdownRender(overlayNode);
137 }
138 overlayNode = React.Children.only(typeof overlayNode === 'string' ? /*#__PURE__*/React.createElement("span", null, overlayNode) : overlayNode);
139 return /*#__PURE__*/React.createElement(OverrideProvider, {
140 prefixCls: prefixCls + "-menu",
141 expandIcon: /*#__PURE__*/React.createElement("span", {
142 className: prefixCls + "-menu-submenu-arrow"
143 }, /*#__PURE__*/React.createElement(RightOutlined, {
144 className: prefixCls + "-menu-submenu-arrow-icon"
145 })),
146 mode: "vertical",
147 selectable: false,
148 onClick: onMenuClick,
149 validator: function validator(_ref5) {
150 var mode = _ref5.mode;
151 // Warning if use other mode
152 process.env.NODE_ENV !== "production" ? warning(!mode || mode === 'vertical', 'Dropdown', "mode=\"" + mode + "\" is not supported for Dropdown's Menu.") : void 0;
153 }
154 }, overlayNode);
155 };
156 // ============================ Render ============================
157 return wrapSSR( /*#__PURE__*/React.createElement(RcDropdown, _extends({
158 alignPoint: alignPoint
159 }, props, {
160 mouseEnterDelay: mouseEnterDelay,
161 mouseLeaveDelay: mouseLeaveDelay,
162 visible: mergedOpen,
163 builtinPlacements: builtinPlacements,
164 arrow: !!arrow,
165 overlayClassName: overlayClassNameCustomized,
166 prefixCls: prefixCls,
167 getPopupContainer: getPopupContainer || getContextPopupContainer,
168 transitionName: getTransitionName(),
169 trigger: triggerActions,
170 overlay: renderOverlay,
171 placement: getPlacement(),
172 onVisibleChange: onInnerOpenChange
173 }), dropdownTrigger));
174};
175Dropdown.Button = DropdownButton;
176// We don't care debug panel
177var PurePanel = genPurePanel(Dropdown, 'dropdown', function (prefixCls) {
178 return prefixCls;
179});
180/* istanbul ignore next */
181var WrapPurePanel = function WrapPurePanel(props) {
182 return /*#__PURE__*/React.createElement(PurePanel, _extends({}, props), /*#__PURE__*/React.createElement("span", null));
183};
184Dropdown._InternalPanelDoNotUseOrYouWillBeFired = WrapPurePanel;
185export default Dropdown;
\No newline at end of file