UNPKG

backpack-ui

Version:
213 lines (168 loc) 6.16 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _getPrototypeOf = require("babel-runtime/core-js/object/get-prototype-of"); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck"); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require("babel-runtime/helpers/createClass"); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require("babel-runtime/helpers/possibleConstructorReturn"); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require("babel-runtime/helpers/inherits"); var _inherits3 = _interopRequireDefault(_inherits2); var _extends2 = require("babel-runtime/helpers/extends"); var _extends3 = _interopRequireDefault(_extends2); var _react = require("react"); var _react2 = _interopRequireDefault(_react); var _propTypes = require("prop-types"); var _propTypes2 = _interopRequireDefault(_propTypes); var _radium = require("radium"); var _radium2 = _interopRequireDefault(_radium); var _propTypes3 = require("../../utils/propTypes"); var _propTypes4 = _interopRequireDefault(_propTypes3); var _input = require("../input"); var _input2 = _interopRequireDefault(_input); var _validReactAttributes = require("../../utils/validReactAttributes"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var styles = (0, _extends3.default)({}, _input2.default.styles, { resize: "vertical" }); var Textarea = function (_React$Component) { (0, _inherits3.default)(Textarea, _React$Component); function Textarea(props) { (0, _classCallCheck3.default)(this, Textarea); var _this = (0, _possibleConstructorReturn3.default)(this, (Textarea.__proto__ || (0, _getPrototypeOf2.default)(Textarea)).call(this, props)); _this.state = { height: _input2.default.height, hideOverflow: true, currentValue: props.value }; _this.onInput = _this.onInput.bind(_this); _this.disableEnterKey = _this.disableEnterKey.bind(_this); _this.autoGrow = _this.autoGrow.bind(_this); _this.handleChange = _this.handleChange.bind(_this); return _this; } (0, _createClass3.default)(Textarea, [{ key: "componentDidMount", value: function componentDidMount() { if (this.props.autofocus) { this.textarea.focus(); } if (this.props.autogrow) { this.autoGrow(); } if (this.props.disableEnter && this.props.autogrow) { document.addEventListener("keydown", this.disableEnterKey); } } }, { key: "shouldComponentUpdate", value: function shouldComponentUpdate(nextProps, nextState) { // eslint-disable-line class-methods-use-this return nextState.height !== nextState.maxHeight; } }, { key: "componentDidUpdate", value: function componentDidUpdate() { if (this.props.disableEnter && this.props.autogrow) { document.addEventListener("keydown", this.disableEnterKey); } else { document.removeEventListener("keydown", this.disableEnterKey); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { if (this.props.autofocus) { this.textarea.blur(); } if (this.props.disableEnter && this.props.autogrow) { document.removeEventListener("keydown", this.disableEnterKey); } } }, { key: "onInput", value: function onInput() { if (this.props.onInput && typeof this.props.onInput === "function") { this.props.onInput(); } if (this.props.autogrow) { this.autoGrow(); } } }, { key: "disableEnterKey", value: function disableEnterKey(event) { var hasFocus = this.textarea === document.activeElement || false; if (hasFocus && event.keyCode === 13) { event.preventDefault(); } } }, { key: "handleChange", value: function handleChange(e) { if (this.props.onChange && typeof this.props.onChange === "function") { this.props.onChange(e); } this.setState({ currentValue: e.target.value }); } }, { key: "autoGrow", value: function autoGrow() { var _this2 = this; var maxHeight = this.props.maxLines * _input2.default.lineHeight + _input2.default.height; this.textarea.style.height = _input2.default.styles.height; this.setState({ height: Math.min(this.textarea.scrollHeight, maxHeight), hideOverflow: Math.min(this.textarea.scrollHeight, maxHeight) < maxHeight }, function () { _this2.textarea.style.height = _this2.state.height + "px"; _this2.textarea.style.overflow = _this2.state.hideOverflow ? "hidden" : null; }); } }, { key: "render", value: function render() { var _this3 = this; var sanitizedProps = (0, _validReactAttributes.validReactAttributes)(this.props); return _react2.default.createElement("textarea", (0, _extends3.default)({}, sanitizedProps, { value: this.state.currentValue, ref: function ref(node) { _this3.textarea = node; }, onInput: this.onInput, onChange: this.handleChange, style: [styles, !this.props.autogrow && { height: "auto" }, this.props.autogrow && { overflow: "hidden", resize: "none" }, this.props.style] })); } }]); return Textarea; }(_react2.default.Component); Textarea.propTypes = { autogrow: _propTypes2.default.bool, autofocus: _propTypes2.default.bool, maxLines: _propTypes2.default.number, onInput: _propTypes2.default.func, disableEnter: _propTypes2.default.bool, style: _propTypes4.default.style, onChange: _propTypes2.default.func, value: _propTypes2.default.string }; Textarea.defaultProps = { autogrow: false, autofocus: false, maxLines: 3, onInput: null, disableEnter: false, style: null, onChange: null }; exports.default = (0, _radium2.default)(Textarea);