import React, { useState, useCallback } from 'react'; import axios, { handleApiError } from '../utils/axios'; import styles from './Auth.module.css'; interface AuthForm { username: string; email: string; password: string; } interface AuthProps { isLogin: boolean; } const Auth: React.FC = ({ isLogin }) => { const [form, setForm] = useState({ username: '', email: '', password: '' }); const [error, setError] = useState(''); const [isLoading, setIsLoading] = useState(false); const handleChange = useCallback((e: React.ChangeEvent) => { setForm(prev => ({ ...prev, [e.target.name]: e.target.value })); setError(''); // Clear error when user starts typing }, []); const validateForm = useCallback((): boolean => { if (!form.username.trim()) { setError('Username is required'); return false; } if (!form.password.trim()) { setError('Password is required'); return false; } if (!isLogin && !form.email.trim()) { setError('Email is required'); return false; } if (!isLogin && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(form.email)) { setError('Please enter a valid email address'); return false; } return true; }, [form, isLogin]); const handleSubmit = useCallback(async (e: React.FormEvent) => { e.preventDefault(); setError(''); if (!validateForm()) { return; } setIsLoading(true); try { if (isLogin) { const formData = new FormData(); formData.append('username', form.username); formData.append('password', form.password); const res = await axios.post('/login', formData, { headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, }); const { access_token, refresh_token } = res.data; localStorage.setItem('token', access_token); localStorage.setItem('refreshToken', refresh_token); window.location.href = '/editor'; } else { await axios.post('/signup', form); window.location.href = '/login'; } } catch (error) { setError(handleApiError(error)); } finally { setIsLoading(false); } }, [form, isLogin, validateForm]); return (

{isLogin ? 'Login' : 'Sign Up'}

{!isLogin && (
)}
{error &&
{error}
}
); }; export default Auth;