@coreui/react
Version:
UI Components Library for React.js
120 lines (116 loc) • 6.09 kB
JavaScript
var tslib_es6 = require('../../node_modules/tslib/tslib.es6.js');
var React = require('react');
var index = require('../../_virtual/index.js');
var PropTypes = require('prop-types');
var CConditionalPortal = require('../conditional-portal/CConditionalPortal.js');
var useForkedRef = require('../../hooks/useForkedRef.js');
var usePopper = require('../../hooks/usePopper.js');
var props = require('../../props.js');
var executeAfterTransition = require('../../utils/executeAfterTransition.js');
var getRTLPlacement = require('../../utils/getRTLPlacement.js');
var CPopover = React.forwardRef(function (_a, ref) {
var children = _a.children, _b = _a.animation, animation = _b === void 0 ? true : _b, className = _a.className, container = _a.container, content = _a.content, _c = _a.delay, delay = _c === void 0 ? 0 : _c, _d = _a.fallbackPlacements, fallbackPlacements = _d === void 0 ? ['top', 'right', 'bottom', 'left'] : _d, _e = _a.offset, offset = _e === void 0 ? [0, 8] : _e, onHide = _a.onHide, onShow = _a.onShow, _f = _a.placement, placement = _f === void 0 ? 'top' : _f, popperConfig = _a.popperConfig, title = _a.title, _g = _a.trigger, trigger = _g === void 0 ? 'click' : _g, visible = _a.visible, rest = tslib_es6.__rest(_a, ["children", "animation", "className", "container", "content", "delay", "fallbackPlacements", "offset", "onHide", "onShow", "placement", "popperConfig", "title", "trigger", "visible"]);
var popoverRef = React.useRef(null);
var togglerRef = React.useRef(null);
var forkedRef = useForkedRef.useForkedRef(ref, popoverRef);
var id = "popover".concat(React.useId());
var _h = React.useState(false), mounted = _h[0], setMounted = _h[1];
var _j = React.useState(visible), _visible = _j[0], setVisible = _j[1];
var _k = usePopper.usePopper(), initPopper = _k.initPopper, destroyPopper = _k.destroyPopper;
var _delay = typeof delay === 'number' ? { show: delay, hide: delay } : delay;
var defaultPopperConfig = {
modifiers: [
{ name: 'arrow', options: { element: '.popover-arrow' } },
{ name: 'flip', options: { fallbackPlacements: fallbackPlacements } },
{ name: 'offset', options: { offset: offset } },
],
placement: getRTLPlacement.default(placement, togglerRef.current),
};
var computedPopperConfig = tslib_es6.__assign(tslib_es6.__assign({}, defaultPopperConfig), (typeof popperConfig === 'function' ? popperConfig(defaultPopperConfig) : popperConfig));
React.useEffect(function () {
if (visible) {
handleShow();
return;
}
handleHide();
}, [visible]);
React.useEffect(function () {
if (mounted && togglerRef.current && popoverRef.current) {
initPopper(togglerRef.current, popoverRef.current, computedPopperConfig);
setTimeout(function () {
setVisible(true);
}, _delay.show);
return;
}
if (!mounted && togglerRef.current && popoverRef.current) {
destroyPopper();
}
}, [mounted]);
React.useEffect(function () {
if (!_visible && togglerRef.current && popoverRef.current) {
executeAfterTransition.default(function () {
setMounted(false);
}, popoverRef.current);
}
}, [_visible]);
var handleShow = function () {
setMounted(true);
if (onShow) {
onShow();
}
};
var handleHide = function () {
setTimeout(function () {
setVisible(false);
if (onHide) {
onHide();
}
}, _delay.hide);
};
return (React.createElement(React.Fragment, null,
React.cloneElement(children, tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign({}, (_visible && {
'aria-describedby': id,
})), { ref: togglerRef }), ((trigger === 'click' || trigger.includes('click')) && {
onClick: function () { return (_visible ? handleHide() : handleShow()); },
})), ((trigger === 'focus' || trigger.includes('focus')) && {
onFocus: function () { return handleShow(); },
onBlur: function () { return handleHide(); },
})), ((trigger === 'hover' || trigger.includes('hover')) && {
onMouseEnter: function () { return handleShow(); },
onMouseLeave: function () { return handleHide(); },
}))),
React.createElement(CConditionalPortal.CConditionalPortal, { container: container, portal: true }, mounted && (React.createElement("div", tslib_es6.__assign({ className: index.default('popover', 'bs-popover-auto', {
fade: animation,
show: _visible,
}, className), id: id, ref: forkedRef, role: "tooltip" }, rest),
React.createElement("div", { className: "popover-arrow" }),
React.createElement("div", { className: "popover-header" }, title),
React.createElement("div", { className: "popover-body" }, content))))));
});
CPopover.propTypes = {
animation: PropTypes.bool,
children: PropTypes.node,
className: PropTypes.string,
container: PropTypes.any,
content: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
delay: PropTypes.oneOfType([
PropTypes.number,
PropTypes.shape({
show: PropTypes.number.isRequired,
hide: PropTypes.number.isRequired,
}),
]),
fallbackPlacements: props.fallbackPlacementsPropType,
offset: PropTypes.any, // TODO: find good proptype
onHide: PropTypes.func,
onShow: PropTypes.func,
placement: PropTypes.oneOf(['auto', 'top', 'right', 'bottom', 'left']),
popperConfig: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
title: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
trigger: props.triggerPropType,
visible: PropTypes.bool,
};
CPopover.displayName = 'CPopover';
exports.CPopover = CPopover;
//# sourceMappingURL=CPopover.js.map
;