UNPKG

zarm

Version:

基于 React 的移动端UI库

236 lines (197 loc) 9.4 kB
"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 _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = _interopRequireWildcard(require("react")); var _bem = require("@zarm-design/bem"); var _reactDomInteractions = require("@floating-ui/react-dom-interactions"); var _transition = _interopRequireDefault(require("../transition")); var _dom = require("../utils/dom"); var _configProvider = require("../config-provider"); var _utils = require("./utils"); var _mergeRefs = _interopRequireDefault(require("../utils/mergeRefs")); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) { if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } } return n.default = e, t && t.set(e, n), n; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } var directionMap = { top: 'top', 'top-left': 'top-start', 'top-right': 'top-end', right: 'right', 'right-top': 'right-start', 'right-bottom': 'right-end', bottom: 'bottom', 'bottom-left': 'bottom-start', 'bottom-right': 'bottom-end', left: 'left', 'left-top': 'left-start', 'left-bottom': 'left-end' }; var Popper = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) { var _React$useContext = _react.default.useContext(_configProvider.ConfigContext), prefixCls = _React$useContext.prefixCls, globalMountContainer = _React$useContext.mountContainer; var visible = props.visible, mountContainer = props.mountContainer, direction = props.direction, destroy = props.destroy, trigger = props.trigger, animationDuration = props.animationDuration, hasArrow = props.hasArrow, animationType = props.animationType, content = props.content, children = props.children, arrowPointAtCenter = props.arrowPointAtCenter, onVisibleChange = props.onVisibleChange; var bem = (0, _bem.createBEM)('popper', { prefixCls: prefixCls }); var isVisible = trigger === 'manual' && visible; var _useState = (0, _react.useState)(isVisible), _useState2 = (0, _slicedToArray2.default)(_useState, 2), open = _useState2[0], setOpen = _useState2[1]; var arrowRef = (0, _react.useRef)(null); var middleware = [(0, _reactDomInteractions.offset)(function (_ref) { var placement = _ref.placement; var _getElementSize = (0, _dom.getElementSize)(arrowRef.current), width = _getElementSize.width, height = _getElementSize.height; var side = placement.split('-')[0]; var value = side === 'bottom' || side === 'top' ? height : width; return value; }), (0, _reactDomInteractions.flip)(), (0, _reactDomInteractions.shift)()]; if (hasArrow) { middleware.push((0, _reactDomInteractions.arrow)({ element: arrowRef })); } var _useFloating = (0, _reactDomInteractions.useFloating)({ open: open, onOpenChange: function onOpenChange(state) { setOpen(state); onVisibleChange === null || onVisibleChange === void 0 ? void 0 : onVisibleChange(state); }, middleware: middleware, placement: directionMap[direction], whileElementsMounted: _reactDomInteractions.autoUpdate }), x = _useFloating.x, y = _useFloating.y, reference = _useFloating.reference, floating = _useFloating.floating, strategy = _useFloating.strategy, context = _useFloating.context, _update = _useFloating.update; (0, _react.useImperativeHandle)(ref, function () { return { update: function update() { _update(); } }; }); function computeArrowStyle(ctx) { var _ctx$middlewareData; var _ref2 = (ctx === null || ctx === void 0 ? void 0 : (_ctx$middlewareData = ctx.middlewareData) === null || _ctx$middlewareData === void 0 ? void 0 : _ctx$middlewareData.arrow) || {}, arrowX = _ref2.x, arrowY = _ref2.y; if (arrowRef.current) { var postion = ctx.placement.split('-'); if (!postion[1] || arrowPointAtCenter) { return { left: x != null ? "".concat(arrowX, "px") : '', top: y != null ? "".concat(arrowY, "px") : '' }; } return {}; } } var _useInteractions = (0, _reactDomInteractions.useInteractions)([(0, _reactDomInteractions.useHover)(context, { restMs: 100, enabled: trigger === 'hover', delay: { open: props.mouseEnterDelay, close: props.mouseLeaveDelay } }), (0, _reactDomInteractions.useClick)(context, { enabled: trigger === 'click' }), (0, _reactDomInteractions.useFocus)(context, { enabled: trigger === 'focus' }), (0, _reactDomInteractions.useDismiss)(context, { enabled: trigger !== 'manual' })]), getReferenceProps = _useInteractions.getReferenceProps, getFloatingProps = _useInteractions.getFloatingProps; var transitionName = (0, _utils.getTransitionName)(prefixCls, directionMap[direction], animationType); (0, _react.useEffect)(function () { setOpen(isVisible); }, [isVisible]); var hidden = function hidden() { setOpen(false); }; var toolTip = /*#__PURE__*/_react.default.createElement(_transition.default, { nodeRef: floating, duration: animationDuration, visible: open, onLeaveEnd: hidden, tranisitionName: transitionName, destroy: destroy }, function (_ref3, setNodeRef) { var style = _ref3.style, className = _ref3.className; return (0, _dom.renderToContainer)(mountContainer !== null && mountContainer !== void 0 ? mountContainer : globalMountContainer, /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({}, getFloatingProps({ ref: setNodeRef, className: bem([(0, _defineProperty2.default)({}, "".concat(direction), true), props.className, className]), style: _objectSpread(_objectSpread(_objectSpread({}, props.style), style), {}, { position: strategy, top: y !== null && y !== void 0 ? y : 0, left: x !== null && x !== void 0 ? x : 0, // animationDuration: `${animationDuration}ms`, transformOrigin: (0, _utils.getTransformOrigin)(context.placement), WebkitTransformOrigin: (0, _utils.getTransformOrigin)(context.placement) }) }), { "data-popper-placement": context.placement }), /*#__PURE__*/_react.default.createElement("div", { className: bem('content') }, content, hasArrow && /*#__PURE__*/_react.default.createElement("span", { className: bem('arrow'), ref: arrowRef, style: computeArrowStyle(context) })))); }); var newRef = (0, _react.useMemo)(function () { return (0, _mergeRefs.default)([reference, children.ref]); }, [reference, children]); var child = /*#__PURE__*/_react.default.isValidElement(children) ? children : /*#__PURE__*/_react.default.createElement("span", null, children); var childrenProps = _objectSpread(_objectSpread({}, children && children.props), trigger === 'contextMenu' && { onContextMenu: function onContextMenu(e) { e.preventDefault(); setOpen(true); } }); return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, toolTip, /*#__PURE__*/(0, _react.cloneElement)(child, getReferenceProps(_objectSpread({ ref: newRef }, childrenProps)))); }); Popper.defaultProps = { hasArrow: false, destroy: false, arrowPointAtCenter: false, trigger: (_dom.canUseDOM && /(iPhone|iPad|iPod|iOS|Android)/i.test(navigator.userAgent) ? 'click' : 'hover') || 'click', direction: 'top', mouseEnterDelay: 150, mouseLeaveDelay: 100, visible: false, animationType: 'zoom-fade', onVisibleChange: function onVisibleChange() {} }; var _default = Popper; exports.default = _default;