function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _extends() { _extends = Object.assign || 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 _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; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }

function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }

function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }

function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

import React from 'react';
import PropTypes from 'prop-types';
import hoistNonReactStatic from 'hoist-non-react-statics';
import { obj, log } from '../util';
import getContextProps from './get-context-props';
import ErrorBoundary from './error-boundary';
var shallowEqual = obj.shallowEqual;

function getDisplayName(Component) {
  return Component.displayName || Component.name || 'Component';
}

var globalLocales;
var currentGlobalLanguage = 'zh-cn';
var currentGlobalLocale = {};
var currentGlobalRtl;
export function initLocales(locales) {
  globalLocales = locales;

  if (locales) {
    currentGlobalLocale = locales[currentGlobalLanguage];

    if (typeof currentGlobalRtl !== 'boolean') {
      currentGlobalRtl = currentGlobalLocale && currentGlobalLocale.rtl;
    }
  }
}
export function setLanguage(language) {
  if (globalLocales) {
    currentGlobalLanguage = language;
    currentGlobalLocale = globalLocales[language];

    if (typeof currentGlobalRtl !== 'boolean') {
      currentGlobalRtl = currentGlobalLocale && currentGlobalLocale.rtl;
    }
  }
}
export function setLocale(locale) {
  currentGlobalLocale = _objectSpread({}, globalLocales ? globalLocales[currentGlobalLanguage] : {}, {}, locale);

  if (typeof currentGlobalRtl !== 'boolean') {
    currentGlobalRtl = currentGlobalLocale && currentGlobalLocale.rtl;
  }
}
export function setDirection(dir) {
  currentGlobalRtl = dir === 'rtl';
}
export function getLocale() {
  return currentGlobalLocale;
}
export function getLanguage() {
  return currentGlobalLanguage;
}
export function getDirection() {
  return currentGlobalRtl;
}
export function config(Component) {
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

  if (Component.prototype.shouldComponentUpdate === undefined) {
    Component.prototype.shouldComponentUpdate = function shouldComponentUpdate(nextProps, nextState) {
      if (this.props.pure) {
        return !shallowEqual(this.props, nextProps) || !shallowEqual(this.state, nextState);
      }

      return true;
    };
  }

  var ConfigedComponent =
  /*#__PURE__*/
  function (_React$Component) {
    _inherits(ConfigedComponent, _React$Component);

    function ConfigedComponent() {
      var _getPrototypeOf2;

      var _this;

      _classCallCheck(this, ConfigedComponent);

      for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {
        _args[_key] = arguments[_key];
      }

      _this = _possibleConstructorReturn(this, (_getPrototypeOf2 = _getPrototypeOf(ConfigedComponent)).call.apply(_getPrototypeOf2, [this].concat(_args)));

      _defineProperty(_assertThisInitialized(_this), "_getInstance", function (ref) {
        _this._instance = ref;

        if (_this._instance && options.exportNames) {
          options.exportNames.forEach(function (name) {
            var field = _this._instance[name];

            if (typeof field === 'function') {
              _this[name] = field.bind(_this._instance);
            } else {
              _this[name] = field;
            }
          });
        }
      });

      _defineProperty(_assertThisInitialized(_this), "_deprecated", function () {
        if (_this.context.nextWarning !== false) {
          log.deprecated.apply(log, arguments);
        }
      });

      return _this;
    }

    _createClass(ConfigedComponent, [{
      key: "getInstance",
      value: function getInstance() {
        return this._instance;
      }
    }, {
      key: "render",
      value: function render() {
        var _this$props = this.props,
            prefix = _this$props.prefix,
            locale = _this$props.locale,
            pure = _this$props.pure,
            rtl = _this$props.rtl,
            errorBoundary = _this$props.errorBoundary,
            scriptUrl = _this$props.scriptUrl,
            others = _objectWithoutProperties(_this$props, ["prefix", "locale", "pure", "rtl", "errorBoundary", "scriptUrl"]);

        var _this$context = this.context,
            nextPrefix = _this$context.nextPrefix,
            _this$context$nextLoc = _this$context.nextLocale,
            nextLocale = _this$context$nextLoc === void 0 ? {} : _this$context$nextLoc,
            nextPure = _this$context.nextPure,
            nextRtl = _this$context.nextRtl,
            nextErrorBoundary = _this$context.nextErrorBoundary,
            nextScriptUrl = _this$context.nextScriptUrl;
        var displayName = options.componentName || getDisplayName(Component);
        var contextProps = getContextProps({
          prefix: prefix,
          locale: locale,
          pure: pure,
          rtl: rtl,
          errorBoundary: errorBoundary,
          scriptUrl: scriptUrl
        }, {
          nextPrefix: nextPrefix,
          nextLocale: _objectSpread({}, currentGlobalLocale, {}, nextLocale),
          nextPure: nextPure,
          nextRtl: typeof nextRtl === 'boolean' ? nextRtl : currentGlobalRtl === true ? true : undefined,
          nextErrorBoundary: nextErrorBoundary,
          nextScriptUrl: nextScriptUrl
        }, displayName); // errorBoundary is only for <ErrorBoundary>

        var newContextProps = ['prefix', 'locale', 'pure', 'rtl', 'scriptUrl'].reduce(function (ret, name) {
          if (typeof contextProps[name] !== 'undefined') {
            ret[name] = contextProps[name];
          }

          return ret;
        }, {});
        var newOthers = options.transform ? options.transform(others, this._deprecated) : others;
        var content = React.createElement(Component, _extends({}, newOthers, newContextProps, {
          ref: this._getInstance
        }));

        var _contextProps$errorBo = contextProps.errorBoundary,
            open = _contextProps$errorBo.open,
            othersBoundary = _objectWithoutProperties(_contextProps$errorBo, ["open"]);

        return open ? React.createElement(ErrorBoundary, othersBoundary, content) : content;
      }
    }]);

    return ConfigedComponent;
  }(React.Component);

  _defineProperty(ConfigedComponent, "propTypes", _objectSpread({}, Component.propTypes || {}, {
    prefix: PropTypes.string,
    locale: PropTypes.object,
    pure: PropTypes.bool,
    rtl: PropTypes.bool,
    errorBoundary: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),
    scriptUrl: PropTypes.string
  }));

  _defineProperty(ConfigedComponent, "contextTypes", _objectSpread({}, Component.contextTypes || {}, {
    nextPrefix: PropTypes.string,
    nextLocale: PropTypes.object,
    nextPure: PropTypes.bool,
    nextRtl: PropTypes.bool,
    nextWarning: PropTypes.bool,
    nextErrorBoundary: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),
    nextScriptUrl: PropTypes.string
  }));

  ConfigedComponent.displayName = "Config(".concat(getDisplayName(Component), ")");
  hoistNonReactStatic(ConfigedComponent, Component);
  return ConfigedComponent;
}