var _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; };

function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }

import React, { useRef } from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import { mapToCssModules, deprecated, warnOnce, tagPropType } from './Shared/helper.js';

//component - CoreUI / CInput

var CInput = function CInput(props) {
  var tag = props.tag,
      className = props.className,
      cssModule = props.cssModule,
      innerRef = props.innerRef,
      type = props.type,
      bsSize = props.bsSize,
      state = props.state,
      valid = props.valid,
      invalid = props.invalid,
      addon = props.addon,
      staticInput = props.static,
      plaintext = props.plaintext,
      attributes = _objectWithoutProperties(props, ['tag', 'className', 'cssModule', 'innerRef', 'type', 'bsSize', 'state', 'valid', 'invalid', 'addon', 'static', 'plaintext']);

  var fields = useRef({}).current;

  var getRef = function getRef(ref) {
    fields.ref = ref;
    innerRef && innerRef(ref);
  };

  var focus = function focus() {
    if (fields.ref) {
      fields.ref.focus();
    }
  };

  // render

  var checkInput = ['radio', 'checkbox'].indexOf(type) > -1;
  var isNotaNumber = new RegExp('\\D', 'g');

  var fileInput = type === 'file';
  var textareaInput = type === 'textarea';
  var selectInput = type === 'select';
  var Tag = tag || (selectInput || textareaInput ? type : 'input');

  var formControlClass = 'form-control';

  if (plaintext || staticInput) {
    formControlClass = formControlClass + '-plaintext';
    Tag = tag || 'input';
  } else if (fileInput) {
    formControlClass = formControlClass + '-file';
  } else if (checkInput) {
    if (addon) {
      formControlClass = null;
    } else {
      formControlClass = 'form-check-input';
    }
  }

  if (attributes.size && isNotaNumber.test(attributes.size)) {
    warnOnce('Please use the prop "bsSize" instead of the "size" to bootstrap\'s input sizing.');
    bsSize = attributes.size;
    delete attributes.size;
  }

  var classes = mapToCssModules(classNames(className, invalid && 'is-invalid', valid && 'is-valid', bsSize ? 'form-control-' + bsSize : false, formControlClass), cssModule);

  if (Tag === 'input' || tag && typeof tag === 'function') {
    attributes.type = type;
  }

  if (attributes.children && !(plaintext || staticInput || type === 'select' || typeof Tag !== 'string' || Tag === 'select')) {
    warnOnce('Input with a type of "' + type + '" cannot have children. Please use "value"/"defaultValue" instead.');
    delete attributes.children;
  }

  return React.createElement(Tag, _extends({}, attributes, { className: classes, ref: innerRef }));
};

CInput.propTypes = process.env.NODE_ENV !== "production" ? {
  tag: tagPropType,
  children: PropTypes.node,
  className: PropTypes.string,
  cssModule: PropTypes.object,
  //
  innerRef: PropTypes.oneOfType([PropTypes.object, PropTypes.func, PropTypes.string]),
  type: PropTypes.string,
  size: PropTypes.string,
  bsSize: PropTypes.string,
  valid: PropTypes.bool,
  invalid: PropTypes.bool,
  plaintext: PropTypes.bool,
  addon: PropTypes.bool
} : {};

CInput.defaultProps = {
  type: 'text'
};

export default CInput;