UNPKG

@kiwicom/orbit-components

Version:

Orbit-components is a React component library which provides developers with the easiest possible way of building Kiwi.com’s products.

150 lines (132 loc) 5.46 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var React = _interopRequireWildcard(require("react")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _useStateWithTimeout5 = _interopRequireDefault(require("../hooks/useStateWithTimeout")); var _useTheme = _interopRequireDefault(require("../hooks/useTheme")); var _consts = require("./consts"); var _ContentWrapper = _interopRequireDefault(require("./components/ContentWrapper")); var _Portal = _interopRequireDefault(require("../Portal")); var _handleKeyDown = _interopRequireDefault(require("../utils/handleKeyDown")); var StyledPopoverChild = _styledComponents.default.div.withConfig({ displayName: "Popover__StyledPopoverChild", componentId: "t88fx4-0" })(["position:relative;"]); var Popover = function Popover(_ref) { var children = _ref.children, _ref$renderInPortal = _ref.renderInPortal, renderInPortal = _ref$renderInPortal === void 0 ? true : _ref$renderInPortal, opened = _ref.opened, content = _ref.content, onClose = _ref.onClose, onOpen = _ref.onOpen, offset = _ref.offset, _ref$placement = _ref.placement, placement = _ref$placement === void 0 ? _consts.PLACEMENTS.BOTTOM_START : _ref$placement, fixed = _ref.fixed, lockScrolling = _ref.lockScrolling, noFlip = _ref.noFlip, allowOverflow = _ref.allowOverflow, noPadding = _ref.noPadding, width = _ref.width, actions = _ref.actions, overlapped = _ref.overlapped, dataTest = _ref.dataTest; var ref = React.useRef(null); var theme = (0, _useTheme.default)(); var transitionLength = React.useMemo(function () { return parseFloat(theme.orbit.durationFast) * 1000; }, [theme.orbit.durationFast]); var _useStateWithTimeout = (0, _useStateWithTimeout5.default)(false, transitionLength), _useStateWithTimeout2 = (0, _slicedToArray2.default)(_useStateWithTimeout, 4), shown = _useStateWithTimeout2[0], setShown = _useStateWithTimeout2[1], setShownWithTimeout = _useStateWithTimeout2[2], clearShownTimeout = _useStateWithTimeout2[3]; var _useStateWithTimeout3 = (0, _useStateWithTimeout5.default)(false, transitionLength), _useStateWithTimeout4 = (0, _slicedToArray2.default)(_useStateWithTimeout3, 4), render = _useStateWithTimeout4[0], setRender = _useStateWithTimeout4[1], setRenderWithTimeout = _useStateWithTimeout4[2], clearRenderTimeout = _useStateWithTimeout4[3]; var resolveCallback = React.useCallback(function (state) { if (onClose && !state) onClose(); if (onOpen && state) onOpen(); }, [onClose, onOpen]); var handleOut = React.useCallback(function (ev) { // If open prop is present ignore custom handler // $FlowFixMe: TODO if (ref.current && !ref.current.contains(ev.target)) { if (typeof opened === "undefined") { setShown(false); clearShownTimeout(); setRenderWithTimeout(false); resolveCallback(false); } else if (onClose) onClose(); } }, [clearShownTimeout, onClose, opened, resolveCallback, setRenderWithTimeout, setShown]); var handleClick = React.useCallback(function () { // If open prop is present ignore custom handler if (typeof opened === "undefined") { if (shown) { setShown(false); clearShownTimeout(); setRenderWithTimeout(false); resolveCallback(false); } else { setRender(true); clearRenderTimeout(); setShownWithTimeout(true); resolveCallback(true); } } else if (opened) { resolveCallback(false); } else if (!opened) { resolveCallback(true); } }, [clearRenderTimeout, clearShownTimeout, opened, resolveCallback, setRender, setRenderWithTimeout, setShown, setShownWithTimeout, shown]); React.useEffect(function () { if (typeof opened !== "undefined") { if (opened) { setRender(true); clearRenderTimeout(); setShownWithTimeout(true); } else { setShown(false); clearShownTimeout(); setRenderWithTimeout(false); } } }, [opened, clearRenderTimeout, clearShownTimeout, setRender, setShown, setShownWithTimeout, setRenderWithTimeout]); var popover = /*#__PURE__*/React.createElement(_ContentWrapper.default, { shown: shown, dataTest: dataTest, overlapped: overlapped, fixed: fixed, noFlip: noFlip, allowOverflow: allowOverflow, lockScrolling: lockScrolling, noPadding: noPadding, actions: actions, width: width, offset: offset, referenceElement: ref.current, onClose: handleOut, placement: placement }, content); return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(StyledPopoverChild, { ref: ref, onClick: handleClick, onKeyDown: (0, _handleKeyDown.default)(handleClick) }, children), render && (renderInPortal ? /*#__PURE__*/React.createElement(_Portal.default, { renderInto: "popovers" }, popover) : popover)); }; var _default = Popover; exports.default = _default;