import React, { useState } from 'react'; import Modal from './Modal'; import Spinner from './common/Spinner'; import { login, register, forgotPassword } from '../client/auth-client'; const VIEW = { LOGIN: 'login', REGISTER: 'register', FORGOT_PASSWORD: 'forgot_password', }; export default function AuthModal({ isOpen, setIsOpen, onAuthSuccess }) { const [view, setView] = useState(VIEW.LOGIN); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(''); const [loginUsername, setLoginUsername] = useState(''); const [loginPassword, setLoginPassword] = useState(''); const [registerUsername, setRegisterUsername] = useState(''); const [registerEmail, setRegisterEmail] = useState(''); const [registerPassword, setRegisterPassword] = useState(''); const [registerConfirmPassword, setRegisterConfirmPassword] = useState(''); const [forgotEmail, setForgotEmail] = useState(''); const [successMessage, setSuccessMessage] = useState(''); const resetForm = () => { setLoginUsername(''); setLoginPassword(''); setRegisterUsername(''); setRegisterEmail(''); setRegisterPassword(''); setRegisterConfirmPassword(''); setForgotEmail(''); setError(''); setSuccessMessage(''); }; const handleClose = () => { resetForm(); setView(VIEW.LOGIN); }; const switchView = newView => { resetForm(); setView(newView); }; const handleLogin = async e => { e.preventDefault(); setError(''); if (!loginUsername || !loginPassword) { setError('Please fill in all fields'); return; } setIsLoading(true); const result = await login(loginUsername, loginPassword); setIsLoading(false); if (result.success) { resetForm(); setIsOpen(false); if (onAuthSuccess) { onAuthSuccess(result.value); } } else { setError(result.error || 'Login failed'); } }; const handleRegister = async e => { e.preventDefault(); setError(''); if (!registerUsername || !registerEmail || !registerPassword || !registerConfirmPassword) { setError('Please fill in all fields'); return; } if (registerPassword !== registerConfirmPassword) { setError('Passwords do not match'); return; } if (registerPassword.length < 8) { setError('Password must be at least 8 characters'); return; } setIsLoading(true); const result = await register(registerUsername, registerEmail, registerPassword); setIsLoading(false); if (result.success) { resetForm(); setIsOpen(false); if (onAuthSuccess) { onAuthSuccess(result.value); } } else { setError(result.error || 'Registration failed'); } }; const handleForgotPassword = async e => { e.preventDefault(); setError(''); setSuccessMessage(''); if (!forgotEmail) { setError('Please enter your email address'); return; } setIsLoading(true); const result = await forgotPassword(forgotEmail); setIsLoading(false); if (result.success) { setSuccessMessage(result.value.message); setForgotEmail(''); } else { setError(result.error || 'Failed to send reset email'); } }; return ( {view === VIEW.LOGIN && 'Login'} {view === VIEW.REGISTER && 'Create Account'} {view === VIEW.FORGOT_PASSWORD && 'Reset Password'} {view === VIEW.LOGIN && (
{error &&
{error}
}
)} {view === VIEW.REGISTER && (
{error &&
{error}
}
)} {view === VIEW.FORGOT_PASSWORD && (

Enter your email address and we'll send you a link to reset your password.

{error &&
{error}
} {successMessage &&
{successMessage}
}
)}
{view === VIEW.LOGIN && (

Don't have an account?{' '}

)} {view === VIEW.REGISTER && (

Already have an account?{' '}

)} {view === VIEW.FORGOT_PASSWORD && (

Remember your password?{' '}

)}
); }