JourneyPoint / journeypoint / frontend / src / Components / login / Login.js
Login.js
Raw
import React, { useState } from "react";
import { useNavigate } from "react-router-dom";
import { Form, Button, Alert } from "react-bootstrap";
import "./login.css";

import BackgroundImage from "../../images/login_background.png";
import Logo from "../../images/JourneyPoint.png";

import Navbar from "../Navbar"
import Footer from "../footer"

const Login = () => {
  const [inputUsername, setInputUsername] = useState("");
  const [inputPassword, setInputPassword] = useState("");
  const [show, setShow] = useState(false);
  const [loading, setLoading] = useState(false);

  const navigate = useNavigate();

  const handleSubmit = async (event) => {
    event.preventDefault();
    setLoading(true);
    setShow(false); // Hide previous error message

    try {
      const response = await fetch("https://jp-backend-kc80.onrender.com/auth/login", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          username: inputUsername,
          password: inputPassword,
        }),
      });

      const data = await response.json(); // Parse response JSON

      if (response.ok) {
        console.log("Login successful:", data);
        // Store token if authentication is successful
        localStorage.setItem("token", data.token); // Adjust based on API response
        localStorage.setItem("username", inputUsername);
        localStorage.setItem("login", "true"); // Store login status
        // Redirect user or update UI
        navigate("/")
      } else {
        console.error("Login failed:", data);
        setShow(true); // Show error message
      }
    } catch (error) {
      console.error("Network error:", error);
      setShow(true); // Show error message
    } finally {
      setLoading(false);
    }
  };


  const handlePassword = () => { };


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

  return (
    <div>
      <Navbar />
      <div
        className="sign-in__wrapper"
        style={{ backgroundImage: `url(${BackgroundImage})` }}
      >
        {/* Overlay */}
        <div className="sign-in__backdrop"></div>
        {/* Form */}
        <Form className="shadow p-4 bg-white rounded" onSubmit={handleSubmit}>
          {/* Header */}
          <img
            className="img-thumbnail mx-auto d-block mb-2"
            src={Logo}
            alt="logo"
          />
          <div className="h4 mb-2 text-center">Sign In</div>
          {/* ALert */}
          {show ? (
            <Alert
              className="mb-2"
              variant="danger"
              onClose={() => setShow(false)}
              dismissible
            >
              Incorrect username or password.
            </Alert>
          ) : (
            <div />
          )}
          <Form.Group className="mb-2" controlId="username">
            <Form.Label>Username</Form.Label>
            <Form.Control
              type="text"
              value={inputUsername}
              placeholder="Username"
              onChange={(e) => setInputUsername(e.target.value)}
              required
            />
          </Form.Group>
          <Form.Group className="mb-2" controlId="password">
            <Form.Label>Password</Form.Label>
            <Form.Control
              type="password"
              value={inputPassword}
              placeholder="Password"
              onChange={(e) => setInputPassword(e.target.value)}
              required
            />
          </Form.Group>
          {!loading ? (
            <Button className="w-100" variant="primary" type="submit">
              Log In
            </Button>
          ) : (
            <Button className="w-100" variant="primary" type="submit" disabled>
              Logging In...
            </Button>
          )}
        </Form>
      </div>
      {/* <Footer /> */}
    </div>
  );
};

export default Login;