react-native-1app
Version:
473 lines (436 loc) • 13.3 kB
JavaScript
'use strict';
import React, { Component } from 'react';
import { StyleSheet, Platform, TextInput, View, Text } from 'react-native';
export default class ApiTextInput extends Component {
constructor(props) {
super(props);
this.state = { mascara: null, text: "", isUpdatingMascara: false, limit: 0, height: 30 };
if (props.defaultValue) {
this.state.text = props.defaultValue;
}
if (props.value) {
this.state.text = props.value;
}
if (props.mascara) {
this.state.mascara = props.mascara;
}
if (props.mask) {
this.state.mascara = props.mask;
this.state.limit = props.mask.length;
}
if (props.limit) {
this.state.limit = props.limit;
}
this.styles = this.tratarStyle(props); //
}
shouldComponentUpdate(nextProps, nextState) {
if (nextProps != this.props) {
if (nextProps.value || nextProps.value + "" == "0") {
nextState.text = nextProps.value + "";
} else {
nextState.text = "";
}
// this.styles = this.tratarStyle(nextProps) ;//
}
return true;
}
focus() {
this.input.focus();
}
onSubmitEditing(onSubmitEditing) {
this.onSubmitEditingFunction = onSubmitEditing;
}
onChange(onChange) {
this.onChangeFunction = onChange;
}
getValue() {
return this.state.text;
}
setValue(text) {
if (!text) {
text = "";
}
this.setState({ text: text });
this.input.setNativeProps({
text: text
});
}
setMascara(value) {
// this.state.mascara = value;
this.setState({ mascara: value });
}
setLimit(limit) {
this.state.limit = parseInt(limit + "");
this.setState(this.state);
}
componentDidMount() {
if (this.props.mascara) {
this.state.mascara = this.props.mascara;
}
}
mask(text) {
// console.log(text);
if (this.props.mask) {
this.state.mascara = this.props.mask;
}
var mascara = this.state.mascara;
this.state.text = text;
// if (this.props.activity && this.props.tag) {
// this.props.activity.state[this.props.tag]= text;
// }
// console.log(this.state);
if (!this.state.mascara || this.state.mascara == "") {
return text;
}
var formattedString = text;
var nova = text;
if (mascara && formattedString) {
for (var i = 0; i < mascara.length; i++) {
var pos = mascara.charAt(i);
// console.log(formattedString);
if (formattedString.length > i) {
var mas = formattedString.charAt(i);
// console.log("mas:"+mas+" pos:"+pos+" index:"+i);
if (pos === mas || pos !== '-' && pos !== ' ' && pos !== '(' && pos !== ')' && pos !== '/' && pos !== '.' && pos !== ':') {
// console.log("coninuou");
continue;
} else {
var prefixo = formattedString.substring(0, i);
var sufixo = formattedString.substring(i, formattedString.length);
// console.log("mas:"+mas+" pos:"+pos+" p:"+prefixo+" s:"+sufixo+" index:"+i);
formattedString = prefixo + pos + sufixo;
}
}
}
}
var limit = this.state.limit;
if (formattedString.length > limit && limit > 0) {
formattedString = formattedString.substring(0, limit);
}
this.state.text = formattedString;
// this.setState(this.state);
// this.input.setNativeProps({
// text: formattedString
// });
return formattedString;
}
limparNumero(string) {
try {
string = string + "";
// console.log(string);"de33sl".replace(/[^,.,0-9]/g, '')
var val = string.replace(',', '.');
val = val.replace(/[^,-.,0-9]/g, '');
return val;
} catch (e) {
// console.log(e);
return "0";
}
}
parse(text) {
// console.log(text +" "+this.props.type);
if (!text || text == "") {
return "";
}
if (this.state.mascara || this.props.mask) {
return text;
}
var type = "";
if (this.props.keyboardType) {
type = this.props.keyboardType;
}
if (this.props.type) {
type = this.props.type;
}
if (type == "numero" || type == "numeric") {
text = this.limparNumero(text);
} else if (type == "integer") {
text = ApiUteis.parseNumeroIntero(text);
} else if (type == "money") {
text = this.limparNumero(text);
} else if (type == "float") {
text = this.limparNumero(text);
}
// console.log(text);
return text;
}
parseForce(text) {
// console.log(text +" "+this.props.type);
if (!text || text == "") {
return "";
}
if (this.state.mascara || this.props.mask) {
return text;
}
var type = "";
if (this.props.keyboardType) {
type = this.props.keyboardType;
}
if (this.props.type) {
type = this.props.type;
}
if (type == "numero" || type == "numeric") {
text = Number(text);
} else if (type == "integer") {
text = ApiUteis.parseNumeroIntero(text);
} else if (type == "money") {
text = Number(text);;
} else if (type == "float") {
text = Number(text);;
}
// console.log(text);
return text;
}
render() {
let keyboardType = "default";
if (this.props.keyboardType) {
keyboardType = this.props.keyboardType != "text" && this.props.keyboardType != "default" ? "numeric" : null;
}
let multiline = false;
if (this.props.multiline) {
multiline = this.props.multiline;
}
let numberOfLines = 1;
if (this.props.numberOfLines) {
numberOfLines = this.props.numberOfLines;
}
var placeholder = "";
if (this.props.placeholder) {
placeholder = this.props.placeholder;
}
if (this.props.keyboardType == "money" && this.state.text) {
this.state.text = (this.state.text + "").replace(".", ",");
}
if (this.props.mask) {
this.state.limit = this.props.mask.length;
}
if (this.props.disabled) {
return React.createElement(
View,
{ style: [this.styles.view, this.styles.boxDisable] },
this.props.label ? React.createElement(
Text,
{ style: this.styles.label },
this.props.label
) : null,
React.createElement(
Text,
{ style: [this.styles.text, this.styles.styleInput] },
this.state.text
)
);
}
// {
// borderBottomColor :"#ccc",
// borderTopWidth :0,
// borderLeftWidth:0,
// borderRightWidth:0,
// borderBottomWidth :1,
// borderStyle :"solid",
// margin:0,padding:0,
// marginBottom:2,
// // backgroundColor:"#000",
// }
// console.log(this.state);
return React.createElement(
View,
{ style: [this.styles.view, this.styles.box] },
this.props.label ? React.createElement(
Text,
{ style: [this.styles.label, { backgroundColor: "rgba(0,0,0,0)" }] },
this.props.label
) : null,
React.createElement(TextInput, { placeholder: this.props.placeholder, onFocus: this.props.onFocus, secureTextEntry: this.props.secureTextEntry,
underlineColorAndroid: "rgba(0,0,0,0)",
multiline: multiline, numberOfLines: numberOfLines,
autoCorrect: false,
onEndEditing: () => {},
style: [this.styles.styleInput, { height: Math.max(30, this.state.height) }],
onChange: event => {
try {
if (event.nativeEvent && event.nativeEvent.contentSize) {
var h = event.nativeEvent.contentSize.height + 2;
if (h < 30) {
h = 30;
}
this.setState({ height: h });
}
} catch (e) {}
//console.log( event.nativeEvent.contentSize);
},
onContentSizeChange: event => {
var h = event.nativeEvent.contentSize.height + 2;
if (h < 30) {
h = 30;
}
this.setState({ height: h });
},
autoCapitalize: "sentences",
keyboardType: keyboardType, disabled: true,
onBlur: () => {
{
var text = this.state.text;
if (this.state.text != "") {
text = this.mask(this.state.text);
if (text.length > this.state.limit && this.state.limit > 0) {
text = text.substring(0, this.state.limit);
}
text = this.parse(text);
}
if (this.props.onChange) {
this.props.onChange(text);
}
if (this.onChangeFunction) {
this.onChangeFunction(text);
}
if (this.onBlur) {
this.onBlur(text);
}
}
},
onSubmitEditing: () => {
var text = this.state.text;
if (this.state.text != "") {
text = this.mask(this.state.text);
if (text.length > this.state.limit && this.state.limit > 0) {
text = text.substring(0, this.state.limit);
}
text = this.parse(text);
}
if (this.props.onChange) {
this.props.onChange(text);
}
if (this.onChangeFunction) {
this.onChangeFunction(text);
}
if (this.props.onSubmitEditing) {
this.props.onSubmitEditing();
}
if (this.onSubmitEditingFunction) {
this.onSubmitEditingFunction();
}
},
value: this.state.text ? this.state.text + "" : "",
autoFocus: false,
placeholderTextColor: "#777777",
onChangeText: text => {
if (text != "") {
text = this.parse(text);
text = this.mask(text);
if (this.props.keyboardType && this.props.keyboardType != "text") {
if (text.length > this.state.limit && this.state.limit > 0) {
text = text.substring(0, this.state.limit);
}
}
if (text.length > this.state.limit && this.state.limit > 0) {
text = text.substring(0, this.state.limit);
}
}
this.setState({ text: text });
if (this.props.onChangeText) {
this.props.onChangeText(text);
}
if (this.props.onChange) {
this.props.onChange(text);
}
if (this.onChangeFunction) {
this.onChangeFunction(text);
}
}, ref: input => this.input = input
})
);
}
tratarStyle(props) {
var style = {};
if (props.style) {
var lista = [];
if (Array === props.style.constructor) {
lista = props.style;
} else {
lista.push(props.style);
}
if (props.superStyle && typeof props.superStyle === "object") {
lista.push(props.superStyle);
}
for (var a = 0; a < lista.length; a++) {
var st = lista[a];
if (typeof st === "object" && st !== null) {
//nada
} else if (st) {
st = StyleSheet.flatten(props.style);
} else if (!st) {
continue;
}
var tags = Object.keys(st);
for (var i = 0; i < tags.length; i++) {
style[tags[i]] = st[tags[i]];
}
}
}
var textColor = "#000000";
var fontSize = 14;
var textAlign = "left";
if (style.fontSize) {
fontSize = style.fontSize;
}
if (style.textAlign) {
textAlign = style.textAlign;
}
if (this.props.textColor) {
textColor = this.props.textColor;
} else if (style.color) {
textColor = style.color;
delete style.color;
}
var styleLabel = {};
if (this.props.styleLabel) {
styleLabel = this.props.styleLabel;
}
var styleInput = {
// flex:1,
"alignSelf": "stretch",
color: textColor,
textAlign: textAlign,
fontSize: fontSize,
// padding:0,
// paddingLeft:5,
paddingBottom: 3,
marginLeft: -3,
marginBottom: 0,
paddingTop: 0,
// borderWidth :0,
// borderColor :"rgba(0,0,0,1)",
// borderStyle :"solid",
minHeight: 30,
backgroundColor: "rgba(0,0,0,0)"
};
//secureTextEntry={this.props.secureTextEntry} keyboardType={this.props.keyboardType}
if (Platform.OS === 'android') {
styleInput.marginBottom = -5;
} else {
styleInput.marginLeft = 0;
styleInput.paddingBottom = 0;
}
style.paddingTop = 5;
style.borderBottomColor = "#ccc";
style.borderTopWidth = 0;
style.borderLeftWidth = 0;
style.borderRightWidth = 0;
style.borderBottomWidth = 1;
style.borderStyle = "solid";
var textColor = style.color;
var text = { color: textColor, marginLeft: 0 };
delete style.height;
delete style.color;
delete style.fontSize;
delete style.fontFamily;
delete style.textAlign;
return StyleSheet.create({
text: text,
view: style,
styleInput: styleInput,
label: { fontSize: 11, padding: 0, margin: 0, marginBottom: 0, color: "#999", textAlign: textAlign },
box: { flexDirection: "column", paddingTop: 0, paddingBottom: 0 },
boxDisable: { padding: 5, flexDirection: "column" }
});
}
}