"use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;exports.__esModule = true;exports.getSafeMaskInputType = exports.MaskedInput = void 0;var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));var _react = _interopRequireWildcard(require("react"));



var _forwardRefAndName = require("../../lib/forwardRefAndName");
var _Emotion = require("../../lib/theming/Emotion");

var _Input = require("../Input");
var _identifiers = require("../../lib/events/keyboard/identifiers");
var _ThemeContext = require("../../lib/theming/ThemeContext");

var _MaskedInput = require("./MaskedInput.styles");
var _MaskedInput2 = require("./MaskedInput.helpers");
var _ColorableInputElement = require("./ColorableInputElement");
var _FixedIMaskInput = require("./FixedIMaskInput");var _excluded = ["mask", "maskChar", "formatChars", "alwaysShowMask", "colored", "imaskProps", "unmask", "onValueChange", "onUnexpectedInput", "onChange", "onBeforePasteValue", "element", "className", "maxLength"];

























































var getSafeMaskInputType = exports.getSafeMaskInputType = function getSafeMaskInputType(type) {
  if (!type) {
    return type;
  }

  switch (type) {
    case 'number':
    case 'date':
    case 'time':
    case 'password':
      return 'text';
    default:
      return type;
  }
};










/** Поле ввода, которое ограничивает формат вводимого значения по заданной маске. Такое поле облегчает пользователю ввод и снижает количество ошибок.
 */
