Página da disciplina de pos (Programação Orientada a Serviços) do curso técnico integrado de Informática para Internet.
Objetivos:
observação TouchableHighlight vs TouchableOpacity
app/components/TextInput/index.js
import InputWithButton from './InputWithButton';
import styles from './styles';
export { InputWithButton, styles };
app/components/TextInput/InputWithButton.js
import PropTypes from 'prop-types';
import React from 'react';
import { View, TextInput, TouchableHighlight, Text } from 'react-native';
import color from 'color';
import styles from './styles';
const InputWithButton = (props) => {
const underlayColor = color(styles.$buttonBackgroundColorBase).darken(
styles.$buttonBackgroundColorModifier,
);
const containerStyles = [styles.container];
if (props.editable === false) {
containerStyles.push(styles.containerDisabled);
}
return (
<View style={containerStyles}>
<TouchableHighlight
onPress={props.onPress}
style={styles.buttonContainer}
underlayColor={underlayColor}
>
<Text style={styles.buttonText}>{props.buttonText}</Text>
</TouchableHighlight>
<View style={styles.separator} />
<TextInput style={styles.input} underlineColorAndroid="transparent" {...props} />
</View>
);
};
InputWithButton.propTypes = {
onPress: PropTypes.func,
buttonText: PropTypes.string,
editable: PropTypes.bool,
};
export default InputWithButton;
app/components/TextInput/styles.js
import { StyleSheet } from 'react-native';
import EStyleSheet from 'react-native-extended-stylesheet';
const INPUT_HEIGHT = 48;
const BORDER_RADIUS = 4;
export default EStyleSheet.create({
$buttonBackgroundColorBase: '$white',
$buttonBackgroundColorModifier: 0.1,
container: {
backgroundColor: '$white',
width: '90%',
height: INPUT_HEIGHT,
flexDirection: 'row',
alignItems: 'center',
borderRadius: BORDER_RADIUS,
marginVertical: 11,
},
containerDisabled: {
backgroundColor: '$lightGray',
},
buttonContainer: {
height: INPUT_HEIGHT,
alignItems: 'center',
justifyContent: 'center',
backgroundColor: '$white',
borderTopLeftRadius: BORDER_RADIUS,
borderBottomLeftRadius: BORDER_RADIUS,
},
buttonText: {
fontWeight: '600',
fontSize: 20,
paddingHorizontal: 16,
color: '$primaryBlue',
},
separator: {
height: INPUT_HEIGHT,
width: StyleSheet.hairlineWidth,
backgroundColor: '$border',
},
input: {
flex: 1,
height: INPUT_HEIGHT,
borderTopRightRadius: BORDER_RADIUS,
paddingHorizontal: 8,
color: '$inputText',
fontSize: 18,
},
});
app/index.js
import React from 'react';
import EStyleSheet from 'react-native-extended-stylesheet';
import Home from './screens/Home';
EStyleSheet.build({
$primaryBlue: '#4F6D7A',
$white: '#FFFFFF',
$lightGray: '#F0F0F0',
$border: '#979797',
$inputText: '#797979',
});
export default () => <Home />;
app/screens/Home.js
import React, { Component } from 'react';
import { StatusBar, KeyboardAvoidingView } from 'react-native';
import { Container } from '../components/Container';
import { Logo } from '../components/Logo';
import { InputWithButton } from '../components/TextInput';
const TEMP_BASE_CURRENCY = 'USD';
const TEMP_QUOTE_CURRENCY = 'GBP';
const TEMP_BASE_PRICE = '100';
const TEMP_QUOTE_PRICE = '79.74';
class Home extends Component {
handleChangeText = () => {
console.log('change text');
};
handlePressBaseCurrency = () => {
console.log('press base currency');
};
handlePressQuoteCurrency = () => {
console.log('press quote currency');
};
render() {
return (
<Container>
<StatusBar backgroundColor="blue" barStyle="light-content" />
<Logo />
<InputWithButton
buttonText={TEMP_BASE_CURRENCY}
onPress={this.handlePressBaseCurrency}
defaultValue={TEMP_BASE_PRICE}
keyboardType="numeric"
onChangeText={this.handleChangeText}
/>
<InputWithButton
editable={false}
buttonText={TEMP_QUOTE_CURRENCY}
onPress={this.handlePressQuoteCurrency}
value={TEMP_QUOTE_PRICE}
/>
</Container>
);
}
}
export default Home;
components/Container/Container.js
import PropTypes from 'prop-types';
import React from 'react';
import { View, TouchableWithoutFeedback, Keyboard } from 'react-native';
import styles from './styles';
const Container = ({ children }) => (
<TouchableWithoutFeedback onPress={() => Keyboard.dismiss()}>
<View style={styles.container}>{children}</View>
</TouchableWithoutFeedback>
);
Container.propTypes = {
children: PropTypes.any,
};
export default Container;