@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.
140 lines (132 loc) • 6 kB
JavaScript
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
import * as React from "react";
import styled from "styled-components";
import Portal from "../Portal";
import PopoverContentWrapper from "./components/ContentWrapper";
import useTheme from "../hooks/useTheme";
import useStateWithTimeout from "../hooks/useStateWithTimeout";
import { POSITIONS, ALIGNS } from "./consts";
import handleKeyDown from "../utils/handleKeyDown";
var StyledPopoverChild = styled.div.withConfig({
displayName: "Popover__StyledPopoverChild",
componentId: "t88fx4-0"
})(["position:relative;"]);
var Popover = function Popover(_ref) {
var children = _ref.children,
_ref$offset = _ref.offset,
offset = _ref$offset === void 0 ? {
top: 0,
left: 0
} : _ref$offset,
content = _ref.content,
_ref$preferredPositio = _ref.preferredPosition,
preferredPosition = _ref$preferredPositio === void 0 ? POSITIONS.BOTTOM : _ref$preferredPositio,
_ref$preferredAlign = _ref.preferredAlign,
preferredAlign = _ref$preferredAlign === void 0 ? 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,
lockScrolling = _ref.lockScrolling,
actions = _ref.actions,
_ref$renderInPortal = _ref.renderInPortal,
renderInPortal = _ref$renderInPortal === void 0 ? true : _ref$renderInPortal;
var theme = useTheme();
var transitionLength = React.useMemo(function () {
return parseFloat(theme.orbit.durationFast) * 1000;
}, [theme.orbit.durationFast]);
var _useStateWithTimeout = useStateWithTimeout(false, transitionLength),
_useStateWithTimeout2 = _slicedToArray(_useStateWithTimeout, 4),
shown = _useStateWithTimeout2[0],
setShown = _useStateWithTimeout2[1],
setShownWithTimeout = _useStateWithTimeout2[2],
clearShownTimeout = _useStateWithTimeout2[3];
var _useStateWithTimeout3 = useStateWithTimeout(false, transitionLength),
_useStateWithTimeout4 = _slicedToArray(_useStateWithTimeout3, 4),
render = _useStateWithTimeout4[0],
setRender = _useStateWithTimeout4[1],
setRenderWithTimeout = _useStateWithTimeout4[2],
clearRenderTimeout = _useStateWithTimeout4[3];
var container = React.useRef(null);
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
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 = 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(PopoverContentWrapper, {
shown: shown,
offset: _objectSpread({
top: 0,
left: 0
}, offset),
width: width,
containerRef: container,
preferredPosition: preferredPosition,
preferredAlign: preferredAlign,
onClose: handleOut,
dataTest: dataTest,
noPadding: noPadding,
overlapped: overlapped,
fixed: fixed,
lockScrolling: lockScrolling,
actions: actions
}, content);
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(StyledPopoverChild, {
onClick: handleClick,
onKeyDown: handleKeyDown(handleClick),
ref: container
}, children), render && (renderInPortal ? /*#__PURE__*/React.createElement(Portal, {
renderInto: "popovers"
}, popover) : popover));
};
export default Popover;