UNPKG

@cbinsights/fds

Version:
167 lines (136 loc) • 7.34 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = _interopRequireWildcard(require("react")); var _classcat = _interopRequireDefault(require("classcat")); var RadixPopover = _interopRequireWildcard(require("@radix-ui/react-popover")); var _reactTransitionGroup = require("react-transition-group"); var _styleConstants = _interopRequireDefault(require("../../dictionary/js/styleConstants")); var _hooks = require("./hooks"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); 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 = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } var Popover = /*#__PURE__*/_react.default.forwardRef(function (_ref, forwardedRef) { var _ref$alignment = _ref.alignment, alignment = _ref$alignment === void 0 ? 'start' : _ref$alignment, children = _ref.children, closeOnScrollRef = _ref.closeOnScrollRef, _ref$delay = _ref.delay, delay = _ref$delay === void 0 ? 0 : _ref$delay, disablePortal = _ref.disablePortal, disableScrollRef = _ref.disableScrollRef, _ref$distance = _ref.distance, distance = _ref$distance === void 0 ? 4 : _ref$distance, _ref$interactionMode = _ref.interactionMode, interactionMode = _ref$interactionMode === void 0 ? 'click' : _ref$interactionMode, _ref$isOpen = _ref.isOpen, isOpen = _ref$isOpen === void 0 ? false : _ref$isOpen, _ref$onClose = _ref.onClose, onClose = _ref$onClose === void 0 ? function () {} : _ref$onClose, _ref$onOpen = _ref.onOpen, onOpen = _ref$onOpen === void 0 ? function () {} : _ref$onOpen, _ref$onUserDismiss = _ref.onUserDismiss, onUserDismiss = _ref$onUserDismiss === void 0 ? function () {} : _ref$onUserDismiss, _ref$position = _ref.position, position = _ref$position === void 0 ? 'bottom' : _ref$position, transitionName = _ref.transitionName, trigger = _ref.trigger; var _useState = (0, _react.useState)(isOpen), _useState2 = (0, _slicedToArray2.default)(_useState, 2), isActive = _useState2[0], setIsActive = _useState2[1]; var refContent = forwardedRef || (0, _react.useRef)(null); (0, _hooks.useCloseOnScroll)(closeOnScrollRef, isActive, function () { handleChange(false); }); (0, _hooks.useDisableScroll)(disableScrollRef, isActive); var isHover = interactionMode === 'hover'; var isControlled = interactionMode === 'controlled'; // update active state on props change to accommodate fully controlled popovers (0, _react.useEffect)(function () { setIsActive(isControlled && !!isOpen); }, [interactionMode, isOpen]); var triggerProps = { style: isActive && isControlled ? _objectSpread(_objectSpread({}, trigger.props.style), {}, { pointerEvents: 'none' }) : trigger.props.style }; var hoverTimeout; if (interactionMode === 'hover') { triggerProps.onMouseEnter = function () { if (delay > 0) { hoverTimeout = setTimeout(handleChange, delay, true); } else { handleChange(true); } }; triggerProps.onMouseLeave = function () { if (hoverTimeout) { clearTimeout(hoverTimeout); } handleChange(false); }; triggerProps.onClick = function (e) { e.stopPropagation(); handleChange(false); }; triggerProps.tabIndex = 1; } else if (interactionMode === 'click') { triggerProps.onClick = function (e) { e.stopPropagation(); handleChange(!isActive); }; } var clonedTrigger = /*#__PURE__*/_react.default.cloneElement(trigger, triggerProps); var contentStyle = { zIndex: Number(_styleConstants.default.ZINDEX_MODAL) }; var popperContent = /*#__PURE__*/_react.default.createElement(_reactTransitionGroup.CSSTransition, { in: isActive, unmountOnExit: isHover, timeout: transitionName ? 200 : 0, classNames: transitionName && !isActive ? "rtg".concat(transitionName) : undefined }, /*#__PURE__*/_react.default.createElement("div", { style: _objectSpread({}, contentStyle) }, children)); var handleChange = function handleChange(open) { if (!isControlled) { setIsActive(open); if (open) { onOpen(); } else { onClose(); } } }; return /*#__PURE__*/_react.default.createElement(RadixPopover.Root, { open: isActive, onOpenChange: handleChange }, /*#__PURE__*/_react.default.createElement(RadixPopover.Trigger, { asChild: true }, /*#__PURE__*/_react.default.createElement("div", { className: "display--flex width--fit" }, clonedTrigger)), /*#__PURE__*/_react.default.createElement(RadixPopover.Content, { ref: refContent, className: (0, _classcat.default)([{ 'ease-in-out': !closeOnScrollRef }]), align: alignment, side: position, sideOffset: distance, portalled: !disablePortal, onEscapeKeyDown: onUserDismiss, onInteractOutside: onUserDismiss, avoidCollisions: true, collisionTolerance: 0 }, popperContent)); }); Popover.displayName = 'Popover'; var _default = Popover; exports.default = _default;