Added loader while checking whether password was leaked previously.

This commit is contained in:
K
2025-07-18 02:40:15 +05:30
parent 2afda4873b
commit 4115193ef7
+18 -2
View File
@@ -16,6 +16,7 @@ const SignupPage = (props) => {
const [error, setError] = useState(""); const [error, setError] = useState("");
const [passwordStrength, setPasswordStrength] = useState(""); const [passwordStrength, setPasswordStrength] = useState("");
const [loading, setLoading] = useState(false);
const navigate = useNavigate(); const navigate = useNavigate();
const evaluatePasswordStrength = (password) => { const evaluatePasswordStrength = (password) => {
@@ -33,7 +34,7 @@ const SignupPage = (props) => {
const handlePasswordChange = (e) => { const handlePasswordChange = (e) => {
const pwd = e.target.value; const pwd = e.target.value;
passwordElement.current.value = pwd; // keep the ref synced passwordElement.current.value = pwd; // sync with ref
setPasswordStrength(evaluatePasswordStrength(pwd)); setPasswordStrength(evaluatePasswordStrength(pwd));
}; };
@@ -53,15 +54,18 @@ const SignupPage = (props) => {
return; return;
} }
setLoading(true);
try { try {
const pwned = await isPasswordPwned(password); const pwned = await isPasswordPwned(password);
if (pwned) { if (pwned) {
setError("This password previously appeared in a data breach. Please use a new password."); setError("This password previously appeared in a data breach. Please use a new password.");
setLoading(false);
return; return;
} }
} catch (err) { } catch (err) {
console.error("Password breach check failed:", err); console.error("Password breach check failed:", err);
setError("Something went wrong while checking password security. Try again."); setError("Something went wrong while checking password security. Try again.");
setLoading(false);
return; return;
} }
@@ -96,6 +100,7 @@ const SignupPage = (props) => {
emailElement.current.value = ""; emailElement.current.value = "";
passwordElement.current.value = ""; passwordElement.current.value = "";
setPasswordStrength(""); setPasswordStrength("");
setLoading(false);
}; };
return ( return (
@@ -107,6 +112,7 @@ const SignupPage = (props) => {
</h1> </h1>
<p className="text-gray-100">{t("signup_welcome", language)}</p> <p className="text-gray-100">{t("signup_welcome", language)}</p>
<p className="text-gray-100 mb-6">{t("signup_subtitle", language)}</p> <p className="text-gray-100 mb-6">{t("signup_subtitle", language)}</p>
<form className="space-y-6" onSubmit={handleRegisteration}> <form className="space-y-6" onSubmit={handleRegisteration}>
<div className="flex flex-col gap-5 sm:flex-row"> <div className="flex flex-col gap-5 sm:flex-row">
<div className="w-full"> <div className="w-full">
@@ -199,10 +205,20 @@ const SignupPage = (props) => {
{error && <p className="text-red-500 text-sm font-medium">{error}</p>} {error && <p className="text-red-500 text-sm font-medium">{error}</p>}
{loading && (
<div className="flex justify-center text-white font-medium">
Checking if password was leaked...
<div className="ml-2 animate-spin rounded-full h-5 w-5 border-t-2 border-b-2 border-blue-500"></div>
</div>
)}
<div className="flex justify-center"> <div className="flex justify-center">
<button <button
type="submit" type="submit"
className="text-white w-1/2 backdrop-blur-lg bg-gradient-to-tr from-slate-100/15 to-slate-200/15 shadow-lg hover:backdrop-blur-lg focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5" disabled={loading}
className={`text-white w-1/2 backdrop-blur-lg bg-gradient-to-tr from-slate-100/15 to-slate-200/15 shadow-lg hover:backdrop-blur-lg focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 ${
loading ? "opacity-50 cursor-not-allowed" : ""
}`}
> >
{t("signup_register_button", language)} {t("signup_register_button", language)}
</button> </button>