UNPKG

gui-one-nutui-react-taro

Version:

京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序

245 lines (243 loc) 10.6 kB
import _slicedToArray from "@babel/runtime/helpers/slicedToArray"; import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator"; import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties"; import _defineProperty from "@babel/runtime/helpers/defineProperty"; import _classCallCheck from "@babel/runtime/helpers/classCallCheck"; import _createClass from "@babel/runtime/helpers/createClass"; import _inherits from "@babel/runtime/helpers/inherits"; import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn"; import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf"; import _typeof from "@babel/runtime/helpers/typeof"; var _excluded = ["children", "list", "theme", "location", "visible", "offset", "className", "style", "onClick", "onChoose", "iconClassPrefix", "iconFontClassName"]; import _regeneratorRuntime from "@babel/runtime/regenerator"; 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) { _defineProperty(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; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } import React__default, { useRef, useState, useEffect } from 'react'; import { I as Icon } from './icon.taro-1d0d4fb7.js'; import { O as Overlay } from './overlay.taro-be45fed5.js'; import { g as getRectByTaro } from './useClientRect-bf69d7b3.js'; import { C as ComponentDefaults } from './typings-1c5f2628.js'; /** * 过滤ref */ function fillRef(ref, node) { if (typeof ref === 'function') { ref(node); } else if (_typeof(ref) === 'object' && ref && 'current' in ref) { ref.current = node; } } /** * 将ref合并到一个ref函数中以支持ref传递 */ function composeRef() { for (var _len = arguments.length, refs = new Array(_len), _key = 0; _key < _len; _key++) { refs[_key] = arguments[_key]; } return function (node) { refs.forEach(function (ref) { fillRef(ref, node); }); }; } var Trigger = /*#__PURE__*/function (_React__default$Compo) { _inherits(Trigger, _React__default$Compo); var _super = _createSuper(Trigger); function Trigger() { _classCallCheck(this, Trigger); return _super.apply(this, arguments); } _createClass(Trigger, [{ key: "fireEvents", value: function fireEvents(type, e) { var childCallback = this.props.children.props[type]; if (childCallback) { childCallback(e); } var callback = this.props[type]; if (callback) { callback(e); } } }, { key: "render", value: function render() { var _this$props = this.props, children = _this$props.children, _this$props$className = _this$props.className, className = _this$props$className === void 0 ? '' : _this$props$className; var child = React__default.Children.only(children); var newChildProps = { key: 'trigger' }; if (child && child.props && child.props.className) { newChildProps.className = className; } var cloneProps = _objectSpread({}, newChildProps); cloneProps.ref = composeRef(this.props.forwardedRef, child.ref); var trigger = React__default.cloneElement(child, cloneProps); return trigger; } }]); return Trigger; }(React__default.Component); var defaultProps = _objectSpread(_objectSpread({}, ComponentDefaults), {}, { list: [], theme: 'light', location: 'bottom', visible: false, offset: 20, className: '', onClick: function onClick(e) {}, onChoose: function onChoose(item, index) {} }); var Popover = function Popover(props) { var _defaultProps$props = _objectSpread(_objectSpread({}, defaultProps), props), children = _defaultProps$props.children, list = _defaultProps$props.list, theme = _defaultProps$props.theme, location = _defaultProps$props.location, visible = _defaultProps$props.visible, offset = _defaultProps$props.offset, className = _defaultProps$props.className, style = _defaultProps$props.style, onClick = _defaultProps$props.onClick, onChoose = _defaultProps$props.onChoose, iconClassPrefix = _defaultProps$props.iconClassPrefix, iconFontClassName = _defaultProps$props.iconFontClassName, reset = _objectWithoutProperties(_defaultProps$props, _excluded); var goodItem = useRef(null); setTimeout( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() { var res; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!goodItem.current) { _context.next = 6; break; } _context.next = 3; return getRectByTaro(goodItem.current); case 3: res = _context.sent; setElWidth(res === null || res === void 0 ? void 0 : res.width); setElHeight(res === null || res === void 0 ? void 0 : res.height); case 6: case "end": return _context.stop(); } } }, _callee); }))); var _useState = useState(''), _useState2 = _slicedToArray(_useState, 2), classes = _useState2[0], setClasses = _useState2[1]; var _useState3 = useState(0), _useState4 = _slicedToArray(_useState3, 2), elWidth = _useState4[0], setElWidth = _useState4[1]; var _useState5 = useState(0), _useState6 = _slicedToArray(_useState5, 2), elHeight = _useState6[0], setElHeight = _useState6[1]; var _useState7 = useState(''), _useState8 = _slicedToArray(_useState7, 2), popoverContent = _useState8[0], setPopoverContent = _useState8[1]; var _useState9 = useState(''), _useState10 = _slicedToArray(_useState9, 2), popoverArrow = _useState10[0], setPopoverArrow = _useState10[1]; useEffect(function () { setClasses(classesSelf()); setPopoverContent(popoverContentSelf()); setPopoverArrow(popoverArrowSelf()); }, [list, theme]); var getStyle = function getStyle() { var offNumer = Number(offset) ? Number(offset) : 0; var style = {}; if (location.includes('top')) { style.bottom = "".concat(elHeight + offNumer, "px"); } else if (location.includes('right')) { style.left = "".concat(elWidth + offNumer, "px"); } else if (location.includes('left')) { style.right = "".concat(elWidth + offNumer, "px"); } else { style.top = "".concat(elHeight + offNumer, "px"); } return style; }; var classesSelf = function classesSelf() { var prefixCls = 'nut-popover'; return "".concat(prefixCls, " ").concat(theme ? "".concat(prefixCls, "--").concat(theme) : ''); }; var popoverContentSelf = function popoverContentSelf() { var prefixCls = 'popover-content'; return "".concat(prefixCls, "-show ").concat(prefixCls, " ").concat(location ? "".concat(prefixCls, "--").concat(location) : ''); }; var filter = function filter() { var ms = ['top', 'bottom', 'left', 'right']; return ms.filter(function (m) { return location.includes(m); })[0]; }; var popoverArrowSelf = function popoverArrowSelf() { var prefixCls = 'popover-arrow'; return "".concat(prefixCls, " ").concat(prefixCls, "-").concat(filter(), " ").concat(location ? "".concat(prefixCls, "--").concat(location) : ''); }; var handleClick = function handleClick(e) { if (props.onClick) { props.onClick(e); } }; var handleChoose = function handleChoose(item, index) { if (!item.disabled) { onChoose(item, index); } }; return React__default.createElement(React__default.Fragment, null, React__default.createElement("div", _objectSpread({ className: "".concat(classes, " ").concat(className), style: _objectSpread({}, style) }, reset), React__default.createElement(Trigger, { forwardedRef: goodItem }, React__default.createElement("div", { onClick: function onClick(e) { return handleClick(e); } }, Array.isArray(children) ? children[0] : children, visible ? React__default.createElement("div", { className: "".concat(popoverContent), style: getStyle() }, React__default.createElement("div", { className: "".concat(popoverArrow) }), Array.isArray(children) ? children[1] : '', list.map(function (item, i) { return React__default.createElement("div", { key: item.name, className: "popover-menu-item ".concat(item.disabled ? 'disabled' : ''), onClick: function onClick() { handleChoose(item, i); } }, item.icon ? React__default.createElement(Icon, { classPrefix: iconClassPrefix, fontClassName: iconFontClassName, className: "popover-menu-item-img", name: item.icon }) : '', React__default.createElement("div", { className: "popover-menu-item-name" }, item.name)); })) : null))), visible ? React__default.createElement(Overlay, { visible: visible, onClick: function onClick(e) { return handleClick(e); }, style: { background: 'transparent' } }) : ''); }; Popover.defaultProps = defaultProps; Popover.displayName = 'NutPopover'; export { Popover as P };