diff --git a/lib/FloatingLabel.js b/lib/FloatingLabel.js index 5f96eab..bca5db9 100644 --- a/lib/FloatingLabel.js +++ b/lib/FloatingLabel.js @@ -1,5 +1,6 @@ 'use strict'; -import React, {Component, PropTypes} from "react"; +import React, {Component} from "react"; +import PropTypes from 'prop-types'; import {StyleSheet, Animated} from "react-native"; export default class FloatingLabel extends Component { diff --git a/lib/TextField.js b/lib/TextField.js index d42523a..c40239a 100644 --- a/lib/TextField.js +++ b/lib/TextField.js @@ -1,5 +1,6 @@ 'use strict'; -import React, {Component, PropTypes} from "react"; +import React, {Component} from "react"; +import PropTypes from 'prop-types'; import {View, TextInput, StyleSheet} from "react-native"; import Underline from './Underline'; @@ -13,6 +14,7 @@ export default class TextField extends Component { text: props.value, height: props.height }; + this.calculateHeights = this.calculateHeights.bind(this) } focus() { this.refs.input.focus(); @@ -37,6 +39,14 @@ export default class TextField extends Component { this.setState({height: nextProps.height}); } } + calculateHeights(){ + const { height, minHeight } = this.props; + let inputHeight = this.state.height || minHeight; + inputHeight = inputHeight && height && inputHeight > height ? height : inputHeight; + inputHeight = minHeight && inputHeight < minHeight ? minHeight : inputHeight; + const wrapperHeight = inputHeight + 30 + return { inputHeight, wrapperHeight } + } render() { let { label, @@ -50,7 +60,7 @@ export default class TextField extends Component { onFocus, onBlur, onChangeText, - onChange, + onContentSizeChange, value, dense, inputStyle, @@ -61,8 +71,9 @@ export default class TextField extends Component { multiline, ...props } = this.props; + const heights = this.calculateHeights(); return ( - + { this.setState({isFocused: true}); @@ -88,11 +99,12 @@ export default class TextField extends Component { this.setState({text}); onChangeText && onChangeText(text); }} - onChange={(event) => { - if(autoGrow){ - this.setState({height: event.nativeEvent.contentSize.height}); + onContentSizeChange={(event) => { + const newheight = event.nativeEvent.contentSize.height; + if (autoGrow && (!height || height <= newheight)) { + this.setState({ height: newheight }); } - onChange && onChange(event); + onContentSizeChange && onContentSizeChange(event); }} ref="input" value={this.state.text} @@ -141,7 +153,7 @@ TextField.propTypes = { labelStyle: PropTypes.object, multiline: PropTypes.bool, autoGrow: PropTypes.bool, - height: PropTypes.oneOfType([PropTypes.oneOf(undefined), PropTypes.number]) + height: PropTypes.oneOfType([PropTypes.oneOf([undefined]), PropTypes.number]) }; TextField.defaultProps = { diff --git a/lib/Underline.js b/lib/Underline.js index 4368733..2a2a436 100644 --- a/lib/Underline.js +++ b/lib/Underline.js @@ -1,5 +1,6 @@ 'use strict'; -import React, {Component, PropTypes} from "react"; +import React, {Component} from "react"; +import PropTypes from 'prop-types'; import {View, StyleSheet, Animated} from "react-native"; export default class Underline extends Component {