/**
 * tdesign v0.46.4
 * (c) 2022 tdesign
 * @license MIT
 */

import Vue from 'vue';
import raf from 'raf';
import { removeDom, getAttach } from '../utils/dom.js';
import popupProps from './props.js';
import 'lodash/isString';
import '../utils/easing.js';

function isContentRectChanged(rect1, rect2) {
  if (!rect1 || !rect2) return;

  if (["width", "height", "x", "y"].some(function (k) {
    return rect1[k] !== rect2[k];
  })) {
    return true;
  }

  return false;
}

function observeResize(elm, cb) {
  var _window;

  if (!((_window = window) !== null && _window !== void 0 && _window.ResizeObserver) || !elm) return;
  var prevContentRect = null;
  var ro = new ResizeObserver(function () {
    var entries = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];

    var _ref = entries[0] || {},
        contentRect = _ref.contentRect;

    if (isContentRectChanged(contentRect, prevContentRect)) {
      prevContentRect = contentRect;
      cb(contentRect);
      return;
    }

    if (!prevContentRect) {
      prevContentRect = contentRect;
    }
  });
  ro.observe(elm);
  return function () {
    ro.unobserve(elm);
  };
}

var Trigger = Vue.extend({
  data: function data() {
    return {
      contentRect: null
    };
  },
  mounted: function mounted() {
    var _this = this;

    this.$on("hook:destroyed", observeResize(this.$el, function (ev) {
      _this.$emit("resize", ev);
    }));
  },
  render: function render() {
    var _children$;

    var h = arguments[0];
    var children = this.$slots["default"] || [];

    if (children.length > 1 || !((_children$ = children[0]) !== null && _children$ !== void 0 && _children$.tag)) {
      return h("span", [children]);
    }

    return children[0];
  }
});
var Container = Vue.extend({
  props: {
    parent: Object,
    visible: Boolean,
    attach: popupProps.attach
  },
  data: function data() {
    return {
      content: null
    };
  },
  mounted: function mounted() {
    var _this2 = this;

    if (this.visible) {
      raf(this.mountContent);
    }

    this.$watch("visible", function (visible) {
      if (visible) {
        _this2.mountContent();
      }
    });
  },
  destroyed: function destroyed() {
    this.unmountContent();
  },
  methods: {
    mountContent: function mountContent() {
      var _this$$refs, _this$$refs$triggerRe;

      var h = this.$createElement;
      if (this.content) return;
      var parent = this;
      var elm = document.createElement("div");
      elm.style.cssText = "position: absolute; top: 0px; left: 0px; width: 100%";
      elm.appendChild(document.createElement("div"));
      this.content = new this.$root.constructor({
        parent: parent,
        render: function render() {
          var h = arguments[0];
          return h("div", [parent.$slots.content]);
        },
        mounted: function mounted() {
          parent.$emit("contentMounted");
          var content = this.$el.children[0];

          if (content) {
            this.$on("hook:destroyed", observeResize(content, function () {
              parent.$emit("resize");
            }));
          }
        },
        destroyed: function destroyed() {
          parent.content = null;
          removeDom(elm);
        }
      });
      getAttach(this.attach, (_this$$refs = this.$refs) === null || _this$$refs === void 0 ? void 0 : (_this$$refs$triggerRe = _this$$refs.triggerRef) === null || _this$$refs$triggerRe === void 0 ? void 0 : _this$$refs$triggerRe.$el).appendChild(elm);
      this.content.$mount(elm.children[0]);
    },
    unmountContent: function unmountContent() {
      var _this$content;

      (_this$content = this.content) === null || _this$content === void 0 ? void 0 : _this$content.$destroy();
    },
    updateContent: function updateContent() {
      var _this$content2;

      (_this$content2 = this.content) === null || _this$content2 === void 0 ? void 0 : _this$content2.$forceUpdate();
    }
  },
  render: function render() {
    var _this3 = this;

    var h = arguments[0];
    return h(Trigger, {
      "ref": "triggerRef",
      "on": {
        "resize": function resize() {
          return _this3.$emit("resize");
        }
      }
    }, [this.$slots["default"]]);
  }
});

export { Container as default };
//# sourceMappingURL=container.js.map
