Home > Blockchain >  React Js : Unable to login until page gets refresh manually
React Js : Unable to login until page gets refresh manually

Time:09-17

As a beginner to the React Js I'm trying simple projects for hands-on experience and to learn as well! so, in the same way I've created one login portal with react js and WAMP server by watching YouTube tutorial in the middle I went through some errors but somehow I managed and get them off but after completing the project when I'm trying to login with the credentials which I've given in database the response and all was clear but the page doesn't redirect to welcome page after clicking on login button instead it redirects to welcome page after refreshing manually. I couldn't identify the mistake in my code.

LoginForm.js

import React from 'react';
import InputField from './InputField';
import SubmitButton from './SubmitButton';
import UserStore from './stores/UserStore';


class LoginForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      username: "",
      password: "",
      buttonDisabled: false
    }
  }

  setInputValue(property, val) {
    val = val.trim();
    if (val.length > 12) {
      return;

    }
    this.setState({
      [property]: val

    })
  }

  resetForm() {
    this.setState({
      username: "",
      password: "",
      buttonDisabled: false


    })
  }

  async doLogin() {
    if (!this.state.username) {
      return;
    }
    if (!this.state.password) {
      return;
    }

    this.setState({
      buttonDisabled: true
    })

    try {
      let res = await fetch('/login', {
        method: "post",
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({
          username: this.state.username,
          password: this.state.password
        })

      });

      let result = await res.json();
      if (result && result.succes) {
        UserStore.isLoggedIn = true;
        UserStore.username = result.username;
      }

      else if (result && result.succes === false) {
        this.resetForm();
        alert(result.msg);


      }


    } catch (e) {
      console.log(e);
      this.resetForm();

    }
  }


  render() {
    return (
      <div className="loginForm">
        Log In
        <InputField
          type='text'
          placeholder='Username'
          value={this.state.username ? this.state.username : ''}
          onChange={(val) => this.setInputValue('username', val)}

        />

        <InputField
          type='password'
          placeholder='Password'
          value={this.state.password ? this.state.password : ''}
          onChange={(val) => this.setInputValue('password', val)}

        />

        <SubmitButton
          text='Log In'
          disabled={this.state.buttonDisabled}
          onClick={() => this.doLogin()}
        />

      </div>
    );
  }
}


export default LoginForm;

SubmitButton.js

import React from 'react';


class SubmitButton extends React.Component {
  render() {
    return (
      <div className="submitButton">
        <button
          className='btn'
          type='submit'
          disabled={this.props.disabled}
          onClick={() => this.props.onClick()}
        >

          {this.props.text}


        </button>

      </div>
    );
  }
}


export default SubmitButton;

App.js

import React from 'react';
import { observer } from 'mobx-react';
import UserStore from './stores/UserStore';
import LoginForm from './LoginForm';
import SubmitButton from './SubmitButton';
import './App.css';

class App extends React.Component {

  async componentDidMount() {
    try {
      let res = await fetch('/isLoggedIn', {
        method: 'post',
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'


        }
      });

      let result = await res.json();

      if (result && result.success) {

        UserStore.loading = false;
        UserStore.isLoggedIn = true;
        UserStore.username = result.username;
      }

      else {
        UserStore.loading = false;
        UserStore.isLoggedIn = false;

      }


    }
    catch (e) {

      UserStore.loading = false;
      UserStore.isLoggedIn = false;

    }
  }


  async doLogout() {
    try {
      let res = await fetch('/logout', {
        method: 'post',
        headers: {
          'Accept': 'application/json',
          'Content-type': 'application/json'


        }
      });

      let result = await res.json();

      if (result && result.success) {


        UserStore.isLoggedIn = false;
        UserStore.username = '';
      }




    }
    catch (e) {

      console.log(e);

    }
  }



  render() {
    if (UserStore.loading) {
      return (
        <div className="app">
          <div className='container'>
            Loading ,Please Wait...

          </div>

        </div>

      );
    }

    else {

      if (UserStore.isLoggedIn) {

        return (
          <div className="app">
            <div className='container'>
              Welcome {UserStore.username}

              <SubmitButton

                text={'Log Out'}
                disabled={false}
                onClick={() => this.doLogout()}

              />

            </div>
          </div>
        );

      }



      return (
        <div className="app">
          <div className='container'>

            <LoginForm />
          </div>

        </div>
      );

    }
  }
}


