Página da disciplina de pos (Programação Orientada a Serviços) do curso técnico integrado de Informática para Internet.
Objetivos:
cd CurrencyConverter
yarn start
app/config/routes.js
import { StackNavigator } from 'react-navigation';
import { StatusBar } from 'react-native';
import Home from '../screens/Home';
import CurrencyList from '../screens/CurrencyList';
import Options from '../screens/Options';
import Themes from '../screens/Themes';
export default StackNavigator(
{
Home: {
screen: Home,
navigationOptions: {
header: () => null,
},
},
CurrencyList: {
screen: CurrencyList,
navigationOptions: ({ navigation }) => ({
headerTitle: navigation.state.params.title,
}),
},
},
{
mode: 'modal',
cardStyle: {
paddingTop: StatusBar.currentHeight,
},
},
);
app/config/routes.js
import { StackNavigator } from 'react-navigation';
import { StatusBar } from 'react-native';
import Home from '../screens/Home';
import CurrencyList from '../screens/CurrencyList';
import Options from '../screens/Options';
import Themes from '../screens/Themes';
const HomeStack = StackNavigator({
Home: {
screen: Home,
navigationOptions: {
header: () => null,
},
},
Options: {
screen: Options,
},
Themes: {
screen: Themes,
},
});
export default StackNavigator(
{
Home: {
screen: HomeStack,
},
CurrencyList: {
screen: CurrencyList,
navigationOptions: ({ navigation }) => ({
headerTitle: navigation.state.params.title,
}),
},
},
{
mode: 'modal',
cardStyle: {
paddingTop: StatusBar.currentHeight,
},
},
);
app/screens/Home.js
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { KeyboardAvoidingView, StatusBar } from 'react-native';
import { Container } from '../components/Container';
import { Logo } from '../components/Logo';
import { InputWithButton } from '../components/TextInput';
import { ClearButton } from '../components/Button';
import { LastConverted } from '../components/Text';
import { Header } from '../components/Header';
const TEMP_BASE_CURRENCY = 'USD';
const TEMP_QUOTE_CURRENCY = 'GBP';
const TEMP_BASE_PRICE = '100';
const TEMP_QUOTE_PRICE = '79.74';
const TEMP_LAST_CONVERTED = new Date();
const TEMP_CONVERSION_RATE = 0.79739;
class Home extends Component {
static propTypes = {
navigation: PropTypes.object,
};
handleChangeText = () => {
console.log('change text');
};
handlePressBaseCurrency = () => {
this.props.navigation.navigate('CurrencyList', { title: 'Base currency' });
};
handlePressQuoteCurrency = () => {
this.props.navigation.navigate('CurrencyList', { title: 'Quote currency' });
};
handle = () => {
console.log('clear button pressed');
};
handleOptionsPress = () => {
this.props.navigation.navigate('Options');
};
render() {
return (
<Container>
<StatusBar backgroundColor="blue" barStyle="light-content" />
<Header onPress={this.handleOptionsPress} />
<KeyboardAvoidingView behavior="padding">
<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}
/>
<LastConverted
date={TEMP_LAST_CONVERTED}
base={TEMP_BASE_CURRENCY}
quote={TEMP_QUOTE_CURRENCY}
conversionRate={TEMP_CONVERSION_RATE}
/>
<ClearButton text="clear" onPress={this.handle} />
</KeyboardAvoidingView>
</Container>
);
}
}
export default Home;
app/config/routes.js
import { StackNavigator } from 'react-navigation';
import { StatusBar } from 'react-native';
import Home from '../screens/Home';
import CurrencyList from '../screens/CurrencyList';
import Options from '../screens/Options';
import Themes from '../screens/Themes';
const HomeStack = StackNavigator(
{
Home: {
screen: Home,
navigationOptions: {
header: () => null,
},
},
Options: {
screen: Options,
navigationOptions: {
headerTitle: 'Options',
},
},
Themes: {
screen: Themes,
navigationOptions: {
headerTitle: 'Themes',
},
},
},
{
headerMode: 'screen',
},
);
export default StackNavigator(
{
Home: {
screen: HomeStack,
},
CurrencyList: {
screen: CurrencyList,
navigationOptions: ({ navigation }) => ({
headerTitle: navigation.state.params.title,
}),
},
},
{
mode: 'modal',
cardStyle: {
paddingTop: StatusBar.currentHeight,
},
headerMode: 'none',
},
);
app/screens/Options.js
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { ScrollView, StatusBar, Platform } from 'react-native';
import { Ionicons } from '@expo/vector-icons';
import { ListItem, Separator } from '../components/List';
const ICON_PREFIX = Platform.OS === 'ios' ? 'ios' : 'md';
const ICON_COLOR = '#868686';
const ICON_SIZE = 23;
class Options extends Component {
static propTypes = {
navigation: PropTypes.object,
};
handlePressThemes = () => {
this.props.navigation.navigate('Themes');
};
handlePressSite = () => {
console.log('press site');
};
render() {
return (
<ScrollView>
<StatusBar translucent={false} barStyle="default" />
<ListItem
text="Themes"
onPress={this.handlePressThemes}
customIcon={
<Ionicons name={`${ICON_PREFIX}-arrow-forward`} size={ICON_SIZE} color={ICON_COLOR} />
}
/>
<Separator />
<ListItem
text="Fixer.io"
onPress={this.handlePressSite}
customIcon={<Ionicons name={`${ICON_PREFIX}-link`} size={ICON_SIZE} color={ICON_COLOR} />}
/>
<Separator />
</ScrollView>
);
}
}
export default Options;
app/screens/Themes.js
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { ScrollView, StatusBar } from 'react-native';
import EStyleSheet from 'react-native-extended-stylesheet';
import { ListItem, Separator } from '../components/List';
const styles = EStyleSheet.create({
$blue: '$primaryBlue',
$orange: '$primaryOrange',
$green: '$primaryGreen',
$purple: '$primaryPurple',
});
class Themes extends Component {
static propTypes = {
navigation: PropTypes.object,
};
handlePressTheme = (color) => {
this.props.navigation.goBack();
};
render() {
return (
<ScrollView>
<StatusBar translucent={false} barStyle="default" />
<ListItem
text="Blue"
onPress={() => this.handlePressTheme(styles.$blue)}
selected
checkmark={false}
iconBackground={styles.$blue}
/>
<Separator />
<ListItem
text="Orange"
onPress={() => this.handlePressTheme(styles.$orange)}
selected
checkmark={false}
iconBackground={styles.$orange}
/>
<Separator />
<ListItem
text="Green"
onPress={() => this.handlePressTheme(styles.$green)}
selected
checkmark={false}
iconBackground={styles.$green}
/>
<Separator />
<ListItem
text="Purple"
onPress={() => this.handlePressTheme(styles.$purple)}
selected
checkmark={false}
iconBackground={styles.$purple}
/>
<Separator />
</ScrollView>
);
}
}
export default Themes;
app/config/routes.js
import { StackNavigator } from 'react-navigation';
import { StatusBar } from 'react-native';
import Home from '../screens/Home';
import CurrencyList from '../screens/CurrencyList';
import Options from '../screens/Options';
import Themes from '../screens/Themes';
const HomeStack = StackNavigator(
{
Home: {
screen: Home,
navigationOptions: {
header: () => null,
},
},
Options: {
screen: Options,
navigationOptions: {
headerTitle: 'Options',
},
},
Themes: {
screen: Themes,
navigationOptions: {
headerTitle: 'Themes',
},
},
},
{
headerMode: 'screen',
},
);
const CurrencyListStack = StackNavigator({
CurrencyList: {
screen: CurrencyList,
navigationOptions: ({ navigation }) => ({
headerTitle: navigation.state.params.title,
}),
},
});
export default StackNavigator(
{
Home: {
screen: HomeStack,
},
CurrencyList: {
screen: CurrencyListStack,
},
},
{
mode: 'modal',
cardStyle: {
paddingTop: StatusBar.currentHeight,
},
headerMode: 'none',
},
);
app/config/routes.js
import { StackNavigator } from 'react-navigation';
import { StatusBar } from 'react-native';
import Home from '../screens/Home';
import CurrencyList from '../screens/CurrencyList';
import Options from '../screens/Options';
import Themes from '../screens/Themes';
const HomeStack = StackNavigator(
{
Home: {
screen: Home,
navigationOptions: {
header: () => null,
},
},
Options: {
screen: Options,
navigationOptions: {
headerTitle: 'Options',
},
},
Themes: {
screen: Themes,
navigationOptions: {
headerTitle: 'Themes',
},
},
},
{
headerMode: 'screen',
},
);
const CurrencyListStack = StackNavigator({
CurrencyList: {
screen: CurrencyList,
navigationOptions: ({ navigation }) => ({
headerTitle: navigation.state.params.title,
}),
},
});
export default StackNavigator(
{
Home: {
screen: HomeStack,
},
CurrencyList: {
screen: CurrencyListStack,
},
},
{
mode: 'modal',
cardStyle: {
paddingTop: StatusBar.currentHeight,
},
headerMode: 'none',
},
);
app/screens/Home.js
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { KeyboardAvoidingView, StatusBar } from 'react-native';
import { Container } from '../components/Container';
import { Logo } from '../components/Logo';
import { InputWithButton } from '../components/TextInput';
import { ClearButton } from '../components/Button';
import { LastConverted } from '../components/Text';
import { Header } from '../components/Header';
const TEMP_BASE_CURRENCY = 'USD';
const TEMP_QUOTE_CURRENCY = 'GBP';
const TEMP_BASE_PRICE = '100';
const TEMP_QUOTE_PRICE = '79.74';
const TEMP_LAST_CONVERTED = new Date();
const TEMP_CONVERSION_RATE = 0.79739;
class Home extends Component {
static propTypes = {
navigation: PropTypes.object,
};
handleChangeText = () => {
console.log('change text');
};
handlePressBaseCurrency = () => {
this.props.navigation.navigate('CurrencyList', { title: 'Base currency' });
};
handlePressQuoteCurrency = () => {
this.props.navigation.navigate('CurrencyList', { title: 'Quote currency' });
};
handle = () => {
console.log('clear button pressed');
};
handleOptionsPress = () => {
this.props.navigation.navigate('Options');
};
render() {
return (
<Container>
<StatusBar backgroundColor="blue" barStyle="light-content" />
<Header onPress={this.handleOptionsPress} />
<KeyboardAvoidingView behavior="padding">
<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}
/>
<LastConverted
date={TEMP_LAST_CONVERTED}
base={TEMP_BASE_CURRENCY}
quote={TEMP_QUOTE_CURRENCY}
conversionRate={TEMP_CONVERSION_RATE}
/>
<ClearButton text="clear" onPress={this.handle} />
</KeyboardAvoidingView>
</Container>
);
}
}
export default Home;
app/screens/Options.js
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { ScrollView, StatusBar, Platform } from 'react-native';
import { Ionicons } from '@expo/vector-icons';
import { ListItem, Separator } from '../components/List';
const ICON_PREFIX = Platform.OS === 'ios' ? 'ios' : 'md';
const ICON_COLOR = '#868686';
const ICON_SIZE = 23;
class Options extends Component {
static propTypes = {
navigation: PropTypes.object,
};
handlePressThemes = () => {
this.props.navigation.navigate('Themes');
};
handlePressSite = () => {
console.log('press site');
};
render() {
return (
<ScrollView>
<StatusBar translucent={false} barStyle="default" />
<ListItem
text="Themes"
onPress={this.handlePressThemes}
customIcon={
<Ionicons name={`${ICON_PREFIX}-arrow-forward`} size={ICON_SIZE} color={ICON_COLOR} />
}
/>
<Separator />
<ListItem
text="Fixer.io"
onPress={this.handlePressSite}
customIcon={<Ionicons name={`${ICON_PREFIX}-link`} size={ICON_SIZE} color={ICON_COLOR} />}
/>
<Separator />
</ScrollView>
);
}
}
export default Options;
app/screens/Themes.js
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { ScrollView, StatusBar } from 'react-native';
import EStyleSheet from 'react-native-extended-stylesheet';
import { ListItem, Separator } from '../components/List';
const styles = EStyleSheet.create({
$blue: '$primaryBlue',
$orange: '$primaryOrange',
$green: '$primaryGreen',
$purple: '$primaryPurple',
});
class Themes extends Component {
static propTypes = {
navigation: PropTypes.object,
};
handlePressTheme = (color) => {
this.props.navigation.goBack();
};
render() {
return (
<ScrollView>
<StatusBar translucent={false} barStyle="default" />
<ListItem
text="Blue"
onPress={() => this.handlePressTheme(styles.$blue)}
selected
checkmark={false}
iconBackground={styles.$blue}
/>
<Separator />
<ListItem
text="Orange"
onPress={() => this.handlePressTheme(styles.$orange)}
selected
checkmark={false}
iconBackground={styles.$orange}
/>
<Separator />
<ListItem
text="Green"
onPress={() => this.handlePressTheme(styles.$green)}
selected
checkmark={false}
iconBackground={styles.$green}
/>
<Separator />
<ListItem
text="Purple"
onPress={() => this.handlePressTheme(styles.$purple)}
selected
checkmark={false}
iconBackground={styles.$purple}
/>
<Separator />
</ScrollView>
);
}
}
export default Themes;