import React, { useState, useEffect } from 'react'; import { useAuthContext } from '../AuthContext'; import { useNavigate, useSearchParams } from 'react-router-dom'; const EMAIL_FOR_SIGN_IN_KEY = 'emailForSignIn'; const Login: React.FC = () => { const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [isSignUp, setIsSignUp] = useState(false); const [displayName, setDisplayName] = useState(''); const [completingEmailLink, setCompletingEmailLink] = useState(false); const [emailForLinkCompletion, setEmailForLinkCompletion] = useState(''); const { loading, error, signInWithGoogle, signInWithEmail, signUpWithEmail, signInWithEmailLink, isSignInWithEmailLink, clearError, } = useAuthContext(); const navigate = useNavigate(); const [searchParams] = useSearchParams(); // Redirect on successful auth const { user } = useAuthContext(); useEffect(() => { if (user) { const returnUrl = searchParams.get('returnUrl') || '/'; navigate(returnUrl, { replace: true }); } }, [user, navigate, searchParams]); // Check if user is returning from email link useEffect(() => { if (isSignInWithEmailLink(window.location.href)) { const emailForSignIn = window.localStorage.getItem(EMAIL_FOR_SIGN_IN_KEY); if (emailForSignIn) { setCompletingEmailLink(true); signInWithEmailLink(emailForSignIn, window.location.href) .then(() => { window.localStorage.removeItem(EMAIL_FOR_SIGN_IN_KEY); window.history.replaceState({}, document.title, '/login'); setCompletingEmailLink(false); }) .catch(() => { setCompletingEmailLink(false); setEmailForLinkCompletion(emailForSignIn); }); } else { setCompletingEmailLink(true); setEmailForLinkCompletion(''); } } }, [signInWithEmailLink, isSignInWithEmailLink]); const handleGoogleSignIn = async () => { clearError(); await signInWithGoogle(); }; const handleEmailAuth = async (e: React.FormEvent) => { e.preventDefault(); clearError(); if (isSignUp) { await signUpWithEmail(email, password, displayName); } else { await signInWithEmail(email, password); } }; const handleCompleteEmailLink = async (e: React.FormEvent) => { e.preventDefault(); if (!emailForLinkCompletion.trim()) return; await signInWithEmailLink(emailForLinkCompletion, window.location.href); window.localStorage.removeItem(EMAIL_FOR_SIGN_IN_KEY); window.history.replaceState({}, document.title, '/login'); setCompletingEmailLink(false); setEmailForLinkCompletion(''); }; return (

{completingEmailLink ? 'Complete sign-in' : isSignUp ? 'Create your account' : 'Sign in to your account'}

{completingEmailLink && (

Please enter your email address to complete sign-in.

setEmailForLinkCompletion(e.target.value)} className="appearance-none rounded-md relative block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 placeholder-gray-500 dark:placeholder-gray-400 text-gray-900 dark:text-gray-100 bg-white dark:bg-gray-700 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" placeholder="Enter your email" />
{error && (
{error}
)}
)} {!completingEmailLink && ( <>
Or sign in with email
{isSignUp && ( setDisplayName(e.target.value)} /> )} setEmail(e.target.value)} /> setPassword(e.target.value)} /> {error && (
{error}
)}
)}
); }; export default Login;