var _excluded = ["animation", "style", "referenceDOM", "children", "onVisibleChange"];
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
import React, { forwardRef, useRef, useEffect, useImperativeHandle, useState } from 'react';
import Popup from "./Popup";
import updatePositionByReferenceDOM from "./api/updatePositionByReferenceDOM";
var Tooltip = /*#__PURE__*/forwardRef(function (_ref, ref) {
  var _ref$animation = _ref.animation,
    animation = _ref$animation === void 0 ? 'slideDownLeft' : _ref$animation,
    style = _ref.style,
    externalReferenceDOM = _ref.referenceDOM,
    children = _ref.children,
    onVisibleChange = _ref.onVisibleChange,
    props = _objectWithoutProperties(_ref, _excluded);
  var rootRef = useRef(null);
  var childrenRef = useRef(null);
  useImperativeHandle(ref, function () {
    return {
      rootDOM: rootRef.current,
      getRootDOM: function getRootDOM() {
        return rootRef.current;
      }
    };
  });

  // 非受控显隐
  var _useState = useState(null),
    _useState2 = _slicedToArray(_useState, 2),
    visible = _useState2[0],
    setVisible = _useState2[1];

  // 受控显隐时, 需要更新容器位置
  useEffect(function () {
    if (visible) {
      updatePosition();
    }
    if (visible === null) return;
    typeof onVisibleChange === 'function' && onVisibleChange(visible);
  }, [visible]); // eslint-disable-line

  // 更新位置
  function updatePosition(argReferenceDOM) {
    var _rootRef$current, _rootRef$current2, _rootRef$current3;
    // 参考元素
    var referenceDOM = typeof externalReferenceDOM === 'function' ? externalReferenceDOM() : externalReferenceDOM;
    if (argReferenceDOM) {
      referenceDOM = argReferenceDOM;
    }
    if (!referenceDOM) {
      var _childrenRef$current;
      var childrenDOM = childrenRef.current;
      if (typeof ((_childrenRef$current = childrenRef.current) === null || _childrenRef$current === void 0 ? void 0 : _childrenRef$current.getRootDOM) === 'function') {
        childrenDOM = childrenRef.current.getRootDOM();
      }
      referenceDOM = childrenDOM;
    }

    // 位移元素
    var tooltipDOM = rootRef !== null && rootRef !== void 0 && (_rootRef$current = rootRef.current) !== null && _rootRef$current !== void 0 && _rootRef$current.children && rootRef !== null && rootRef !== void 0 && (_rootRef$current2 = rootRef.current) !== null && _rootRef$current2 !== void 0 && _rootRef$current2.children[0] ? rootRef === null || rootRef === void 0 || (_rootRef$current3 = rootRef.current) === null || _rootRef$current3 === void 0 ? void 0 : _rootRef$current3.children[0] : null;
    if (referenceDOM && tooltipDOM) {
      // 没有自定义位置时生效
      if (!(style !== null && style !== void 0 && style.left) && !(style !== null && style !== void 0 && style.top) && !(style !== null && style !== void 0 && style.right) && !(style !== null && style !== void 0 && style.bottom)) {
        updatePositionByReferenceDOM(tooltipDOM, {
          referenceDOM: referenceDOM,
          animation: animation,
          offset: {
            top: 8,
            bottom: 8
          }
        });
      }
    }
  }

  // 非受控显隐, 为子元素增加点击事件显隐
  var newChildren = React.Children.toArray(children);
  if (newChildren.length === 1) {
    newChildren = /*#__PURE__*/React.cloneElement(children, {
      ref: childrenRef,
      onClick: function onClick(e) {
        // 没有自定义位置时生效
        if (!(style !== null && style !== void 0 && style.left) && !(style !== null && style !== void 0 && style.top) && !(style !== null && style !== void 0 && style.right) && !(style !== null && style !== void 0 && style.bottom)) {
          updatePosition(e.currentTarget);
        }
        setVisible(!visible);
      }
    });
  } else {
    newChildren = children;
  }
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Popup, _extends({
    animation: animation,
    style: style,
    visible: typeof visible === 'boolean' ? visible : visible,
    onVisibleChange: function onVisibleChange(newVisible) {
      if (!newVisible) {
        setVisible(newVisible);
      }
    }
  }, props, {
    ref: rootRef
  })), newChildren);
});
export default Tooltip;