Codementor Events

Build React Native Fitness App #3: react native login screen

Published Feb 03, 2020
Build React Native Fitness App #3: react native login screen

here next screen we gonna implement react native login screen to make work both on iOS and Android this screen include two input fields email and password and three social login button eg. Facebook, Twitter, Google and submit button and last thing with a link for forgot password screen for the chapter we do only UI part

this tutorial is third chapter of series build fitness tracker this app use for track workouts, diets, or health activities and analyze data and display suggestion the ultimate goal is to create food and health recommendation using Machine learning we start with creating app that user wants to use and connect to google health and apple heath for gathering everything to create dataset that uses for train model later I start with ultimate goal but we will start with create react native app and set up screen navigation with React navigation. inspired by React native template from instamobile

here for the previous chapter

Build React native Fitness app #1: Setup App with React navigation

Build React native fitness app #2: Onboard screen

first import necessary component

import React, {Component} from 'react';
import {
  View,
  StyleSheet,
  ActivityIndicator,
  TouchableOpacity,
  KeyboardAvoidingView,
  ScrollView,
} from 'react-native';
import {Text, Icon, Input, Button, SocialIcon} from 'react-native-elements';

the container

first, for add container for handle input that needs to deal with the keyboard, we use KeyboardAvoidingView and add some active event style padding for a move up the input and add Scrollview for easy scrollable

<KeyboardAvoidingView
       behavior={'padding'}
       enabled
>
 <ScrollView
         style={styles.container}
         keyboardShouldPersistTaps="handled">


 </ScrollView>
</KeyboardAvoidingView>

for style container first requirement we want to center everything and set skyblue background-color

const styles = StyleSheet.create({
  container: {
    backgroundColor: '#F4F6FA',
    height: '100%',
    justifyContent: 'center',
    alignItems: 'center',
  },
}

and for development mode, we set login screen to initial screen

const StackNavigator = createStackNavigator(
  {
    onBoardScreen: {
      screen: onBoardScreen,
    },
    EmailInputScreen: EmailInputScreen,
    LoginScreen: LoginScreen,
    TouchAuthentication: TouchAuthentication,
    PasswordInputScreen: PasswordInputScreen,
    SelectProfileScreen: SelectProfileScreen,
    SetGoalScreen: SetGoalScreen,
    CustomizeInterest: CustomizeInterest,
    SelectGender: SelectGender,
  },
  {
    initialRouteName: 'LoginScreen',
  }
);

and we don’t need  header bar in this screen

static navigationOptions = {
   headerShown: false,
 };

here some first result from both platform

The header

next, we add logo in the header but we wrap with container

<View style={styles.headerContainer}>
   <Icon
     name="md-fitness"
     size={80}
     type="ionicon"
     color={'#7265E2'}
   />
 </View>

and add style

headerContainer: {
   top: 30,
   justifyContent: 'center',
   alignItems: 'center',
   padding: 40,
 },

here some result

the input

next, we add two input for email and password

<View style={styles.wrapper}>
   <Input
     leftIcon={
       <Icon
         name="email-outline"
         type="material-community"
         color="rgba(110, 120, 170, 1)"
         size={25}
       />
     }
     placeholder="Email"
     inputContainerStyle={styles.input}
     placeholderTextColor="grey"
     autoCapitalize="none"
     autoCorrect={false}
     keyboardType="email-address"
     returnKeyType="next"
   />
   <Input
     leftIcon={
       <Icon
         name="lock"
         type="simple-line-icon"
         color="rgba(110, 120, 170, 1)"
         size={25}
       />
     }
     inputContainerStyle={styles.input}
     placeholderTextColor="grey"
     placeholder="Password"
     autoCapitalize="none"
     secureTextEntry={true}
     autoCorrect={false}
     keyboardType="default"
     returnKeyType="next"
   />
 </View>

and add style to the input

wrapper:{
  },
  input: {
    borderWidth: 1,
    borderColor: 'white',
    borderLeftWidth: 0,
    height: 50,
    backgroundColor: 'white',
    marginBottom: 20,
  },

here some result

but we got icon issue on Android

for fix it we change the icon that works both platforms

the social button for login

next, we add three social buttons to activate login that we need to do in the next chapter

<View style={styles.socialWrapper}>
          <Text style={styles.signinwith}>Sign in with</Text>
          <View style={styles.socialLogin}>
            <SocialIcon type="facebook" light />
            <SocialIcon type="google" light />
            <SocialIcon type="twitter" light />
          </View>
          <Button
            title="Login"
            loading={false}
            loadingProps={{size: 'small', color: 'white'}}
            buttonStyle={{
              backgroundColor: '#7265E3',
              borderRadius: 15,
            }}
            titleStyle={{fontWeight: 'bold', fontSize: 23}}
            containerStyle={{marginVertical: 10, height: 50, width: 300}}
            onPress={() => console.log('aye')}
            underlayColor="transparent"
          />
        </View>
      </ScrollView>

and style

socialWrapper: {
    marginTop: 10,
    justifyContent: 'center',
    alignItems: 'center',
  },
  socialLogin: {
    flexDirection: 'row',
    marginTop: 10,
  },

here result

finish with add link to forgot password screen

<TouchableOpacity
  onPress={() =>
    this.props.navigation.navigate('ForgotPasswordScreen')
  }>
  <Text h5 style={{textAlign: 'center', color: 'blue'}}>
    Forgot Password?
  </Text>
</TouchableOpacity>

here final result

Conclusion

in this chapter, we learn how to use react native element create login screen on both Android and iOS next chapter we learn how to create register screen while separate input to multiple scree

Also published on Medium.

Discover and read more posts from Krissanawat Kaewsanmuang
get started