program_bumble_bee
program_bumble_bee

Reputation: 305

Redirecting user based on his authentication

In my react native application, I want to check if a user has already logged in before, then he must be redirected to 'Home' directly without asking him for credentials again. The 'Home' component consists of logout button in a sidebar.

My current code works fine for new user logging, but I am stuck on how to check if again the user open the application, his login token should persist and he must be redirected to 'Home' directly.

Here is my code:

import React, { Component } from 'react'
import { Text, View, Image, TextInput, TouchableOpacity, ScrollView, AsyncStorage, ToastAndroid } from 'react-native'
import axios from 'axios';

export default class Login extends Component {

    constructor(){
        super();

        this.state = {
            username: '',
            password: '',
            isLoggedIn: false,
            loginChecked: false,
        }
    }

    componentDidMount(){
        this.getItem('userID');
    }


    //function to extract storage token. Any name can be given ot it. 
    async getItem(item){
        console.log('method ran login screen');
        console.log(this.state.isLoggedIn)
        try{
            const value = await AsyncStorage.getItem(item);
            if(value !== null){
                this.setState({
                    isLoggedIn: true,
                    loginChecked: true
                })

            }
            else{
                this.setState({
                    isLoggedIn: false,
                    loginChecked: true
                })
            }
        }
        catch(error){
            console.log(error)
        }
        console.log(this.state.isLoggedIn)
    }

    //function to remove storage token 
    async removeItem(item){
        try{
            const value = await AsyncStorage.removeItem(item);

            if(value == null){
                this.setState({
                    isLoggedIn: false
                })
            }
        }
        catch(error){
            //handle errors here
        }
    }



    userLogin = () => {

        if(this.state.username != '' && this.state.password != ''){
            axios.post('http://bi.servassure.net/api/login', {
            username: this.state.username,
            password: this.state.password
        })
        .then(res => {

            let userToken = res.data.token;
            console.log(res.data);

            if(res.data.success){
                AsyncStorage.setItem('userID', userToken);
                this.setState({
                    isLoggedIn: true
                })
                this.props.navigation.navigate('Home');
            }
            else{
                ToastAndroid.showWithGravity(
                    'Invalid login' ,
                    ToastAndroid.SHORT,
                    ToastAndroid.CENTER
                  );
            }
        })
        .catch(err => {
            console.log(err);
        });

        }
        else{
            ToastAndroid.showWithGravity(
                'Please Enter Credentials' ,
                ToastAndroid.SHORT,
                ToastAndroid.CENTER
              );
        }
    }


    logOut(){
        this.removeItem('userID');
    }

    render() {
        return (
            <ScrollView>
                <View style={{justifyContent:'center', alignItems:'center'}}>

                    <View style={{marginVertical:20}}>
                        <Text>
                            Login to your account
                        </Text>
                    </View>


                    <View>
                        <TextInput 
                            style={{width: 300, height: 50, borderColor: 'gray', borderWidth: 1, borderRadius: 10, marginVertical: 10}}
                            onChangeText={(username) => this.setState({username})}
                            placeholder='username'
                            autoCapitalize = 'none'
                        />

                        <TextInput 
                            style={{width: 300, height: 50, borderColor: 'gray', borderWidth: 1, borderRadius: 10}}
                            onChangeText={(password) => this.setState({password})}
                            placeholder='password'
                            secureTextEntry={true}
                        />
                    </View>

                    <View style={{justifyContent: 'center', alignItems: 'center'}}>
                        <TouchableOpacity 
                        style={{width: 300, height: 50, borderWidth:1, borderRadius: 50, borderColor: 'gray', justifyContent: 'center', alignItems: 'center', marginVertical: 10}}

                        onPress={this.userLogin}>

                            <Text>
                                LOGIN
                            </Text>

                        </TouchableOpacity>
                        <Text>Forget Password</Text>
                    </View>
                </View>
            </ScrollView>
        )
    }
}

Also, I have a SplashScreen before login:

import React, { Component } from 'react'
import { Text, View } from 'react-native'

export default class SplashScreen extends Component {

    componentDidMount(){

        setTimeout( () => {
            this.props.navigation.navigate('Login')
        }, 2000)

    }

    render() {
        return (
            <View style={styles.viewStyles}>
                <Text style={styles.textStyles}> My App </Text>
            </View>
        )
    }
}


const styles = {
    viewStyles: {
      flex: 1,
      alignItems: 'center',
      justifyContent: 'center',
      backgroundColor: 'orange'
    },
    textStyles: {
      color: 'white',
      fontSize: 40,
      fontWeight: 'bold'
    }
  }

I am bit new to react native, please help to figure this out.

Upvotes: 2

Views: 1860

Answers (2)

Raymond Mutyaba
Raymond Mutyaba

Reputation: 950

Import the React Navigation library and use the Switch Navigator. It was designed to handle app navigation based on the login status of the user.

This article explains everything with examples

Upvotes: 1

HarshitMadhav
HarshitMadhav

Reputation: 5069

Do something like this in your Login.js file:

import {AsyncStorage} from react-native;

After getting the response success of login API you can do this:

AsyncStorage.setItem('userID', responsejson.user_detail.userID);

in the same way, you can store the token also

AsyncStorage.setItem('token', responsejson.user_detail.token);

Then in your splashscreen.js, import AsyncStorage the same way as above and then place this code in componentWillMount() or componentDidMount()

of your splashscreen.js

 var value =  AsyncStorage.getItem('token');
    value.then((e)=>{

    if (e == '' || e == null ){
         this.props.navigation.replace('Login')          
    }else {
       this.props.navigation.replace('Home')
    }
    })

Explanation: When splashscreen.js is loaded then it checks for the token in asyncstorage and if it gets the token navigate to Home screen else navigate to Login screen.

Upvotes: 2

Related Questions