pouncejs
Version:
A collection of UI components from Panther labs
93 lines (86 loc) • 3.21 kB
JavaScript
import _extends from "@babel/runtime/helpers/extends";
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/objectWithoutPropertiesLoose";
import React from 'react';
import ReachUIPopover from '@reach/popover';
import { useComposedRefs } from '@reach/utils';
import { animated, useTransition } from 'react-spring';
import { usePopoverContext } from './Popover';
import useOutsideClick from '../../utils/useOutsideClick';
import useEscapeKey from '../../utils/useEscapeKey';
import Box from '../Box';
import { useAlignmentFunction } from '../../utils/useAlignment';
var AnimatedPopover = animated(ReachUIPopover);
var PopoverContent = /*#__PURE__*/React.forwardRef(function PopoverContent(_ref, forwardedRef) {
var _ref$alignment = _ref.alignment,
alignment = _ref$alignment === void 0 ? 'bottom-left' : _ref$alignment,
children = _ref.children,
_ref$persistOnOutside = _ref.persistOnOutsideClicks,
persistOnOutsideClicks = _ref$persistOnOutside === void 0 ? false : _ref$persistOnOutside,
rest = _objectWithoutPropertiesLoose(_ref, ["alignment", "children", "persistOnOutsideClicks"]);
var alignmentFunction = useAlignmentFunction(alignment);
var _usePopoverContext = usePopoverContext(),
popoverId = _usePopoverContext.popoverId,
isOpen = _usePopoverContext.isOpen,
triggerRef = _usePopoverContext.triggerRef,
popoverRef = _usePopoverContext.popoverRef,
close = _usePopoverContext.close; // When the popoover opens, it should immediately get focus
React.useEffect(function () {
window.requestAnimationFrame(function () {
if (isOpen && popoverRef.current) {
popoverRef.current.focus();
}
});
}, [isOpen, popoverRef]); // Close popover on clicks outside
useOutsideClick({
refs: [popoverRef, triggerRef],
callback: function callback() {
return isOpen && close();
},
disabled: persistOnOutsideClicks || !isOpen
}); // Close on ESC key presses
useEscapeKey({
ref: popoverRef,
callback: close,
disabled: !isOpen
}); // merge internal + passed prop together
var ref = useComposedRefs(popoverRef, forwardedRef);
var transitions = useTransition(isOpen, null, {
from: {
transform: 'translate3d(0, 10px, 0)',
opacity: 0,
pointerEvents: 'none'
},
enter: {
transform: 'translate3d(0, 0, 0)',
opacity: 1,
pointerEvents: 'auto'
},
leave: {
transform: 'translate3d(0, 10px, 0)',
opacity: 0,
pointerEvents: 'none'
},
config: {
duration: 250
}
});
return /*#__PURE__*/React.createElement(React.Fragment, null, transitions.map(function (_ref2) {
var item = _ref2.item,
key = _ref2.key,
styles = _ref2.props;
return item && /*#__PURE__*/React.createElement(AnimatedPopover, {
key: key,
style: styles,
targetRef: triggerRef,
position: alignmentFunction,
role: "tooltip",
id: popoverId,
as: 'div'
}, /*#__PURE__*/React.createElement(Box, _extends({
ref: ref,
tabIndex: 0,
outline: "none"
}, rest), children));
}));
});
export default /*#__PURE__*/React.memo(PopoverContent);