import _extends from "@babel/runtime/helpers/extends";
import React, { forwardRef } from 'react';
import moment from 'moment';
import { get, set, has } from 'lodash';
function convertProps(props, list, mapper) {
  var out = {};
  list.forEach(function (key) {
    if (has(props, key)) {
      set(out, key, mapper(get(props, key), key));
    }
  });
  return out;
}

/**
 * 简单包装，不做任何处理
 * 部分组件ref比较特殊，包一层会解决这个问题
 */
export function withWrap(Comp) {
  return /*#__PURE__*/forwardRef(function (props, ref) {
    return /*#__PURE__*/React.createElement(Comp, _extends({}, props, {
      ref: ref
    }));
  });
}

/**
 * 某些组件会用React.Children.only检查子节点
 * 需要做处理避免报错
 */
export function withSingleChild(Comp, needsConvert) {
  if (needsConvert === void 0) {
    needsConvert = ['children'];
  }
  return function (props) {
    var convertedProps = convertProps(props, needsConvert, function (prop) {
      var node = React.Children.toArray(prop)[0];
      if (node === null || typeof node !== 'object') {
        node = /*#__PURE__*/React.createElement("div", null, node);
      }
      return node;
    });
    return /*#__PURE__*/React.createElement(Comp, _extends({}, props, convertedProps));
  };
}
export function withSingleFunctionChild(Comp) {
  return function (props) {
    var children = props.children;
    var node;
    if (typeof children === 'function') {
      node = children;
    }
    if (Array.isArray(children) && children.length === 1 && typeof children[0] === 'function') {
      node = children[0];
    }
    if (node) {
      return /*#__PURE__*/React.createElement(Comp, props, node);
    }
    return /*#__PURE__*/React.createElement("div", null, children);
  };
}

/**
 * moment对象在序列化后会被转为字符串
 * 需要让日期类组件支持接受字符串值
 */
export function withMomentProps(Comp, needsConvert) {
  if (needsConvert === void 0) {
    needsConvert = ['value', 'defaultValue'];
  }
  return function (props) {
    var convertedProps = convertProps(props, needsConvert, function (prop) {
      if (prop) {
        if (Array.isArray(prop)) {
          return prop.map(function (v) {
            return moment.isMoment(v) ? v : moment(v);
          });
        }
        return moment.isMoment(prop) ? prop : moment(prop);
      }
    });
    return /*#__PURE__*/React.createElement(Comp, _extends({}, props, convertedProps));
  };
}