UNPKG

6.38 kBJavaScriptView Raw
1import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
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 { composeRef, 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 useAccessibility({
48 visible: mergedVisible,
49 setTriggerVisible: setTriggerVisible,
50 triggerRef: triggerRef,
51 menuRef: menuRef,
52 onVisibleChange: props.onVisibleChange
53 });
54
55 var getOverlayElement = function getOverlayElement() {
56 var overlay = props.overlay;
57 var overlayElement;
58
59 if (typeof overlay === 'function') {
60 overlayElement = overlay();
61 } else {
62 overlayElement = overlay;
63 }
64
65 return overlayElement;
66 };
67
68 var onClick = function onClick(e) {
69 var onOverlayClick = props.onOverlayClick;
70 var overlayProps = getOverlayElement().props;
71 setTriggerVisible(false);
72
73 if (onOverlayClick) {
74 onOverlayClick(e);
75 }
76
77 if (overlayProps.onClick) {
78 overlayProps.onClick(e);
79 }
80 };
81
82 var onVisibleChange = function onVisibleChange(newVisible) {
83 var onVisibleChangeProp = props.onVisibleChange;
84 setTriggerVisible(newVisible);
85
86 if (typeof onVisibleChangeProp === 'function') {
87 onVisibleChangeProp(newVisible);
88 }
89 };
90
91 var getMenuElement = function getMenuElement() {
92 var _extraOverlayProps;
93
94 var overlayElement = getOverlayElement(); // @ts-ignore
95
96 var composedMenuRef = composeRef(menuRef, overlayElement.ref);
97 var extraOverlayProps = (_extraOverlayProps = {
98 prefixCls: menuClassName
99 }, _defineProperty(_extraOverlayProps, 'data-dropdown-inject', true), _defineProperty(_extraOverlayProps, "onClick", onClick), _defineProperty(_extraOverlayProps, "ref", supportRef(overlayElement) ? composedMenuRef : undefined), _extraOverlayProps);
100
101 if (typeof overlayElement.type === 'string') {
102 delete extraOverlayProps.prefixCls;
103 delete extraOverlayProps['data-dropdown-inject'];
104 }
105
106 return /*#__PURE__*/React.createElement(React.Fragment, null, arrow && /*#__PURE__*/React.createElement("div", {
107 className: "".concat(prefixCls, "-arrow")
108 }), /*#__PURE__*/React.cloneElement(overlayElement, extraOverlayProps));
109 };
110
111 var getMenuElementOrLambda = function getMenuElementOrLambda() {
112 var overlay = props.overlay;
113
114 if (typeof overlay === 'function') {
115 return getMenuElement;
116 }
117
118 return getMenuElement();
119 };
120
121 var getMinOverlayWidthMatchTrigger = function getMinOverlayWidthMatchTrigger() {
122 var minOverlayWidthMatchTrigger = props.minOverlayWidthMatchTrigger,
123 alignPoint = props.alignPoint;
124
125 if ('minOverlayWidthMatchTrigger' in props) {
126 return minOverlayWidthMatchTrigger;
127 }
128
129 return !alignPoint;
130 };
131
132 var getOpenClassName = function getOpenClassName() {
133 var openClassName = props.openClassName;
134
135 if (openClassName !== undefined) {
136 return openClassName;
137 }
138
139 return "".concat(prefixCls, "-open");
140 };
141
142 var renderChildren = function renderChildren() {
143 var children = props.children;
144 var childrenProps = children.props ? children.props : {};
145 var childClassName = classNames(childrenProps.className, getOpenClassName());
146 return mergedVisible && children ? /*#__PURE__*/React.cloneElement(children, {
147 className: childClassName
148 }) : children;
149 };
150
151 var triggerHideAction = hideAction;
152
153 if (!triggerHideAction && trigger.indexOf('contextMenu') !== -1) {
154 triggerHideAction = ['click'];
155 }
156
157 return /*#__PURE__*/React.createElement(Trigger, _objectSpread(_objectSpread({
158 builtinPlacements: placements
159 }, otherProps), {}, {
160 prefixCls: prefixCls,
161 ref: triggerRef,
162 popupClassName: classNames(overlayClassName, _defineProperty({}, "".concat(prefixCls, "-show-arrow"), arrow)),
163 popupStyle: overlayStyle,
164 action: trigger,
165 showAction: showAction,
166 hideAction: triggerHideAction || [],
167 popupPlacement: placement,
168 popupAlign: align,
169 popupTransitionName: transitionName,
170 popupAnimation: animation,
171 popupVisible: mergedVisible,
172 stretch: getMinOverlayWidthMatchTrigger() ? 'minWidth' : '',
173 popup: getMenuElementOrLambda(),
174 onPopupVisibleChange: onVisibleChange,
175 getPopupContainer: getPopupContainer
176 }), renderChildren());
177}
178
179export default /*#__PURE__*/React.forwardRef(Dropdown);
\No newline at end of file