1 | import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
2 | import _extends from "@babel/runtime/helpers/esm/extends";
|
3 | import PropTypes from 'prop-types';
|
4 | import React, { useContext, useRef } from 'react';
|
5 | import useCallbackRef from '@restart/hooks/useCallbackRef';
|
6 | import DropdownContext from './DropdownContext';
|
7 | import usePopper, { toModifierMap } from './usePopper';
|
8 | import useRootClose from './useRootClose';
|
9 |
|
10 | var noop = function noop() {};
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 | export function useDropdownMenu(options) {
|
23 | var _modifiers$arrow;
|
24 |
|
25 | if (options === void 0) {
|
26 | options = {};
|
27 | }
|
28 |
|
29 | var context = useContext(DropdownContext);
|
30 |
|
31 | var _useCallbackRef = useCallbackRef(),
|
32 | arrowElement = _useCallbackRef[0],
|
33 | attachArrowRef = _useCallbackRef[1];
|
34 |
|
35 | var hasShownRef = useRef(false);
|
36 | var _options = options,
|
37 | flip = _options.flip,
|
38 | rootCloseEvent = _options.rootCloseEvent,
|
39 | _options$popperConfig = _options.popperConfig,
|
40 | popperConfig = _options$popperConfig === void 0 ? {} : _options$popperConfig,
|
41 | _options$usePopper = _options.usePopper,
|
42 | shouldUsePopper = _options$usePopper === void 0 ? !!context : _options$usePopper;
|
43 | var show = (context == null ? void 0 : context.show) == null ? options.show : context.show;
|
44 | var alignEnd = (context == null ? void 0 : context.alignEnd) == null ? options.alignEnd : context.alignEnd;
|
45 |
|
46 | if (show && !hasShownRef.current) {
|
47 | hasShownRef.current = true;
|
48 | }
|
49 |
|
50 | var handleClose = function handleClose(e) {
|
51 | context == null ? void 0 : context.toggle(false, e);
|
52 | };
|
53 |
|
54 | var _ref = context || {},
|
55 | drop = _ref.drop,
|
56 | setMenu = _ref.setMenu,
|
57 | menuElement = _ref.menuElement,
|
58 | toggleElement = _ref.toggleElement;
|
59 |
|
60 | var placement = alignEnd ? 'bottom-end' : 'bottom-start';
|
61 | if (drop === 'up') placement = alignEnd ? 'top-end' : 'top-start';else if (drop === 'right') placement = alignEnd ? 'right-end' : 'right-start';else if (drop === 'left') placement = alignEnd ? 'left-end' : 'left-start';
|
62 | var modifiers = toModifierMap(popperConfig.modifiers);
|
63 | var popper = usePopper(toggleElement, menuElement, _extends({}, popperConfig, {
|
64 | placement: placement,
|
65 | enabled: !!(shouldUsePopper && show),
|
66 | modifiers: _extends({}, modifiers, {
|
67 | eventListeners: {
|
68 | enabled: !!show
|
69 | },
|
70 | arrow: _extends({}, modifiers.arrow, {
|
71 | enabled: !!arrowElement,
|
72 | options: _extends({}, (_modifiers$arrow = modifiers.arrow) == null ? void 0 : _modifiers$arrow.options, {
|
73 | element: arrowElement
|
74 | })
|
75 | }),
|
76 | flip: _extends({
|
77 | enabled: !!flip
|
78 | }, modifiers.flip)
|
79 | })
|
80 | }));
|
81 | var menu;
|
82 | var menuProps = {
|
83 | ref: setMenu || noop,
|
84 | 'aria-labelledby': toggleElement == null ? void 0 : toggleElement.id
|
85 | };
|
86 | var childArgs = {
|
87 | show: show,
|
88 | alignEnd: alignEnd,
|
89 | hasShown: hasShownRef.current,
|
90 | close: handleClose
|
91 | };
|
92 |
|
93 | if (!shouldUsePopper) {
|
94 | menu = _extends({}, childArgs, {
|
95 | props: menuProps
|
96 | });
|
97 | } else {
|
98 | menu = _extends({}, popper, {}, childArgs, {
|
99 | props: _extends({}, menuProps, {
|
100 | style: popper.styles
|
101 | }),
|
102 | arrowProps: {
|
103 | ref: attachArrowRef,
|
104 | style: popper.arrowStyles
|
105 | }
|
106 | });
|
107 | }
|
108 |
|
109 | useRootClose(menuElement, handleClose, {
|
110 | clickTrigger: rootCloseEvent,
|
111 | disabled: !(menu && show)
|
112 | });
|
113 | return menu;
|
114 | }
|
115 | var propTypes = {
|
116 | |
117 |
|
118 |
|
119 |
|
120 |
|
121 |
|
122 |
|
123 |
|
124 |
|
125 |
|
126 |
|
127 |
|
128 |
|
129 |
|
130 |
|
131 |
|
132 |
|
133 |
|
134 |
|
135 |
|
136 |
|
137 |
|
138 | children: PropTypes.func.isRequired,
|
139 |
|
140 | |
141 |
|
142 |
|
143 |
|
144 |
|
145 | show: PropTypes.bool,
|
146 |
|
147 | |
148 |
|
149 |
|
150 |
|
151 |
|
152 | alignEnd: PropTypes.bool,
|
153 |
|
154 | |
155 |
|
156 |
|
157 |
|
158 |
|
159 | flip: PropTypes.bool,
|
160 | usePopper: PropTypes.oneOf([true, false]),
|
161 |
|
162 | |
163 |
|
164 |
|
165 | popperConfig: PropTypes.object,
|
166 |
|
167 | |
168 |
|
169 |
|
170 | rootCloseEvent: PropTypes.string
|
171 | };
|
172 | var defaultProps = {
|
173 | usePopper: true
|
174 | };
|
175 |
|
176 |
|
177 |
|
178 |
|
179 |
|
180 |
|
181 |
|
182 | function DropdownMenu(_ref2) {
|
183 | var children = _ref2.children,
|
184 | options = _objectWithoutPropertiesLoose(_ref2, ["children"]);
|
185 |
|
186 | var args = useDropdownMenu(options);
|
187 | return React.createElement(React.Fragment, null, args.hasShown ? children(args) : null);
|
188 | }
|
189 |
|
190 | DropdownMenu.displayName = 'ReactOverlaysDropdownMenu';
|
191 | DropdownMenu.propTypes = propTypes;
|
192 | DropdownMenu.defaultProps = defaultProps;
|
193 |
|
194 |
|
195 | export default DropdownMenu; |
\ | No newline at end of file |