var MaskedInput = exports.MaskedInput = (0, _forwardRefAndName.forwardRefAndName)(
  'MaskedInput',
  function MaskedInput(props, ref) {
    var
      mask =















      props.mask,maskChar = props.maskChar,formatChars = props.formatChars,_props$alwaysShowMask = props.alwaysShowMask,alwaysShowMask = _props$alwaysShowMask === void 0 ? false : _props$alwaysShowMask,_props$colored = props.colored,colored = _props$colored === void 0 ? true : _props$colored,_props$imaskProps = props.imaskProps,customIMaskProps = _props$imaskProps === void 0 ? {} : _props$imaskProps,_props$unmask = props.unmask,unmask = _props$unmask === void 0 ? false : _props$unmask,onValueChange = props.onValueChange,onUnexpectedInput = props.onUnexpectedInput,onChange = props.onChange,onBeforePasteValue = props.onBeforePasteValue,element = props.element,className = props.className,maxLength = props.maxLength,inputProps = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
    var theme = (0, _react.useContext)(_ThemeContext.ThemeContext);

    var inputRef = (0, _react.useRef)(null);

    var _useState = (0, _react.useState)(false),focused = _useState[0],setFocused = _useState[1];
    var prevValue = (0, _react.useRef)(props.value || String(props.defaultValue) || '');
    var prevSelectionStart = (0, _react.useRef)(null);

    (0, _react.useImperativeHandle)(
      ref,
      function () {return (
          inputRef.current &&
          Object.assign(inputRef.current, {
            selectAll: function selectAll() {var _inputRef$current, _inputRef$current2;
              (_inputRef$current = inputRef.current) == null || _inputRef$current.focus();
              (_inputRef$current2 = inputRef.current) == null || _inputRef$current2.delaySelectAll();
            }
          }));},
      []
    );

    (0, _react.useEffect)(function () {var _inputRef$current3;
      // Для корректной работы onUnexpectedInput надо знать предыдущий value,
      // но imask при монтировании не вызывает onAccept, если value невалиден или laze=false.
      // Поэтому актуальный value при монтировании надо получать вручную
      if ((_inputRef$current3 = inputRef.current) != null && _inputRef$current3.input) {
        prevValue.current = inputRef.current.input.value;
        prevSelectionStart.current = inputRef.current.input.selectionStart;
      }
    }, []);

    var imaskProps = getCompatibleIMaskProps();

    // TODO: Удалить в следующем мажоре
    // Селекторы могут ожидать определённый порядок классов
    var uiFontGlobalClassesRoot = 'react-ui-ui-font-root';

    return /*#__PURE__*/(
      _react.default.createElement(_Input.Input, (0, _extends2.default)({
        ref: inputRef },
      inputProps, {
        onFocus: handleFocus,
        onBlur: handleBlur,
        onInput: handleInput,
        onKeyDown: handleKeyDown,
        onPaste: handlePaste,
        className: (0, _Emotion.cx)(_MaskedInput.globalClasses.root, uiFontGlobalClassesRoot, className, _MaskedInput.styles.root(theme)),
        element:
        colored ? /*#__PURE__*/
        _react.default.createElement(_ColorableInputElement.ColorableInputElement, { showOnFocus: false, alwaysShowMask: alwaysShowMask }, /*#__PURE__*/
        _react.default.createElement(_FixedIMaskInput.FixedIMaskInput, (0, _extends2.default)({}, imaskProps, { onAccept: handleAccept }))
        ) : /*#__PURE__*/

        _react.default.createElement(_FixedIMaskInput.FixedIMaskInput, (0, _extends2.default)({}, imaskProps, { onAccept: handleAccept })) })


      ));


    function handlePaste(event) {
      if (onBeforePasteValue && onValueChange) {var _event$clipboardData$, _event$clipboardData;
        event.preventDefault();
        onValueChange == null || onValueChange(onBeforePasteValue((_event$clipboardData$ = (_event$clipboardData = event.clipboardData) == null ? void 0 : _event$clipboardData.getData('text')) != null ? _event$clipboardData$ : ''));
      }

      props.onPaste == null || props.onPaste(event);
    }

    function getCompatibleIMaskProps() {
      return (0, _extends2.default)({
        mask: mask.replace(/0/g, '{\\0}'),
        placeholderChar: (0, _MaskedInput2.getMaskChar)(maskChar),
        definitions: (0, _MaskedInput2.getDefinitions)(formatChars),
        // FIXME: Должно быть eager=true, но в imask ломается удаление по delete
        eager: 'append',
        overwrite: 'shift',
        lazy: !alwaysShowMask && (props.disabled || !focused),
        unmask: unmask },
      customIMaskProps);

    }

    function handleAccept() {for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {args[_key] = arguments[_key];}
      var value = args[0],e = args[2];

      // Метод onAccept может вызываться при монтировании, если не задан проп defaultValue.
      // Но нативный input никогда не вызывает onChange при монтировании.
      // Наше событие onValueChange в Input вывается в тех же случаях, что и нативный onChange,
      // поэтому чтобы сохранить консинстентность будем ориентироваться на наличие аргумента e.
      // Он содержит нативное событие, вызвавшее изменение.
      e && (onValueChange == null ? void 0 : onValueChange(value));
      !e && (prevValue.current = value);
    }

    /**
     * Отслеживаем неожиданные нажатия
     * handleAccept не вызывается когда значение с маской не меняется
     * Сначала вызывается handleAccept, затем handleInput
     */
    function handleInput(e) {
      var _e$currentTarget = e.currentTarget,value = _e$currentTarget.value,selectionStart = _e$currentTarget.selectionStart;

      // При вводе неожиданных символов или удалении каретка может перепрыгивать фиксированные символы.
      // Такие случаи не расцениваем как неожиданный ввод, т.к. пользователь может намеренно их вводить.
      if (prevValue.current === value && selectionStart === prevSelectionStart.current) {
        handleUnexpectedInput(value);
      }
      prevValue.current = value;
      prevSelectionStart.current = selectionStart;

      props.onInput == null || props.onInput(e);
    }

    function handleFocus(e) {var _inputRef$current4;
      setFocused(true);
      props.onFocus == null || props.onFocus(e);

      // Если value из пропсов отличается от value, которое получит input после обработки,
      // то imask будет ставить каретку за последним валидным символом.
      props.selectAllOnFocus && ((_inputRef$current4 = inputRef.current) == null ? void 0 : _inputRef$current4.delaySelectAll());
    }

    function handleUnexpectedInput(value) {var _inputRef$current5;
      var blink = ((_inputRef$current5 = inputRef.current) == null ? void 0 : _inputRef$current5.blink.bind(inputRef.current)) || function () {return undefined;};
      onUnexpectedInput ? onUnexpectedInput(value, blink) : blink();
    }

    function handleBlur(e) {
      setFocused(false);
      props.onBlur == null || props.onBlur(e);
    }

    function handleKeyDown(e) {
      var _e$currentTarget2 = e.currentTarget,value = _e$currentTarget2.value,selectionStart = _e$currentTarget2.selectionStart,selectionEnd = _e$currentTarget2.selectionEnd;

      if (
      (0, _identifiers.isKeyBackspace)(e) && selectionStart === 0 && selectionEnd === 0 ||
      (0, _identifiers.isKeyDelete)(e) && prevSelectionStart.current === value.length)
      {
        // Случаи, когда нажатие клавиш не тригерит `onInput`
        handleUnexpectedInput(value);
        prevValue.current = e.currentTarget.value;
      }
      prevSelectionStart.current = selectionStart;

      props.onKeyDown == null || props.onKeyDown(e);
    }
  }
);