// import OAuthGoogle from "./OAuthGoogle"; import axios from "axios"; import { useRef, useState } from "react"; // import { FcGoogle } from "react-icons/fc"; import { Link, useNavigate } from "react-router-dom"; import OAuthGoogle from "./OAuthGoogle"; // import Cookies from "js-cookie"; import { BsEye } from "react-icons/bs"; import { FiEyeOff } from "react-icons/fi"; import { TokenStorage } from "../../config/api"; // import api from "../../config/api"; interface FormDataState { email: string; password: string; } const LoginForm = ({ onSwitchToRegister }) => { const [formData, setForm] = useState({ email: "", password: "" }); const [cacheKey, setCacheKey] = useState(""); const [nextClick, setNextClick] = useState(false); const [showPassword, setShowPassword] = useState(false); const [errors, setErrors] = useState({ email: "", password: "" }); const [isLoading, setIsLoading] = useState(false); const formErrorRef = useRef<{ message: string; error: boolean }>({ message: "", error: false }); const navigate = useNavigate() const validateEmail = (email) => { const trimmedEmail = email.trim(); if (!trimmedEmail) { return "Email address is required"; } if (trimmedEmail.length > 254) { return "Email address is too long"; } const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(trimmedEmail)) { return "Please enter a valid email address"; } // Check for common typos const commonDomains = ['gmail.com', 'yahoo.com', 'hotmail.com', 'outlook.com']; const domain = trimmedEmail.split('@')[1]; const commonTypos = { 'gmial.com': 'gmail.com', 'gmai.com': 'gmail.com', 'yahooo.com': 'yahoo.com', 'hotmial.com': 'hotmail.com' }; if (commonTypos[domain]) { return `Did you mean ${trimmedEmail.replace(domain, commonTypos[domain])}?`; } return ""; }; const validatePassword = (password) => { if (!password) { return "Password is required"; } return ""; }; const handleEmailChange = (e) => { const email = e.target.value; setForm({ ...formData, email }); // Clear error when user starts typing if (errors.email) { setErrors({ ...errors, email: "" }); } }; const handlePasswordChange = (e) => { const password = e.target.value; setForm({ ...formData, password }); // Clear error when user starts typing if (errors.password) { setErrors({ ...errors, password: "" }); } }; const handleFormLoginClick = async () => { const emailError = validateEmail(formData.email); const passwordError = validatePassword(formData.password); if (emailError || passwordError) { setErrors({ email: emailError, password: passwordError }); return; } setIsLoading(true); setErrors({ email: "", password: "" }); try { const res = await axios.post( `${import.meta.env.VITE_BASE_URI}/api/v1/auth/login`, { email: formData.email, password: formData.password }, { withCredentials: true, headers: { "ngrok-skip-browser-warning": "69420", "Access-Control-Allow-Origin": "*", }, } ); if (res.status == 200) { TokenStorage.setTokens(res.data.accessToken, res.data.refreshToken) formErrorRef.current = { message: "Login Successfully", error: false } navigate("/"); } } catch (err) { if (err.response?.status == 400 || err.response?.status == 401) { formErrorRef.current = { message: "The email or password you entered is invalid.", error: true } } else if(err.response?.status == 404) { formErrorRef.current = { message: "Email not found. Please sign up to continue.", error: true } } else { formErrorRef.current = { message: "Something went wrong. Please refresh and try again.", error: true } } } finally { setIsLoading(false); } }; const handleGoogleLogin = () => { // Your Google OAuth logic here console.log("Google login clicked"); }; return (
{errors.email}
)}{formErrorRef.current.message}
{/* )} */}