Home Reference Source

src/components/controls/PasswordInput/PasswordInput.jsx

import React from 'react';
import { compose, withState, withHandlers } from 'recompose';
import PropTypes from 'prop-types';
import cn from 'classnames';
import Input from '../Input/Input';
import { Button } from 'reactstrap';

/**
 * Контрол Input для паролей
 * @reactProps {boolean} length - максимальная длина значения
 * @reactProps {string} value - значение поля
 * @reactProps {string} placeholder - плэйсхолдер
 * @reactProps {boolean} disabled - флаг неактивности поля
 * @reactProps {boolean} disabled - флаг только для чтения
 * @reactProps {function} onFocus - callback на фокус
 * @reactProps {function} onPaste - callback при вставке в инпут
 * @reactProps {function} onBlur - callback при блюре инпута
 * @reactProps {function} onChange - callback при изменение инпута
 * @reactProps {function} onKeyDown - callback при нажатии на кнопку клавиатуры
 * @reactProps {boolean} autoFocus - флаг автофокуса
 * @reactProps {string} className - css-класс
 * @reactProps {object} style - объект стилей
 * @reactProps {string} type - тип поля
 * @reactProps {boolean} showPasswordBtn - кнопка показа пароля
 */

function PasswordInput({
  className,
  length,
  style,
  autoFocus,
  value,
  placeholder,
  disabled,
  onPaste,
  onFocus,
  onBlur,
  onKeyDown,
  onChange,
  onToggleShowPass,
  showPass,
}) {
  return (
    <div className="n2o-input-password">
      <Input
        maxLength={length}
        className={cn(['form-control', { [className]: className }])}
        type={showPass ? 'text' : 'password'}
        style={style}
        autoFocus={autoFocus}
        value={value == null ? '' : value}
        placeholder={placeholder}
        disabled={disabled}
        onPaste={onPaste}
        onFocus={onFocus}
        onBlur={onBlur}
        onKeyDown={onKeyDown}
        onChange={onChange}
      />
      <Button
        className={cn('n2o-input-password-toggler', {
          'n2o-input-password-toggler--active': showPass,
        })}
        onClick={onToggleShowPass}
        size="sm"
        color="link"
      >
        <i className="fa fa-eye" />
      </Button>
    </div>
  );
}

PasswordInput.propTypes = {
  value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
  disabled: PropTypes.bool,
  onFocus: PropTypes.func,
  onPaste: PropTypes.func,
  obBlur: PropTypes.func,
  onKeyDown: PropTypes.func,
  className: PropTypes.string,
  style: PropTypes.object,
  placeholder: PropTypes.string,
  onChange: PropTypes.func,
  length: PropTypes.string,
  type: PropTypes.string,
  autoFocus: PropTypes.bool,
  showPasswordBtn: PropTypes.bool,
};

PasswordInput.defaultProps = {
  onChange: () => {},
  className: '',
  disabled: false,
  autoFocus: false,
  showPasswordBtn: true,
};

export default compose(
  withState('showPass', 'setShowPass', false),
  withHandlers({
    onToggleShowPass: ({ showPass, setShowPass }) => () =>
      setShowPass(!showPass),
  })
)(PasswordInput);