@nutui/nutui-react
Version:
京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序
306 lines (305 loc) • 13.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "Popover", {
enumerable: true,
get: function() {
return Popover;
}
});
var _interop_require_default = require("@swc/helpers/_/_interop_require_default");
var _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
var _define_property = require("@swc/helpers/_/_define_property");
var _object_spread = require("@swc/helpers/_/_object_spread");
var _object_spread_props = require("@swc/helpers/_/_object_spread_props");
var _object_without_properties = require("@swc/helpers/_/_object_without_properties");
var _sliced_to_array = require("@swc/helpers/_/_sliced_to_array");
var _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
var _classnames = /*#__PURE__*/ _interop_require_default._(require("classnames"));
var _reactdom = require("react-dom");
var _iconsreact = require("@nutui/icons-react");
var _index = /*#__PURE__*/ _interop_require_default._(require("../popup/index"));
var _getrect = require("../../utils/get-rect");
var _typings = require("../../utils/typings");
var _useclickaway = /*#__PURE__*/ _interop_require_default._(require("../../hooks/use-click-away"));
var _canusedom = require("../../utils/can-use-dom");
var _getscrollparent = require("../../utils/get-scroll-parent");
var _configprovider = require("../configprovider");
var defaultProps = (0, _object_spread_props._)((0, _object_spread._)({}, _typings.ComponentDefaults), {
list: [],
theme: 'light',
location: 'bottom',
visible: false,
offset: [
0,
8
],
arrowOffset: 0,
targetId: '',
showArrow: true,
closeOnOutsideClick: true,
closeOnActionClick: true,
overlay: false,
onClick: function onClick() {},
onOpen: function onOpen() {},
onClose: function onClose() {}
});
var classPrefix = "nut-popover";
var Popover = function Popover(props) {
var rtl = (0, _configprovider.useRtl)();
var _ref = (0, _object_spread._)({}, defaultProps, props), children = _ref.children, list = _ref.list, theme = _ref.theme, location = _ref.location, visible = _ref.visible, offset = _ref.offset, arrowOffset = _ref.arrowOffset, targetId = _ref.targetId, overlay = _ref.overlay, closeOnOutsideClick = _ref.closeOnOutsideClick, closeOnActionClick = _ref.closeOnActionClick, className = _ref.className, showArrow = _ref.showArrow, style = _ref.style, onClick = _ref.onClick, onOpen = _ref.onOpen, onClose = _ref.onClose, onSelect = _ref.onSelect, rest = (0, _object_without_properties._)(_ref, [
"children",
"list",
"theme",
"location",
"visible",
"offset",
"arrowOffset",
"targetId",
"overlay",
"closeOnOutsideClick",
"closeOnActionClick",
"className",
"showArrow",
"style",
"onClick",
"onOpen",
"onClose",
"onSelect"
]);
var popoverRef = (0, _react.useRef)(null);
var popoverContentRef = (0, _react.useRef)(null);
var _useState = (0, _sliced_to_array._)((0, _react.useState)(false), 2), showPopup = _useState[0], setShowPopup = _useState[1];
var _useState1 = (0, _sliced_to_array._)((0, _react.useState)(), 2), wrapperPosition = _useState1[0], setWrapperPosition = _useState1[1];
(0, _react.useEffect)(function() {
setShowPopup(visible);
if (visible) {
setTimeout(function() {
getWrapperPosition();
}, 0);
}
}, [
visible,
location
]);
var update = (0, _react.useRef)(function(e) {
getWrapperPosition();
});
var targetSet = [];
var element = null;
if (_canusedom.canUseDom && targetId) {
element = document.querySelector("#".concat(targetId));
targetSet = [
element,
popoverContentRef.current
];
} else {
targetSet = [
popoverRef.current,
popoverContentRef.current
];
}
var scrollableParents = (0, _react.useMemo)(function() {
return (0, _getscrollparent.getAllScrollableParents)(element || popoverRef.current);
}, [
element,
popoverRef.current
]);
(0, _react.useEffect)(function() {
if (visible) {
scrollableParents.forEach(function(parent) {
parent.addEventListener('scroll', update.current, {
passive: true
});
});
} else {
scrollableParents.forEach(function(parent) {
return parent.removeEventListener('scroll', update.current);
});
}
}, [
visible
]);
(0, _useclickaway.default)(function() {
onClick === null || onClick === void 0 ? void 0 : onClick();
onClose === null || onClose === void 0 ? void 0 : onClose();
}, targetSet, 'touchstart', true, visible, closeOnOutsideClick);
var getWrapperPosition = function getWrapperPosition() {
var rect = (0, _getrect.getRect)(targetId ? document.querySelector("#".concat(targetId)) : popoverRef.current);
var distance = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
var width = rect.width, height = rect.height, right = rect.right, left = rect.left, top = rect.top;
setWrapperPosition({
width: width,
height: height,
left: rtl ? right : left,
top: top + distance,
right: rtl ? left : right
});
};
var classes = (0, _classnames.default)(classPrefix, (0, _define_property._)({}, "".concat(classPrefix, "-").concat(theme), theme === 'dark'), className);
var popoverArrow = function popoverArrow() {
var prefixCls = 'nut-popover-arrow';
var direction = location.split('-')[0];
return "".concat(prefixCls, " ").concat(prefixCls, "-").concat(direction, " ").concat(prefixCls, "-").concat(location);
};
var getPopoverPosition = function getPopoverPosition() {
var _popoverContentRef_current, _popoverContentRef_current1;
var styles = {};
if (!wrapperPosition) {
styles.visibility = 'hidden';
return styles;
}
var popWidth = (_popoverContentRef_current = popoverContentRef.current) === null || _popoverContentRef_current === void 0 ? void 0 : _popoverContentRef_current.clientWidth;
var popHeight = (_popoverContentRef_current1 = popoverContentRef.current) === null || _popoverContentRef_current1 === void 0 ? void 0 : _popoverContentRef_current1.clientHeight;
var width = wrapperPosition.width, height = wrapperPosition.height, left = wrapperPosition.left, top = wrapperPosition.top, right = wrapperPosition.right;
var direction = location.split('-')[0];
var skew = location.split('-')[1];
var cross = 0;
var parallel = 0;
if (Array.isArray(offset) && offset.length === 2) {
var rtloffset = rtl ? -offset[0] : offset[0];
cross += +offset[1];
parallel += +rtloffset;
}
if (width) {
var dir = rtl ? 'right' : 'left';
if ([
'bottom',
'top'
].includes(direction)) {
var h = direction === 'bottom' ? height + cross : -(popHeight + cross);
styles.top = "".concat(top + h, "px");
if (!skew) {
styles[dir] = "".concat(-(popWidth - width) / 2 + wrapperPosition[dir] + parallel, "px");
}
if (skew === 'left') {
styles.left = "".concat(left + parallel, "px");
}
if (skew === 'right') {
styles.left = "".concat(right + parallel, "px");
}
}
if ([
'left',
'right'
].includes(direction)) {
var contentW = direction === 'left' ? -(popWidth + cross) : width + cross;
styles.left = "".concat(left + contentW, "px");
if (!skew) {
styles.top = "".concat(top - popHeight / 2 + height / 2 - 4 + parallel, "px");
}
if (skew === 'top') {
styles.top = "".concat(top + parallel, "px");
}
if (skew === 'bottom') {
styles.top = "".concat(top + height + parallel, "px");
}
}
}
styles.visibility = popWidth === 0 ? 'hidden' : 'initial';
return styles;
};
var popoverArrowStyle = function popoverArrowStyle() {
var styles = {};
var direction = location.split('-')[0];
var skew = location.split('-')[1];
var base = 16;
if (arrowOffset !== 0) {
var dir = rtl ? 'right' : 'left';
var dir2 = rtl ? 'left' : 'right';
if ([
'bottom',
'top'
].includes(direction)) {
if (!skew) {
styles[dir] = "calc(50% + ".concat(arrowOffset, "px)");
}
if (skew === 'left') {
styles[dir] = "".concat(base + arrowOffset, "px");
}
if (skew === 'right') {
styles[dir2] = "".concat(base - arrowOffset, "px");
}
}
if ([
'left',
'right'
].includes(direction)) {
if (!skew) {
styles.top = "calc(50% - ".concat(arrowOffset, "px)");
}
if (skew === 'top') {
styles.top = "".concat(base - arrowOffset, "px");
}
if (skew === 'bottom') {
styles.bottom = "".concat(base + arrowOffset, "px");
}
}
}
return styles;
};
var handleSelect = function handleSelect(item, index) {
if (!item.disabled) {
onSelect === null || onSelect === void 0 ? void 0 : onSelect(item, index);
}
if (closeOnActionClick) {
onClick === null || onClick === void 0 ? void 0 : onClick();
onClose === null || onClose === void 0 ? void 0 : onClose();
}
};
return /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, null, !targetId && /*#__PURE__*/ _react.default.createElement("div", {
className: "nut-popover-wrapper",
ref: popoverRef,
onClick: function onClick1() {
onClick === null || onClick === void 0 ? void 0 : onClick();
if (!visible) {
onOpen === null || onOpen === void 0 ? void 0 : onOpen();
} else {
onClose === null || onClose === void 0 ? void 0 : onClose();
}
},
style: style
}, Array.isArray(children) ? children[0] : children), /*#__PURE__*/ (0, _reactdom.createPortal)(/*#__PURE__*/ _react.default.createElement("div", {
className: classes,
style: (0, _object_spread._)({}, getPopoverPosition(), style)
}, /*#__PURE__*/ _react.default.createElement(_index.default, (0, _object_spread._)({
className: "nut-popover-content nut-popover-content-".concat(location),
visible: showPopup,
overlay: overlay,
position: "none",
lockScroll: false
}, rest), /*#__PURE__*/ _react.default.createElement("div", {
className: "nut-popover-content-group",
ref: popoverContentRef
}, showArrow && /*#__PURE__*/ _react.default.createElement("div", {
className: popoverArrow(),
style: popoverArrowStyle()
}, /*#__PURE__*/ _react.default.createElement(_iconsreact.ArrowRadius, {
width: 8,
height: 4
})), Array.isArray(children) ? children[1] : null, list.map(function(item, index) {
var _item_action;
return /*#__PURE__*/ _react.default.createElement("div", {
className: (0, _classnames.default)({
'nut-popover-item': true,
'nut-popover-item-disabled': item.disabled
}, item.className),
key: item.key || index,
onClick: function onClick() {
return handleSelect(item, index);
}
}, item.icon && /*#__PURE__*/ _react.default.createElement("div", {
className: "nut-popover-item-icon"
}, item.icon), /*#__PURE__*/ _react.default.createElement("div", {
className: "nut-popover-item-name"
}, item.name), ((_item_action = item.action) === null || _item_action === void 0 ? void 0 : _item_action.icon) && /*#__PURE__*/ _react.default.createElement("div", {
className: "nut-popover-item-action-icon",
onClick: function onClick(e) {
var _item_action_onClick, _item_action;
return (_item_action = item.action) === null || _item_action === void 0 ? void 0 : (_item_action_onClick = _item_action.onClick) === null || _item_action_onClick === void 0 ? void 0 : _item_action_onClick.call(_item_action, e);
}
}, item.action.icon));
})))), document.body));
};
Popover.displayName = 'NutPopover';