diff --git a/.env.example b/.env.example index 3f37be1..7706e7f 100644 --- a/.env.example +++ b/.env.example @@ -1,12 +1,12 @@ # Firebase Configuration -REACT_APP_FIREBASE_API_KEY=your_firebase_api_key_here -REACT_APP_FIREBASE_AUTH_DOMAIN=your_project.firebaseapp.com -REACT_APP_FIREBASE_PROJECT_ID=your_project_id -REACT_APP_FIREBASE_STORAGE_BUCKET=your_project.firebasestorage.app -REACT_APP_FIREBASE_MESSAGING_SENDER_ID=your_messaging_sender_id -REACT_APP_FIREBASE_APP_ID=your_app_id -REACT_APP_FIREBASE_MEASUREMENT_ID=your_measurement_id +REACT_APP_FIREBASE_API_KEY="AIzaSyD7g330-A1CGgYElN4s88CS2RMR5pRyJnw" +REACT_APP_FIREBASE_AUTH_DOMAIN="nexus-657c3.firebaseapp.com" +REACT_APP_FIREBASE_PROJECT_ID="nexus-657c3" +REACT_APP_FIREBASE_STORAGE_BUCKET="nexus-657c3.firebasestorage.app" +REACT_APP_FIREBASE_MESSAGING_SENDER_ID="875080966871" +REACT_APP_FIREBASE_APP_ID="1:875080966871:web:f51ef8679e56b5a86a8692" +REACT_APP_FIREBASE_MEASUREMENT_ID="G-6XMGFFC9NL" -# TMDB API Configuration -REACT_APP_TMDB_API_KEY=your_tmdb_api_key_here -REACT_APP_TMDB_ACCESS_TOKEN=your_tmdb_access_token_here +# Optional: TMDB API (for real data) +REACT_APP_TMDB_API_KEY=your_tmdb_api_key +REACT_APP_TMDB_ACCESS_TOKEN=your_tmdb_access_token \ No newline at end of file diff --git a/src/components/Login.js b/src/components/Login.js index d555aa6..0a26055 100644 --- a/src/components/Login.js +++ b/src/components/Login.js @@ -1,4 +1,4 @@ -import React, { useRef, useState } from "react"; +import React, { useRef, useState, useEffect } from "react"; import { useDispatch } from "react-redux"; import { addUser } from "../utils/userSlice"; import { checkValidatedata } from "../utils/validate"; @@ -9,12 +9,15 @@ import { updateProfile, } from "firebase/auth"; import { useNavigate, useLocation } from "react-router-dom"; +import { Mail, Lock, User, LogIn, UserPlus, Sparkles, Shield, Zap, CheckCircle2 } from 'lucide-react'; -// Enhanced Login component with better responsiveness and animations const Login = () => { const [isSignInForm, setIsSignInForm] = useState(true); const [errorMessage, setErrorMessage] = useState(null); + const [successMessage, setSuccessMessage] = useState(null); const [isLoading, setIsLoading] = useState(false); + const [focusedField, setFocusedField] = useState(null); + const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 }); const nameRef = useRef(null); const emailRef = useRef(null); const passwordRef = useRef(null); @@ -22,13 +25,22 @@ const Login = () => { const location = useLocation(); const dispatch = useDispatch(); - // Get the intended destination from location state, default to /browse const from = location.state?.from || '/browse'; + // Track mouse position for interactive effects + useEffect(() => { + const handleMouseMove = (e) => { + setMousePosition({ x: e.clientX, y: e.clientY }); + }; + window.addEventListener('mousemove', handleMouseMove); + return () => window.removeEventListener('mousemove', handleMouseMove); + }, []); + const handleButtonClick = async () => { setIsLoading(true); + setErrorMessage(null); + setSuccessMessage(null); - // Validate the user credentials const email = emailRef.current.value; const password = passwordRef.current.value; const name = !isSignInForm && nameRef.current ? nameRef.current.value : ""; @@ -38,42 +50,30 @@ const Login = () => { if (message) { setIsLoading(false); - return; // Stop if validation fails + return; } - // Sign in and sign up logic if (!isSignInForm) { - // Sign up logic try { - const userCredential = await createUserWithEmailAndPassword( - auth, - email, - password - ); - // Signed up successfully + const userCredential = await createUserWithEmailAndPassword(auth, email, password); const user = userCredential.user; - await updateProfile(auth.currentUser, { - displayName: name, - }); - // Update Redux user state + await updateProfile(auth.currentUser, { displayName: name }); + dispatch(addUser({ uid: user.uid, email: user.email, displayName: name, })); - setErrorMessage(null); - navigate(from, { replace: true }); + + setSuccessMessage("Account created successfully! Redirecting..."); + setTimeout(() => navigate(from, { replace: true }), 1500); } catch (error) { const errorCode = error.code; - const errorMessage = error.message; - console.error("Sign up error:", errorCode, errorMessage); - - // Provide user-friendly error messages let friendlyMessage = ""; + switch (errorCode) { case 'auth/email-already-in-use': - friendlyMessage = "This email is already registered. Please sign in instead or use a different email."; - // Auto-switch to sign-in mode for better UX + friendlyMessage = "This email is already registered. Please sign in instead."; setTimeout(() => { setIsSignInForm(true); setErrorMessage("Switched to Sign In - this email is already registered."); @@ -85,36 +85,29 @@ const Login = () => { case 'auth/invalid-email': friendlyMessage = "Please enter a valid email address."; break; - case 'auth/operation-not-allowed': - friendlyMessage = "Email/password accounts are not enabled. Please contact support."; - break; default: - friendlyMessage = `Sign Up Failed: ${errorMessage}`; + friendlyMessage = `Sign Up Failed: ${error.message}`; } setErrorMessage(friendlyMessage); } } else { - // Sign in logic signInWithEmailAndPassword(auth, email, password) .then((userCredential) => { const user = userCredential.user; - // Update Redux user state dispatch(addUser({ uid: user.uid, email: user.email, displayName: user.displayName, })); - setErrorMessage(null); - navigate(from, { replace: true }); + + setSuccessMessage("Signed in successfully! Redirecting..."); + setTimeout(() => navigate(from, { replace: true }), 1500); }) .catch((error) => { const errorCode = error.code; - const errorMessage = error.message; - console.error("Sign In error:", errorCode, errorMessage); - - // Provide user-friendly error messages let friendlyMessage = ""; + switch (errorCode) { case 'auth/user-not-found': friendlyMessage = "No account found with this email. Please sign up first."; @@ -128,14 +121,11 @@ const Login = () => { case 'auth/too-many-requests': friendlyMessage = "Too many failed attempts. Please try again later."; break; - case 'auth/user-disabled': - friendlyMessage = "This account has been disabled. Please contact support."; - break; case 'auth/invalid-credential': friendlyMessage = "Invalid email or password. Please check your credentials."; break; default: - friendlyMessage = `Sign In Failed: ${errorMessage}`; + friendlyMessage = `Sign In Failed: ${error.message}`; } setErrorMessage(friendlyMessage); @@ -147,12 +137,13 @@ const Login = () => { const toggleSignInForm = () => { setIsSignInForm(!isSignInForm); - setErrorMessage(null); // Clear error message when toggling form + setErrorMessage(null); + setSuccessMessage(null); }; return (
+ {desc} +
- {feature.desc} -
-