bendwidth / frontend / src / components / login / Login.jsx
Login.jsx
Raw
import Grid from "@mui/material/Grid";
import { useEffect, useRef, useState } from "react";
import { CircularProgress } from "@mui/material";
import SignupOverlay from "./SignupOverlay";
import ErrorIcon from "./ErrorIcon";
import axios from "axios";
import { useNavigate, useSearchParams } from "react-router-dom";
import { useDispatch, useSelector } from "react-redux";
import { updateUserDetails, updateWholeUserObject } from "../../redux-elements/userDetails";
import pair from "../../redux-elements/pair";
import submitCredentials from "./submitCredentials";
import {jwtDecode } from 'jwt-decode'

const Login = ({ setPage }) => {
  const dispatch = useDispatch();

  // user details.
  const [data, setData] = useState({ email: "", password: "" });

  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(false);
  const [errMsg, setErrMess] = useState("");
  const navigate = useNavigate(); // Create navigate function

  const [searchParams, setSearchParams] = useSearchParams();
    const token = searchParams.get("token")
    
    // load user data if user is a respondent.
    useEffect(() => {
        const getKey = async () => {
            try {
                const userData = jwtDecode(token);
                console.log(userData)
                dispatch(updateWholeUserObject(userData));
                sessionStorage.setItem('userData', JSON.stringify(userData));
                dispatch(updateUserDetails(pair("isLoggedIn", true)));
                dispatch(updateUserDetails(pair("userName", userData.fullName)));
                dispatch(updateUserDetails(pair("userId", userData.userId)));
                dispatch(updateUserDetails(pair("userEmail", userData.userEmail)));
                dispatch(updateUserDetails(pair("collegeName", userData.collegeName)));
                dispatch(updateUserDetails(pair("isInquirer", false)));
                dispatch(updateUserDetails(pair("isRespondent", true)));
                dispatch(updateUserDetails(pair("uuid", userData.uuid)))
                dispatch(updateUserDetails(pair("gradDate", userData.gradDate)));
                navigate("/main/lobby")
            } catch (err) {
                navigate("/")
            }
            
        }
        if (token) {
            console.log("got here")
            getKey();
        }    
    }, [token])

  const handleDataChange = (e) => {
    setData((prev) => ({ ...prev, [e.target.name]: e.target.value }));
  };

  const handleSubmit = () => {
    
    const getSubmittedCredentials = async () => {
      setLoading(true);
      const res = await submitCredentials(dispatch, data.email, data.password);
      if ("fullName" in res) {
        setErrMess(res.fullName);
        navigate("main/");
      } else {
        setLoading(false)
        console.log(res);
        setError(true);
        setErrMess(res.response?.data?.error);
        await sleep(2500);
        setError(false);
      }
      setLoading(false);
    };

    // submit user credentials to backend for login.
    getSubmittedCredentials();
  };

  return (
    <div className="login">
      {loading && <SignupOverlay Icon={CircularProgress} title={`Loading...`} />}
      {error && <SignupOverlay Icon={ErrorIcon} title={errMsg} />}

      <div className="login__content">
        <div className="login__logo">
          <p className="login__logo_name">
            <img src="/logo.png" alt="logo" /> Bendwidth
          </p>
        </div>
        <h1 className="login__title">Welcome Back</h1>
        <p className="login__desc">
          Connect and collaborate with peers across the globe for interactive
          study sessions and realistic mock interviews. Discover a community
          dedicated to academic growth and professional preparation, all at your
          fingertips.
        </p>
        <div>
          <div className="login__form_input">
            <i class="fa-solid fa-envelope"></i>
            <input
              value={data.email}
              type="email"
              placeholder="Email"
              required
              name="email"
              onChange={handleDataChange}
            />
          </div>
          <div className="login__form_input">
            <i class="fa-solid fa-lock"></i>
            <input
              value={data.password}
              type="password"
              placeholder="Password"
              required
              name="password"
              onChange={handleDataChange}
            />
          </div>
          <p className="forgot__password"> Forgot password</p>
          <button className="login__submit" onClick={handleSubmit}>
            Login
          </button>

          <p className="not_member">
            Not a member?{" "}
            <span className="login__signup" onClick={() => setPage("signup")}>
              Sign up
            </span>
          </p>
        </div>
      </div>
    </div>
  );
};

export default Login;

function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

//{loading && <SignupOverlay Icon={CircularProgress} title={`Welcome!`} />}
// {error && <SignupOverlay Icon={ErrorIcon} title={errMsg} />}
// <Grid container>
//   <Grid item xs={12} md={6}>
//     <div className="login__main_info">
//       <p className="login__logo">Bendwidth</p>

//       <div className="login__display">
//         <h1 className="login__title">AI driven matching</h1>
//         <div className="login__punchline">
//           Matching <span className="learner">learners</span> with real
//           educators and other interested
//           <span className="learner"> learners</span>, optimizing
//           educational outcomes through tailored
//           <span className="learner"> learning</span> experience.
//         </div>
//         <div className="login__image">
//           <img src="/ai-matching.png" alt="" />
//         </div>
//       </div>
//     </div>
//   </Grid>
//   <Grid item xs={12} md={6}>
//     <div className="login__right-side">
//       <div className="login__form" onChange={handleDataChange}>
//         <h2 className="login__heading">Hi, welcome back!</h2>
//         <div className="login__form_input">
//           <i class="fa-solid fa-envelope"></i>
//           <input
//             ref={usernameEl}
//             type="email"
//             placeholder="Email"
//             required
//           />
//         </div>
//         <div className="login__form_input">
//           <i class="fa-solid fa-lock"></i>
//           <input
//             ref={passwordEl}
//             type="password"
//             placeholder="Password"
//             required
//           />
//         </div>
//         <p className="forgot__password"> Forgot password</p>
//         <button className="login__submit" onClick={handleSubmit}>
//           Login
//         </button>

//         <p className="not_member">
//           Not a member?{" "}
//           <span
//             className="login__signup"
//             onClick={() => setPage("signup")}
//           >
//             Sign up
//           </span>
//         </p>
//       </div>
//     </div>
//   </Grid>
// </Grid>
// </div>