How to Create SignIn Page and Implement SignIn API in React JS MERN

How Create SignIn Page and Implement SignIn API in React JS MERN

Here are steps –

1. Create a Sign-In Page UI.

2. Add OnChange method in all input fields –

onChange={handleChange}
 

3. Add OnSubmit Handler in form tag –

onSubmit={handleSubmit}
 

4. Write OnChange menthod body –

  const handleChange=(e)=>{
    setFormData({…formData, [e.target.id]:e.target.value.trim()})
   };

5. Write OnSubmit Handler function body –

  const handleSubmit=async(e)=>{
    e.preventDefault();
    if(!formData.email || !formData.password || !formData.email=== || !formData.password===){
      return setErrorMessage(“Please fill all fields”);
    }
    try {
      setLoading(true);
      setErrorMessage(null);
      const res=await fetch(‘/api/auth/signin’,
      {
        method:‘POST’,
        headers:{‘Content-Type’:‘application/json’},
        body:JSON.stringify(formData)
      })
      const data=await res.json();
      if(data.success===false){
        return setErrorMessage(data.message);
      }
      setLoading(false);
      if(res.ok){
        navigate(‘/’);
      }
    } catch (error) {
      setErrorMessage(error.message);
      setLoading(false)
    }

 

  }

 

6. Define states –

const [formData, setFormData]=useState({});
const [errorMessage, setErrorMessage]=useState(null);
const [loading, setLoading]=useState(false);
7. If User enter correct data and everything correct. User will be redirect on home page.
Complete “Signin.jsx” Code:
import React, { useState } from ‘react’
import {Alert, Button, Label, TextInput} from ‘flowbite-react’
import { Link, useNavigate } from ‘react-router-dom’
const Signin = () => {
const [formData, setFormData]=useState({});
const [errorMessage, setErrorMessage]=useState(null);
const [loading, setLoading]=useState(false);
const navigate=useNavigate();
  const handleChange=(e)=>{
    setFormData({…formData, [e.target.id]:e.target.value.trim()})
   };
   console.log(formData)
  const handleSubmit=async(e)=>{
    e.preventDefault();
    if(!formData.email || !formData.password || !formData.email=== || !formData.password===){
      return setErrorMessage(“Please fill all fields”);
    }
    try {
      setLoading(true);
      setErrorMessage(null);
      const res=await fetch(‘/api/auth/signin’,
      {
        method:‘POST’,
        headers:{‘Content-Type’:‘application/json’},
        body:JSON.stringify(formData)
      })
      const data=await res.json();
      if(data.success===false){
        return setErrorMessage(data.message);
      }
      setLoading(false);
      if(res.ok){
        navigate(‘/’);
      }
    } catch (error) {
      setErrorMessage(error.message);
      setLoading(false)
    }
  }
  return (
    <div className=‘flex md:flex-row max-w-3xl mx-auto m-5’>
        <div className=‘flex-1 flex items-center justify-center flex-col gap-3’>
        <Link to=‘/’>
            <span className=‘bg-gradient-to-r from-fuchsia-500 to-cyan-500 text-white px-1 py-1 font-bold rounded text-3xl’>Krishan’s</span>
            <span className=‘ text-3xl font-bold’>Blog</span>
            </Link>
            <p>
              This is Demo Project. You can signIn with email and password
            </p>
        </div>
        <div className=‘flex-1’>
        <form className=‘ flex flex-col gap-3’ onSubmit={handleSubmit}>
            <div>
              <Label>Email</Label>
              <TextInput type=’email’ placeholder=‘Email’ id=’email’ onChange={handleChange}/>
            </div>
            <div>
              <Label>Password</Label>
              <TextInput type=‘password’ placeholder=‘Password’ id=‘password’ onChange={handleChange}/>
            </div>
            <Button className=‘bg-gradient-to-r from-fuchsia-500 to-cyan-500’ type=‘submit’ disabled={loading}>
              {
                loading?(
                  <>
                  <span>Loading…</span>
                  </>
                ):(‘Sign In’)
              }
            </Button>
          </form>
          <div className=‘mt-1’>
            <p>Don’t Have Account? <Link to=‘/signup’ className=‘ text-blue-700’>Sign Up</Link></p>
          </div>
          {
            errorMessage &&(
              <Alert className=‘mt-5’ color=‘failure’>{errorMessage}</Alert>
            )
          }
        </div>
    </div>
  )
}
export default Signin
 
 
Video Tutorial: