rn-material-ui-textfield
Version:
122 lines (102 loc) • 2.73 kB
JavaScript
import PropTypes from 'prop-types';
import React, { PureComponent } from 'react';
import { Animated } from 'react-native';
import { TextPropTypes } from 'deprecated-react-native-prop-types';
import styles from './styles';
export default class Label extends PureComponent {
static defaultProps = {
numberOfLines: 1,
disabled: false,
restricted: false,
};
static propTypes = {
numberOfLines: PropTypes.number,
disabled: PropTypes.bool,
restricted: PropTypes.bool,
fontSize: PropTypes.number.isRequired,
activeFontSize: PropTypes.number.isRequired,
baseColor: PropTypes.string.isRequired,
tintColor: PropTypes.string.isRequired,
errorColor: PropTypes.string.isRequired,
focusAnimation: PropTypes.instanceOf(Animated.Value).isRequired,
labelAnimation: PropTypes.instanceOf(Animated.Value).isRequired,
contentInset: PropTypes.shape({
label: PropTypes.number,
}),
offset: PropTypes.shape({
x0: PropTypes.number,
y0: PropTypes.number,
x1: PropTypes.number,
y1: PropTypes.number,
}),
style: TextPropTypes.style,
label: PropTypes.string,
};
render() {
let {
label,
offset,
disabled,
restricted,
fontSize,
activeFontSize,
contentInset,
errorColor,
baseColor,
tintColor,
style,
focusAnimation,
labelAnimation,
...props
} = this.props;
if (label == null) {
return null;
}
let color = disabled
? baseColor
: restricted
? errorColor
: focusAnimation.interpolate({
inputRange: [-1, 0, 1],
outputRange: [errorColor, baseColor, tintColor],
});
let textStyle = {
lineHeight: (style && style.lineHeight) || fontSize,
fontSize,
color,
};
let { x0, y0, x1, y1 } = offset;
y0 += activeFontSize;
y0 += contentInset.label;
y0 += fontSize * 0.25;
let containerStyle = {
transform: [
{
scale: labelAnimation.interpolate({
inputRange: [0, 1],
outputRange: [1, activeFontSize / fontSize],
}),
},
{
translateY: labelAnimation.interpolate({
inputRange: [0, 1],
outputRange: [y0, y1],
}),
},
{
translateX: labelAnimation.interpolate({
inputRange: [0, 1],
outputRange: [x0, x1],
}),
},
],
};
return (
<Animated.View style={[styles.container, containerStyle]}>
<Animated.Text style={[styles.text, style, textStyle]} {...props}>
{label}
</Animated.Text>
</Animated.View>
);
}
}