import { ComponentPublicInstance } from '@vue/runtime-core';

/**
 *
 * @param {any} origin
 * @returns
 */
export function isComponent(target: any): target is ComponentPublicInstance {
  return !!(target?.$el);
}

/**
 * 兼容火狐浏览器判断是否为元素节点
 * @param {any} element
 * @returns {boolean}
 */
function judgeFireIsElement (element: Element | ComponentPublicInstance | null) {
  const str = Object.prototype.toString.call(element);
  return str.includes('object')&&str.includes('HTML')&&str.includes('Element');
}

/**
 * 提取 Vue Intance 中的元素,如果本身就是元素,直接返回。
 * @param {any} element
 * @returns {Element | null}
 */
export function getElement(
  element: Element | ComponentPublicInstance | null
): Element | null {
  if (element instanceof Element || judgeFireIsElement(element)) {
    return element;
  }
  if (
    element &&
    typeof element === 'object' &&
    (element.$el instanceof Element || judgeFireIsElement(element.$el))
  ) {
    return element.$el;
  }
  return null;
}