export default observer(App);

Router.js

const bcrypt = require('bcrypt');


class Router {

    constructor(app, db) {
        this.login(app, db);
        this.logout(app, db);
        this.isLoggedIn(app, db);
    }

    login(app, db) {
        app.post('/login', (req, res) => {

            let username = req.body.username; 
            let password = req.body.password; 

            username = username.toLowerCase();

            if (username.length > 12 || password.length > 12) {
                res.json({
                    success: false,
                    msg: 'An error occured,please try again'
                })
                return;


            }
            let cols = [username];
            db.query('SELECT * FROM user WHERE username =? LIMIT 1', cols, (err, data, fields) => {

                if (err) {
                    res.json({
                        success: false,
                        msg: 'An error occured,please try again'

                    });
                    return;
                }
                if (data && data.length === 1) {
                    bcrypt.compare(password, data[0].password, (bcryptErr, verified) => {
                        if (verified) {
                            req.session.userID = data[0].id;
                            res.json({
                                success: true,
                                username: data[0].username
                            })
                            return;

                        }
                        else {
                            res.json({
                                success: false,
                                msg: 'Invalid Password'
                            })
                        }
                    });
                } else {
                    res.json({
                        success: false,
                        msg: 'User not Found,please try again..!'
                    })

                }

            });
        });

    }

    logout(app, db) {
        app.post('/logout',(req,res)=>{

            if(req.session.userID){
                req.session.destroy();
                res.json({
                    success:true
                })
                return true;
            }
            else{
                res.json({
                    success:false
                })
                return false;

            }
        })

    }
    isLoggedIn(app, db) {

        app.post('/isLoggedIn',(req,res)=>{

            if(req.session.userID){
                let cols =[req.session.userID];
                db.query('SELECT * FROM user WHERE ID=? LIMIT 1',cols,(err,data,fields) =>{

                    if(data && data.length ===1){
                        res.json({
                            success:true,
                            username:data[0].username
                        });
                        return true;
                    }
                    else{
                        res.json({
                            success:false
                        });
                    }

                });
            }
            else{
                res.json({
                    success:false
                })
            }

        });



    }

}

module.exports = Router;

CodePudding user response:

In LoginForm.js after everything was ok, you save data in Userstore and it will not effect on App.js instantly. Bot after a refresh it shows welcome section. So as a solution I suggest to use state and props in LoginForm.js to handle it.

import React from 'react';
import InputField from './InputField';
import SubmitButton from './SubmitButton';
import UserStore from './stores/UserStore';


class LoginForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      username: "",
      password: "",
      buttonDisabled: false
    }
  }

  setInputValue(property, val) {
    val = val.trim();
    if (val.length > 12) {
      return;

    }
    this.setState({
      [property]: val

    })
  }

  resetForm() {
    this.setState({
      username: "",
      password: "",
      buttonDisabled: false


    })
  }

  async doLogin() {
    if (!this.state.username) {
      return;
    }
    if (!this.state.password) {
      return;
    }

    this.setState({
      buttonDisabled: true
    })

    try {
      let res = await fetch('/login', {
        method: "post",
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({
          username: this.state.username,
          password: this.state.password
        })

      });

      let result = await res.json();
      if (result && result.succes) {
        UserStore.isLoggedIn = true;
        UserStore.username = result.username;
        this.props.setIsLoggedIn(true);
//------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      }

      else if (result && result.succes === false) {
        this.resetForm();
        alert(result.msg);


      }


    } catch (e) {
      console.log(e);
      this.resetForm();

    }
  }


  render() {
    return (
      <div className="loginForm">
        Log In
        <InputField
          type='text'
          placeholder='Username'
          value={this.state.username ? this.state.username : ''}
          onChange={(val) => this.setInputValue('username', val)}

        />

        <InputField
          type='password'
          placeholder='Password'
          value={this.state.password ? this.state.password : ''}
          onChange={(val) => this.setInputValue('password', val)}

        />

        <SubmitButton
          text='Log In'
          disabled={this.state.buttonDisabled}
          onClick={() => this.doLogin()}
        />

      </div>
    );
  }
}


