• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

atlp-rwanda / trojans-ec-fe / 0cb862e4-0fa2-47c7-95e9-d93125127b5b

pending completion
0cb862e4-0fa2-47c7-95e9-d93125127b5b

push

circleci

GitHub
feature(navbar/sidebar):Dashboard sidebar/navbar and main navbar [Finishes #185032608] (#33)

452 of 602 branches covered (75.08%)

Branch coverage included in aggregate %.

309 of 309 new or added lines in 56 files covered. (100.0%)

1056 of 1253 relevant lines covered (84.28%)

23.67 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

94.59
/src/components/loginInputs.js
1
/* eslint-disable no-undef */
2
import React from "react";
3
import { useDispatch } from "react-redux";
4
import { useEffect } from "react";
5
import { setGotEmail } from "../redux/features/slices/user";
6
import { useNavigate } from "react-router-dom";
7
import { useSelector } from "react-redux";
8
import { getLoginUser } from "../redux/features/slices/user";
9
import logo from "../assets/images/LOGO.svg";
10
import vector from "../assets/images/Vector.png";
11
import { loginThunk } from "../redux/features/actions/userLogin";
12
import "../styles/login.scss";
13
import GoogleButton from "./shared/GoogleButton";
14
import { useForm } from "react-hook-form";
15
import { yupResolver } from "@hookform/resolvers/yup";
16
import Loader from "./shared/TwoFactorLoader";
17
import loginSchema from "../validations/loginSchema";
18
import Logo from "./logo";
19
import Spinner from "./products/viewProducts/spinner";
20

21
export default function LoginInputs() {
22
  const {
23
    register,
24
    handleSubmit,
25
    formState: { errors },
26
  } = useForm({
48✔
27
    resolver: yupResolver(loginSchema),
28
  });
29
  const dispatch = useDispatch();
48✔
30
  const navigate = useNavigate();
48✔
31
  const { loading, error, user, twoFactorAuth } = useSelector(getLoginUser);
48✔
32
  const submitHandler = (data) => {
48✔
33
    dispatch(loginThunk(data));
12✔
34
  };
35

36
  useEffect(() => {
48✔
37
    if (!loading && twoFactorAuth) {
36✔
38
      dispatch(setGotEmail({ gotEmail: false }));
6✔
39
      return navigate("/auth");
6✔
40
    }
41
    if (loading === false && user !== null && !twoFactorAuth) {
30✔
42
      localStorage.setItem("token", user.token);
2✔
43
      localStorage.setItem("name", user.name);
2✔
44
      localStorage.setItem("user", JSON.stringify(user));
2✔
45
      window.location.href = window.location.href.split("/login")[0];
2✔
46
    }
47
  }, [loading, user, twoFactorAuth]);
48

49
  return (
48✔
50
    <div className="login-container overflow-hidden">
51
      <div className="m-5 lg:my-6 lg:mx-8 w-[90vw]">
52
        <Logo />
53
      </div>
54
      <div className="div-design-one"></div>
55
      <div className="div-design-two"></div>
56
      <img className="vector-image" src={vector} alt="vector" />
57
      <div className="login-form-div">
58
        <h2> Please Login Here!</h2>
59
        {error && <p className="ml-3 text-red-500 text-sm">{error}</p>}
56✔
60
        <form onSubmit={handleSubmit(submitHandler)} className="form-div">
61
          <div className="w-80">
62
            <input
63
              className="login-input bg-transparent outline-none w-full"
64
              placeholder="User Email"
65
              {...register("email")}
66
              name="email"
67
              type="text"
68
            />
69
            {errors.email && (
50✔
70
              <p className="ml-3 text-red-500 text-sm">
71
                {errors.email.message}
72
              </p>
73
            )}
74
          </div>
75
          <div className="w-80">
76
            <input
77
              className="login-input bg-transparent outline-none w-full"
78
              {...register("password")}
79
              name="password"
80
              placeholder="User Password"
81
              type="password"
82
            />
83
            {errors.password && (
50✔
84
              <p className="ml-3 text-red-500 text-sm">
85
                {errors.password.message}
86
              </p>
87
            )}
88
          </div>
89
          <button
90
            className="button login-btn relative"
91
            type="submit"
92
            data-testid="loginbtn"
93
          >
94
            <span className={`${loading ? "hidden" : ""}`}>Login</span>
48✔
95
            {loading ? <Spinner withoutText={true} /> : null}
48✔
96
          </button>
97
          <h6 className="forgot" onClick={() => navigate("/sendEmail")}>
×
98
            Forgot Password?
99
          </h6>
100
          <h6 className="forgot">
101
            Don't have an account?{" "}
102
            <span
103
              onClick={() => navigate("/register")}
×
104
              className="text-primary font-semibold"
105
            >
106
              Sign up
107
            </span>
108
          </h6>
109
        </form>
110
        <GoogleButton />
111
      </div>
112
    </div>
113
  );
114
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc