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.

144 lines (124 loc) 6.13 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _Portal = _interopRequireDefault(require("../Portal")); var _ContentWrapper = _interopRequireDefault(require("./components/ContentWrapper")); var _useTheme = _interopRequireDefault(require("../hooks/useTheme")); var _useStateWithTimeout5 = _interopRequireDefault(require("../hooks/useStateWithTimeout")); var _consts = require("./consts"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } var StyledPopoverChild = _styledComponents.default.div.withConfig({ displayName: "Popover__StyledPopoverChild", componentId: "t88fx4-0" })(["position:relative;"]); var Popover = function Popover(_ref) { var children = _ref.children, content = _ref.content, _ref$preferredPositio = _ref.preferredPosition, preferredPosition = _ref$preferredPositio === void 0 ? _consts.POSITIONS.BOTTOM : _ref$preferredPositio, _ref$preferredAlign = _ref.preferredAlign, preferredAlign = _ref$preferredAlign === void 0 ? _consts.ALIGNS.START : _ref$preferredAlign, dataTest = _ref.dataTest, opened = _ref.opened, width = _ref.width, noPadding = _ref.noPadding, overlapped = _ref.overlapped, onClose = _ref.onClose, onOpen = _ref.onOpen, fixed = _ref.fixed, actions = _ref.actions; var theme = (0, _useTheme.default)(); var transitionLength = (0, _react.useMemo)(function () { return parseFloat(theme.orbit.durationFast) * 1000; }, [theme.orbit.durationFast]); var _useStateWithTimeout = (0, _useStateWithTimeout5.default)(false, transitionLength), _useStateWithTimeout2 = _slicedToArray(_useStateWithTimeout, 4), shown = _useStateWithTimeout2[0], setShown = _useStateWithTimeout2[1], setShownWithTimeout = _useStateWithTimeout2[2], clearShownTimeout = _useStateWithTimeout2[3]; var _useStateWithTimeout3 = (0, _useStateWithTimeout5.default)(false, transitionLength), _useStateWithTimeout4 = _slicedToArray(_useStateWithTimeout3, 4), render = _useStateWithTimeout4[0], setRender = _useStateWithTimeout4[1], setRenderWithTimeout = _useStateWithTimeout4[2], clearRenderTimeout = _useStateWithTimeout4[3]; var container = (0, _react.useRef)(null); var resolveCallback = (0, _react.useCallback)(function (state) { if (onClose && !state) onClose(); if (onOpen && state) onOpen(); }, [onClose, onOpen]); var handleOut = (0, _react.useCallback)(function (ev) { // If open prop is present ignore custom handler if (container.current && !container.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 = (0, _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]); (0, _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]); return _react.default.createElement(_react.default.Fragment, null, _react.default.createElement(StyledPopoverChild, { onClick: handleClick, ref: container }, children), render && _react.default.createElement(_Portal.default, { renderInto: "popovers" }, _react.default.createElement(_ContentWrapper.default, { shown: shown, width: width, containerRef: container, preferredPosition: preferredPosition, preferredAlign: preferredAlign, onClose: handleOut, dataTest: dataTest, noPadding: noPadding, overlapped: overlapped, fixed: fixed, actions: actions }, content))); }; var _default = Popover; exports.default = _default;