From bae473139cacf77ed16a097f3e68359612ea585a Mon Sep 17 00:00:00 2001 From: Govind Mehta Date: Mon, 20 Oct 2025 14:07:19 +0530 Subject: [PATCH 1/3] Add loading state for Login and Signup pages --- frontend/src/pages/LoginPage.jsx | 88 ++++++++++++++++++++------ frontend/src/pages/RegisterPage.jsx | 97 ++++++++++++++++++++--------- 2 files changed, 138 insertions(+), 47 deletions(-) diff --git a/frontend/src/pages/LoginPage.jsx b/frontend/src/pages/LoginPage.jsx index e211bee..0e1638a 100644 --- a/frontend/src/pages/LoginPage.jsx +++ b/frontend/src/pages/LoginPage.jsx @@ -1,28 +1,31 @@ -import React, { useState } from 'react'; -import { Link } from 'react-router-dom'; -import useAuth from '../hooks/useAuth'; -import PasswordInput from '../components/PasswordInput'; +import React, { useState } from "react"; +import { Link } from "react-router-dom"; +import useAuth from "../hooks/useAuth"; +import PasswordInput from "../components/PasswordInput"; /* // Demo user credentials const DEMO_EMAIL = 'test@example.com'; const DEMO_PASSWORD = 'password123'; */ export default function LoginPage() { - const [email, setEmail] = useState(''); - const [password, setPassword] = useState(''); - const [serverError, setServerError] = useState(''); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const [serverError, setServerError] = useState(""); const { login } = useAuth(); + const [loading, setLoading] = useState(false); const handleSubmit = async (e) => { e.preventDefault(); - setServerError(''); // Clear previous server errors + setServerError(""); // Clear previous server errors try { + setLoading(true); await login(email, password); // Toast handled globally in AuthContext } catch (error) { setServerError(error.message); // Toast handled globally in AuthContext } + setLoading(false); }; /* const handleFillDemoCredentials = () => { @@ -32,26 +35,67 @@ export default function LoginPage() { return (
- - + Paisable
-

Login to your account

- {serverError &&

{serverError}

} +

+ Login to your account +

+ {serverError && ( +

+ {serverError} +

+ )}
- - setEmail(e.target.value)} required /> + + setEmail(e.target.value)} + required + />
- - setPassword(e.target.value)} /> + + setPassword(e.target.value)} + />
- + {/*
- Don't have an account? Register + Don't have an account?{" "} + + Register +
); -} \ No newline at end of file +} diff --git a/frontend/src/pages/RegisterPage.jsx b/frontend/src/pages/RegisterPage.jsx index fec46f5..6fc7024 100644 --- a/frontend/src/pages/RegisterPage.jsx +++ b/frontend/src/pages/RegisterPage.jsx @@ -1,95 +1,136 @@ -import React, { useState } from 'react'; -import { Link } from 'react-router-dom'; -import useAuth from '../hooks/useAuth'; -import PasswordInput from '../components/PasswordInput'; +import React, { useState } from "react"; +import { Link } from "react-router-dom"; +import useAuth from "../hooks/useAuth"; +import PasswordInput from "../components/PasswordInput"; export default function RegisterPage() { - const [email, setEmail] = useState(''); - const [password, setPassword] = useState(''); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); const [errors, setErrors] = useState({}); + const [loading, setLoading] = useState(false); // State for server-side errors - const [serverError, setServerError] = useState(''); + const [serverError, setServerError] = useState(""); const { signup } = useAuth(); const validate = () => { const newErrors = {}; const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(email)) { - newErrors.email = 'Please enter a valid email address.'; + newErrors.email = "Please enter a valid email address."; } else { // Frontend blacklist for instant feedback - const domain = email.split('@')[1]; - const blockedDomains = ['example.com', 'test.com', 'invalid.com']; + const domain = email.split("@")[1]; + const blockedDomains = ["example.com", "test.com", "invalid.com"]; if (blockedDomains.includes(domain)) { - newErrors.email = 'This email domain is not allowed.'; + newErrors.email = "This email domain is not allowed."; } } if (password.length < 8 || password.length > 16) { - newErrors.password = 'Password must be 8-16 characters long.'; + newErrors.password = "Password must be 8-16 characters long."; } else { const passwordRegex = /^(?=.*\d)(?=.*[a-zA-Z])(?=.*[\W_])/; if (!passwordRegex.test(password)) { - newErrors.password = 'Password must contain an alphabet, a digit, and a symbol.'; + newErrors.password = + "Password must contain an alphabet, a digit, and a symbol."; } } - + return newErrors; }; const handleSubmit = async (e) => { e.preventDefault(); - setServerError(''); // Clear previous server errors + setServerError(""); // Clear previous server errors const validationErrors = validate(); if (Object.keys(validationErrors).length > 0) { setErrors(validationErrors); return; } setErrors({}); - + // The signup function in AuthContext needs to be updated to handle errors try { + setLoading(true); await signup(email, password); } catch (error) { setServerError(error.message); } + setLoading(false); }; return (
- + Paisable
-

Create an account

- {serverError &&

{serverError}

} +

+ Create an account +

+ {serverError && ( +

+ {serverError} +

+ )}
- + setEmail(e.target.value)} required /> - {errors.email &&

{errors.email}

} + {errors.email && ( +

{errors.email}

+ )}
- - + Password + + setPassword(e.target.value)} error={errors.password} /> - {errors.password &&

{errors.password}

} + {errors.password && ( +

{errors.password}

+ )}
-
@@ -103,4 +144,4 @@ export default function RegisterPage() {
); -} \ No newline at end of file +} From f300146a1633de2f3afa6c96670a4f30f4700163 Mon Sep 17 00:00:00 2001 From: Govind Mehta Date: Mon, 20 Oct 2025 14:14:13 +0530 Subject: [PATCH 2/3] Refined loading state logic and fixed minor UI details --- frontend/src/pages/LoginPage.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/pages/LoginPage.jsx b/frontend/src/pages/LoginPage.jsx index 0e1638a..94a95e8 100644 --- a/frontend/src/pages/LoginPage.jsx +++ b/frontend/src/pages/LoginPage.jsx @@ -86,11 +86,11 @@ export default function LoginPage() {