UNPKG

9.02 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
5var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
6
7exports.__esModule = true;
8exports["default"] = void 0;
9
10var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
12var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
13
14var _propTypes = _interopRequireDefault(require("prop-types"));
15
16var _react = _interopRequireWildcard(require("react"));
17
18var _reactDom = _interopRequireDefault(require("react-dom"));
19
20var _useCallbackRef3 = _interopRequireDefault(require("@restart/hooks/useCallbackRef"));
21
22var _useMergedRefs = _interopRequireDefault(require("@restart/hooks/useMergedRefs"));
23
24var _popper = require("./popper");
25
26var _usePopper2 = _interopRequireWildcard(require("./usePopper"));
27
28var _useRootClose = _interopRequireDefault(require("./useRootClose"));
29
30var _useWaitForDOMRef = _interopRequireDefault(require("./useWaitForDOMRef"));
31
32/**
33 * Built on top of `Popper.js`, the overlay component is
34 * great for custom tooltip overlays.
35 */
36var Overlay = _react["default"].forwardRef(function (props, outerRef) {
37 var _modifiers$preventOve, _modifiers$arrow;
38
39 var flip = props.flip,
40 placement = props.placement,
41 _props$containerPaddi = props.containerPadding,
42 containerPadding = _props$containerPaddi === void 0 ? 5 : _props$containerPaddi,
43 _props$popperConfig = props.popperConfig,
44 popperConfig = _props$popperConfig === void 0 ? {} : _props$popperConfig,
45 Transition = props.transition;
46
47 var _useCallbackRef = (0, _useCallbackRef3["default"])(),
48 rootElement = _useCallbackRef[0],
49 attachRef = _useCallbackRef[1];
50
51 var _useCallbackRef2 = (0, _useCallbackRef3["default"])(),
52 arrowElement = _useCallbackRef2[0],
53 attachArrowRef = _useCallbackRef2[1];
54
55 var mergedRef = (0, _useMergedRefs["default"])(attachRef, outerRef);
56 var container = (0, _useWaitForDOMRef["default"])(props.container);
57 var target = (0, _useWaitForDOMRef["default"])(props.target);
58
59 var _useState = (0, _react.useState)(!props.show),
60 exited = _useState[0],
61 setExited = _useState[1];
62
63 var modifiers = (0, _usePopper2.toModifierMap)(popperConfig.modifiers);
64
65 var _usePopper = (0, _usePopper2["default"])(target, rootElement, (0, _extends2["default"])({}, popperConfig, {
66 placement: placement || 'bottom',
67 modifiers: (0, _extends2["default"])({}, modifiers, {
68 eventListeners: {
69 enabled: !!props.show
70 },
71 preventOverflow: (0, _extends2["default"])({}, modifiers.preventOverflow, {
72 options: (0, _extends2["default"])({
73 padding: containerPadding || 5
74 }, (_modifiers$preventOve = modifiers.preventOverflow) == null ? void 0 : _modifiers$preventOve.options)
75 }),
76 arrow: (0, _extends2["default"])({}, modifiers.arrow, {
77 enabled: !!arrowElement,
78 options: (0, _extends2["default"])({}, (_modifiers$arrow = modifiers.arrow) == null ? void 0 : _modifiers$arrow.options, {
79 element: arrowElement
80 })
81 }),
82 flip: (0, _extends2["default"])({
83 enabled: !!flip
84 }, modifiers.flip)
85 })
86 })),
87 styles = _usePopper.styles,
88 arrowStyles = _usePopper.arrowStyles,
89 popper = (0, _objectWithoutPropertiesLoose2["default"])(_usePopper, ["styles", "arrowStyles"]);
90
91 if (props.show) {
92 if (exited) setExited(false);
93 } else if (!props.transition && !exited) {
94 setExited(true);
95 }
96
97 var handleHidden = function handleHidden() {
98 setExited(true);
99
100 if (props.onExited) {
101 props.onExited.apply(props, arguments);
102 }
103 }; // Don't un-render the overlay while it's transitioning out.
104
105
106 var mountOverlay = props.show || Transition && !exited;
107 (0, _useRootClose["default"])(rootElement, props.onHide, {
108 disabled: !props.rootClose || props.rootCloseDisabled,
109 clickTrigger: props.rootCloseEvent
110 });
111
112 if (!mountOverlay) {
113 // Don't bother showing anything if we don't have to.
114 return null;
115 }
116
117 var child = props.children((0, _extends2["default"])({}, popper, {
118 show: !!props.show,
119 props: {
120 style: styles,
121 ref: mergedRef
122 },
123 arrowProps: {
124 style: arrowStyles,
125 ref: attachArrowRef
126 }
127 }));
128
129 if (Transition) {
130 var onExit = props.onExit,
131 onExiting = props.onExiting,
132 onEnter = props.onEnter,
133 onEntering = props.onEntering,
134 onEntered = props.onEntered;
135 child = /*#__PURE__*/_react["default"].createElement(Transition, {
136 "in": props.show,
137 appear: true,
138 onExit: onExit,
139 onExiting: onExiting,
140 onExited: handleHidden,
141 onEnter: onEnter,
142 onEntering: onEntering,
143 onEntered: onEntered
144 }, child);
145 }
146
147 return container ? _reactDom["default"].createPortal(child, container) : null;
148});
149
150Overlay.displayName = 'Overlay';
151Overlay.propTypes = {
152 /**
153 * Set the visibility of the Overlay
154 */
155 show: _propTypes["default"].bool,
156
157 /** Specify where the overlay element is positioned in relation to the target element */
158 placement: _propTypes["default"].oneOf(_popper.placements),
159
160 /**
161 * A DOM Element, Ref to an element, or function that returns either. The `target` element is where
162 * the overlay is positioned relative to.
163 */
164 target: _propTypes["default"].any,
165
166 /**
167 * A DOM Element, Ref to an element, or function that returns either. The `container` will have the Portal children
168 * appended to it.
169 */
170 container: _propTypes["default"].any,
171
172 /**
173 * Enables the Popper.js `flip` modifier, allowing the Overlay to
174 * automatically adjust it's placement in case of overlap with the viewport or toggle.
175 * Refer to the [flip docs](https://popper.js.org/popper-documentation.html#modifiers..flip.enabled) for more info
176 */
177 flip: _propTypes["default"].bool,
178
179 /**
180 * A render prop that returns an element to overlay and position. See
181 * the [react-popper documentation](https://github.com/FezVrasta/react-popper#children) for more info.
182 *
183 * @type {Function ({
184 * show: boolean,
185 * placement: Placement,
186 * outOfBoundaries: ?boolean,
187 * scheduleUpdate: () => void,
188 * props: {
189 * ref: (?HTMLElement) => void,
190 * style: { [string]: string | number },
191 * aria-labelledby: ?string
192 * },
193 * arrowProps: {
194 * ref: (?HTMLElement) => void,
195 * style: { [string]: string | number },
196 * },
197 * }) => React.Element}
198 */
199 children: _propTypes["default"].func.isRequired,
200
201 /**
202 * Control how much space there is between the edge of the boundary element and overlay.
203 * A convenience shortcut to setting `popperConfig.modfiers.preventOverflow.padding`
204 */
205 containerPadding: _propTypes["default"].number,
206
207 /**
208 * A set of popper options and props passed directly to react-popper's Popper component.
209 */
210 popperConfig: _propTypes["default"].object,
211
212 /**
213 * Specify whether the overlay should trigger `onHide` when the user clicks outside the overlay
214 */
215 rootClose: _propTypes["default"].bool,
216
217 /**
218 * Specify event for toggling overlay
219 */
220 rootCloseEvent: _propTypes["default"].oneOf(['click', 'mousedown']),
221
222 /**
223 * Specify disabled for disable RootCloseWrapper
224 */
225 rootCloseDisabled: _propTypes["default"].bool,
226
227 /**
228 * A Callback fired by the Overlay when it wishes to be hidden.
229 *
230 * __required__ when `rootClose` is `true`.
231 *
232 * @type func
233 */
234 onHide: function onHide(props) {
235 for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
236 args[_key - 1] = arguments[_key];
237 }
238
239 if (props.rootClose) {
240 var _PropTypes$func;
241
242 return (_PropTypes$func = _propTypes["default"].func).isRequired.apply(_PropTypes$func, [props].concat(args));
243 }
244
245 return _propTypes["default"].func.apply(_propTypes["default"], [props].concat(args));
246 },
247
248 /**
249 * A `react-transition-group@2.0.0` `<Transition/>` component
250 * used to animate the overlay as it changes visibility.
251 */
252 // @ts-ignore
253 transition: _propTypes["default"].elementType,
254
255 /**
256 * Callback fired before the Overlay transitions in
257 */
258 onEnter: _propTypes["default"].func,
259
260 /**
261 * Callback fired as the Overlay begins to transition in
262 */
263 onEntering: _propTypes["default"].func,
264
265 /**
266 * Callback fired after the Overlay finishes transitioning in
267 */
268 onEntered: _propTypes["default"].func,
269
270 /**
271 * Callback fired right before the Overlay transitions out
272 */
273 onExit: _propTypes["default"].func,
274
275 /**
276 * Callback fired as the Overlay begins to transition out
277 */
278 onExiting: _propTypes["default"].func,
279
280 /**
281 * Callback fired after the Overlay finishes transitioning out
282 */
283 onExited: _propTypes["default"].func
284};
285var _default = Overlay;
286exports["default"] = _default;
287module.exports = exports.default;
\No newline at end of file