export default LoginForm;
import React from 'react';
import { observer } from 'mobx-react';
import UserStore from './stores/UserStore';
import LoginForm from './LoginForm';
import SubmitButton from './SubmitButton';
import './App.css';

class App extends React.Component {

  constructor(props) {
    super(props);
    this.state = {
      isLoggedIn : UserStore.isLoggedIn
    }
  }
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

  async componentDidMount() {
    try {
      let res = await fetch('/isLoggedIn', {
        method: 'post',
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'


        }
      });

      let result = await res.json();

      if (result && result.success) {

        UserStore.loading = false;
        UserStore.isLoggedIn = true;
        UserStore.username = result.username;
      }

      else {
        UserStore.loading = false;
        UserStore.isLoggedIn = false;

      }


    }
    catch (e) {

      UserStore.loading = false;
      UserStore.isLoggedIn = false;

    }
  }


  async doLogout() {
    try {
      let res = await fetch('/logout', {
        method: 'post',
        headers: {
          'Accept': 'application/json',
          'Content-type': 'application/json'


        }
      });

      let result = await res.json();

      if (result && result.success) {


        UserStore.isLoggedIn = false;
        UserStore.username = '';
      }




    }
    catch (e) {

      console.log(e);

    }
  }

  setIsLoggedIn = (isLoggedIn) => {
    this.setState({isLoggedIn})
  }
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

  render() {
    if (UserStore.loading) {
      return (
        <div className="app">
          <div className='container'>
            Loading ,Please Wait...

          </div>

        </div>

      );
    }

    else {

      if (this.state.isLoggedIn) {

        return (
          <div className="app">
            <div className='container'>
              Welcome {UserStore.username}

              <SubmitButton

                text={'Log Out'}
                disabled={false}
                onClick={() => this.doLogout()}

              />

            </div>
          </div>
        );

      }



      return (
        <div className="app">
          <div className='container'>

            <LoginForm setIsLoggedIn={this.setIsLoggedIn}/>
          </div>

        </div>
      );

    }
  }
}


export default observer(App);

CodePudding user response:

you have to change some logic in LoginForm.js. There are multiple ways in which you can do that. I am showing you one example.

import React from 'react';
import InputField from './InputField';
import SubmitButton from './SubmitButton';
import UserStore from './stores/UserStore';

import {Redirect} from 'react-router-dom' //add a redirect from react-router-dom


class LoginForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      username: "",
      password: "",
      buttonDisabled: false,
      redirectToRefer : false //add a state here for redirect
    }
  }

  setInputValue(property, val) {
    val = val.trim();
    if (val.length > 12) {
      return;

    }
    this.setState({
      [property]: val

    })
  }

  resetForm() {
    this.setState({
      username: "",
      password: "",
      buttonDisabled: false


    })
  }

  async doLogin() {
    if (!this.state.username) {
      return;
    }
    if (!this.state.password) {
      return;
    }

    this.setState({
      buttonDisabled: true
    })

    try {
      let res = await fetch('/login', {
        method: "post",
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({
          username: this.state.username,
          password: this.state.password
        })

      });

      let result = await res.json();
      if (result && result.succes) {
        UserStore.isLoggedIn = true;
        UserStore.username = result.username;

        this.setState({redirectToRefer:true})//set rediectToRefer as true
      }

      else if (result && result.succes === false) {
        this.resetForm();
        alert(result.msg);


      }


    } catch (e) {
      console.log(e);
      this.resetForm();

    }
  }


  render() {

    //add a condition at render if redirectToRefer is true then redirect to  your page
      if(redirectToRefer)
        {
           return <Redirect to ="/"/>
        }
    return (
      <div className="loginForm">
        Log In
        <InputField
          type='text'
          placeholder='Username'
          value={this.state.username ? this.state.username : ''}
          onChange={(val) => this.setInputValue('username', val)}

        />

        <InputField
          type='password'
          placeholder='Password'
          value={this.state.password ? this.state.password : ''}
          onChange={(val) => this.setInputValue('password', val)}

        />

        <SubmitButton
          text='Log In'
          disabled={this.state.buttonDisabled}
          onClick={() => this.doLogin()}
        />

      </div>
    );
  }
}


export default LoginForm;
  • Related