Files
web/components/Auth/LoginWithEmailForm.jsx
Husanjonazamov 64af77101f classify web
2026-02-24 12:52:49 +05:00

190 lines
5.6 KiB
JavaScript

import { FaRegEye, FaRegEyeSlash } from "react-icons/fa";
import { Label } from "../ui/label";
import { Input } from "../ui/input";
import { Button } from "../ui/button";
import useAutoFocus from "../Common/useAutoFocus";
import { toast } from "sonner";
import { handleFirebaseAuthError, t } from "@/utils";
import {
getAuth,
sendPasswordResetEmail,
signInWithEmailAndPassword,
} from "firebase/auth";
import { userSignUpApi } from "@/utils/api";
import { useSelector } from "react-redux";
import { Fcmtoken } from "@/redux/reducer/settingSlice";
import { loadUpdateData } from "@/redux/reducer/authSlice";
import { Loader2 } from "lucide-react";
import { useState } from "react";
const LoginWithEmailForm = ({ OnHide }) => {
const emailRef = useAutoFocus();
const auth = getAuth();
const fetchFCM = useSelector(Fcmtoken);
const [loginStates, setLoginStates] = useState({
email: "",
password: "",
IsPasswordVisible: false,
showLoader: false,
});
const { email, password, IsPasswordVisible, showLoader } = loginStates;
const signin = async (email, password) => {
try {
const userCredential = await signInWithEmailAndPassword(
auth,
email,
password
);
if (!userCredential?.user) {
toast.error(t("userNotFound"));
return null;
}
return userCredential;
} catch (error) {
console.error("Error signing in:", error);
throw error;
}
};
const Signin = async (e) => {
e.preventDefault();
if (!email) {
toast.error(t("emailRequired"));
return;
} else if (!/\S+@\S+\.\S+/.test(email)) {
toast.error(t("emailInvalid"));
return;
} else if (!password) {
toast.error(t("passwordRequired"));
return;
} else if (password.length < 6) {
toast.error(t("passwordTooShort"));
return;
}
try {
setLoginStates((prev) => ({ ...prev, showLoader: true }));
const userCredential = await signin(email, password);
const user = userCredential.user;
if (user.emailVerified) {
try {
const response = await userSignUpApi.userSignup({
name: user?.displayName || "",
email: user?.email,
firebase_id: user?.uid,
fcm_id: fetchFCM ? fetchFCM : "",
type: "email",
is_login: 1,
});
const data = response.data;
if (data.error === false) {
loadUpdateData(data);
toast.success(data.message);
OnHide();
} else {
toast.error(data.message);
}
} catch (error) {
console.error("Error:", error);
}
// Add your logic here for verified users
} else {
toast.error(t("verifyEmailFirst"));
}
} catch (error) {
const errorCode = error.code;
console.log("Error code:", errorCode);
handleFirebaseAuthError(errorCode);
} finally {
setLoginStates((prev) => ({ ...prev, showLoader: false }));
}
};
const handleForgotModal = async (e) => {
e.preventDefault();
await sendPasswordResetEmail(auth, email)
.then(() => {
toast.success(t("resetPassword"));
})
.catch((error) => {
console.log("error", error);
handleFirebaseAuthError(error?.code);
});
};
return (
<>
<form className="flex flex-col gap-6" onSubmit={Signin}>
<div className="labelInputCont">
<Label className="requiredInputLabel">{t("email")}</Label>
<Input
type="email"
placeholder={t("enterEmail")}
value={email}
onChange={(e) =>
setLoginStates((prev) => ({ ...prev, email: e.target.value }))
}
ref={emailRef}
/>
</div>
<div className="labelInputCont">
<Label className="requiredInputLabel">{t("password")}</Label>
<div className="flex items-center relative">
<Input
type={IsPasswordVisible ? "text" : "password"}
placeholder={t("enterPassword")}
className="ltr:pr-9 rtl:pl-9"
value={password}
onChange={(e) =>
setLoginStates((prev) => ({
...prev,
password: e.target.value,
}))
}
/>
<button
type="button"
className="absolute ltr:right-3 rtl:left-3 cursor-pointer"
onClick={() =>
setLoginStates((prev) => ({
...prev,
IsPasswordVisible: !prev.IsPasswordVisible,
}))
}
>
{IsPasswordVisible ? (
<FaRegEye size={20} />
) : (
<FaRegEyeSlash size={20} />
)}
</button>
</div>
<button
className="text-right font-semibold text-primary"
onClick={handleForgotModal}
type="button"
>
{t("forgtPassword")}
</button>
</div>
<Button
className="text-xl text-white font-light px-4 py-2"
size="big"
disabled={showLoader}
>
{showLoader ? (
<Loader2 className="size-6 animate-spin" />
) : (
t("signIn")
)}
</Button>
</form>
</>
);
};
export default LoginWithEmailForm;