import { useEffect, useState } from 'react'; import { Link, useNavigate } from 'react-router'; import { useAuth } from '../contexts/AuthContext'; const Register = () => { const [formData, setFormData] = useState({ username: '', email: '', password: '', confirmPassword: '', code: '' }); const [errors, setErrors] = useState>({}); const [requireInvite, setRequireInvite] = useState(false); const [isLoading, setIsLoading] = useState(false); useEffect(() => { const fetchServerInfo = async () => { try { const response = await fetch(import.meta.env.VITE_API_URL + "/info"); const data = await response.json(); setRequireInvite(Boolean(data.requireInvite)); } catch (error) { console.error('Error fetching server info:', error); } }; fetchServerInfo(); }, []); const handleChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value })); if (errors[name]) { setErrors(prev => ({ ...prev, [name]: '' })); } }; const validateForm = () => { const newErrors: Record = {}; if (!formData.username.trim()) { newErrors.username = 'Username is required'; } else if (formData.username.length < 3) { newErrors.username = 'Username must be at least 3 characters'; } if (!formData.email.trim()) { newErrors.email = 'Email is required'; } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(formData.email)) { newErrors.email = 'Please enter a valid email address'; } if (!formData.password) { newErrors.password = 'Password is required'; } else if (formData.password.length < 6) { newErrors.password = 'Password must be at least 6 characters'; } if (!formData.confirmPassword) { newErrors.confirmPassword = 'Please confirm your password'; } else if (formData.password !== formData.confirmPassword) { newErrors.confirmPassword = 'Passwords do not match'; } if (requireInvite && !formData.code.trim()) { newErrors.code = 'Invite code is required'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const { register } = useAuth(); const navigate = useNavigate(); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) return; setIsLoading(true); try { const registrationData = { username: formData.username, email: formData.email, password: formData.password, ...(requireInvite && { code: formData.code }) }; const result = await register(registrationData); if (!result.success) { setErrors({ general: result.error || 'Registration failed. Please try again.' }); return; } // Redirect to home page on successful registration navigate('/home'); } catch (error) { console.error('Registration failed:', error); setErrors({ general: 'Network error. Please try again.' }); } finally { setIsLoading(false); } }; return (
{/* Header */}
M
Mirage

Create your account

Already have an account?{' '} Sign in here

{/* Form */}
{errors.general && (

{errors.general}

)}
{requireInvite && (
{errors.code && (

{errors.code}

)}
)}
{errors.username && (

{errors.username}

)}
{errors.email && (

{errors.email}

)}
{errors.password && (

{errors.password}

)}
{errors.confirmPassword && (

{errors.confirmPassword}

)}
); }; export default Register;