@cbinsights/fds
Version:
Form: A design system by CB Insights
167 lines (136 loc) • 7.34 kB
JavaScript
"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;