UNPKG

6.15 kBJavaScriptView Raw
1import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
3import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
4import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
5var _excluded = ["arrow", "prefixCls", "transitionName", "animation", "align", "placement", "placements", "getPopupContainer", "showAction", "hideAction", "overlayClassName", "overlayStyle", "visible", "trigger"];
6import * as React from 'react';
7import Trigger from 'rc-trigger';
8import classNames from 'classnames';
9import Placements from './placements';
10import useAccessibility from './hooks/useAccessibility';
11import { supportRef } from "rc-util/es/ref";
12
13function Dropdown(props, ref) {
14 var _props$arrow = props.arrow,
15 arrow = _props$arrow === void 0 ? false : _props$arrow,
16 _props$prefixCls = props.prefixCls,
17 prefixCls = _props$prefixCls === void 0 ? 'rc-dropdown' : _props$prefixCls,
18 transitionName = props.transitionName,
19 animation = props.animation,
20 align = props.align,
21 _props$placement = props.placement,
22 placement = _props$placement === void 0 ? 'bottomLeft' : _props$placement,
23 _props$placements = props.placements,
24 placements = _props$placements === void 0 ? Placements : _props$placements,
25 getPopupContainer = props.getPopupContainer,
26 showAction = props.showAction,
27 hideAction = props.hideAction,
28 overlayClassName = props.overlayClassName,
29 overlayStyle = props.overlayStyle,
30 visible = props.visible,
31 _props$trigger = props.trigger,
32 trigger = _props$trigger === void 0 ? ['hover'] : _props$trigger,
33 otherProps = _objectWithoutProperties(props, _excluded);
34
35 var _React$useState = React.useState(),
36 _React$useState2 = _slicedToArray(_React$useState, 2),
37 triggerVisible = _React$useState2[0],
38 setTriggerVisible = _React$useState2[1];
39
40 var mergedVisible = 'visible' in props ? visible : triggerVisible;
41 var triggerRef = React.useRef(null);
42 React.useImperativeHandle(ref, function () {
43 return triggerRef.current;
44 });
45 var menuRef = React.useRef(null);
46 var menuClassName = "".concat(prefixCls, "-menu");
47
48 var _useAccessibility = useAccessibility({
49 visible: mergedVisible,
50 setTriggerVisible: setTriggerVisible,
51 triggerRef: triggerRef,
52 menuRef: menuRef,
53 menuClassName: menuClassName,
54 onVisibleChange: props.onVisibleChange
55 }),
56 returnFocus = _useAccessibility.returnFocus;
57
58 var getOverlayElement = function getOverlayElement() {
59 var overlay = props.overlay;
60 var overlayElement;
61
62 if (typeof overlay === 'function') {
63 overlayElement = overlay();
64 } else {
65 overlayElement = overlay;
66 }
67
68 return overlayElement;
69 };
70
71 var onClick = function onClick(e) {
72 var onOverlayClick = props.onOverlayClick;
73 var overlayProps = getOverlayElement().props;
74 setTriggerVisible(false);
75
76 if (onOverlayClick) {
77 onOverlayClick(e);
78 }
79
80 if (overlayProps.onClick) {
81 overlayProps.onClick(e);
82 }
83
84 returnFocus();
85 };
86
87 var onVisibleChange = function onVisibleChange(newVisible) {
88 var onVisibleChangeProp = props.onVisibleChange;
89 setTriggerVisible(newVisible);
90
91 if (typeof onVisibleChangeProp === 'function') {
92 onVisibleChangeProp(newVisible);
93 }
94 };
95
96 var getMenuElement = function getMenuElement() {
97 var overlayElement = getOverlayElement();
98 var extraOverlayProps = {
99 prefixCls: menuClassName,
100 onClick: onClick,
101 ref: supportRef(overlayElement) ? menuRef : undefined
102 };
103
104 if (typeof overlayElement.type === 'string') {
105 delete extraOverlayProps.prefixCls;
106 }
107
108 return /*#__PURE__*/React.createElement(React.Fragment, null, arrow && /*#__PURE__*/React.createElement("div", {
109 className: "".concat(prefixCls, "-arrow")
110 }), /*#__PURE__*/React.cloneElement(overlayElement, extraOverlayProps));
111 };
112
113 var getMenuElementOrLambda = function getMenuElementOrLambda() {
114 var overlay = props.overlay;
115
116 if (typeof overlay === 'function') {
117 return getMenuElement;
118 }
119
120 return getMenuElement();
121 };
122
123 var getMinOverlayWidthMatchTrigger = function getMinOverlayWidthMatchTrigger() {
124 var minOverlayWidthMatchTrigger = props.minOverlayWidthMatchTrigger,
125 alignPoint = props.alignPoint;
126
127 if ('minOverlayWidthMatchTrigger' in props) {
128 return minOverlayWidthMatchTrigger;
129 }
130
131 return !alignPoint;
132 };
133
134 var getOpenClassName = function getOpenClassName() {
135 var openClassName = props.openClassName;
136
137 if (openClassName !== undefined) {
138 return openClassName;
139 }
140
141 return "".concat(prefixCls, "-open");
142 };
143
144 var renderChildren = function renderChildren() {
145 var children = props.children;
146 var childrenProps = children.props ? children.props : {};
147 var childClassName = classNames(childrenProps.className, getOpenClassName());
148 return mergedVisible && children ? /*#__PURE__*/React.cloneElement(children, {
149 className: childClassName
150 }) : children;
151 };
152
153 var triggerHideAction = hideAction;
154
155 if (!triggerHideAction && trigger.indexOf('contextMenu') !== -1) {
156 triggerHideAction = ['click'];
157 }
158
159 return /*#__PURE__*/React.createElement(Trigger, _objectSpread(_objectSpread({
160 builtinPlacements: placements
161 }, otherProps), {}, {
162 prefixCls: prefixCls,
163 ref: triggerRef,
164 popupClassName: classNames(overlayClassName, _defineProperty({}, "".concat(prefixCls, "-show-arrow"), arrow)),
165 popupStyle: overlayStyle,
166 action: trigger,
167 showAction: showAction,
168 hideAction: triggerHideAction || [],
169 popupPlacement: placement,
170 popupAlign: align,
171 popupTransitionName: transitionName,
172 popupAnimation: animation,
173 popupVisible: mergedVisible,
174 stretch: getMinOverlayWidthMatchTrigger() ? 'minWidth' : '',
175 popup: getMenuElementOrLambda(),
176 onPopupVisibleChange: onVisibleChange,
177 getPopupContainer: getPopupContainer
178 }), renderChildren());
179}
180
181export default /*#__PURE__*/React.forwardRef(Dropdown);
\No newline at end of file