"use client"; import { useState, useRef, type ChangeEvent, type FormEvent } from "react"; import { useRouter } from "next/navigation"; import Link from "next/link"; import Navigation from "@/components/Navigation"; export default function RegisterPage() { const router = useRouter(); const [formData, setFormData] = useState({ email: "", username: "", password: "", confirmPassword: "", bio: "", characterClass: null as string | null, avatar: null as string | null, }); const [error, setError] = useState(""); const [loading, setLoading] = useState(false); const [uploadingAvatar, setUploadingAvatar] = useState(false); const [step, setStep] = useState(1); const [userId, setUserId] = useState(null); const fileInputRef = useRef(null); const handleChange = ( e: ChangeEvent ) => { setFormData({ ...formData, [e.target.name]: e.target.value, }); }; const handleAvatarUpload = async (e: ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; setUploadingAvatar(true); setError(""); try { const formDataUpload = new FormData(); formDataUpload.append("file", file); const response = await fetch("/api/register/avatar", { method: "POST", body: formDataUpload, }); if (response.ok) { const data = await response.json(); setFormData({ ...formData, avatar: data.url, }); } else { const errorData = await response.json(); setError(errorData.error || "Erreur lors de l'upload de l'avatar"); } } catch (err) { console.error("Error uploading avatar:", err); setError("Erreur lors de l'upload de l'avatar"); } finally { setUploadingAvatar(false); if (fileInputRef.current) { fileInputRef.current.value = ""; } } }; const handleStep1Submit = async (e: React.FormEvent) => { e.preventDefault(); setError(""); if (formData.password !== formData.confirmPassword) { setError("Les mots de passe ne correspondent pas"); return; } if (formData.password.length < 6) { setError("Le mot de passe doit contenir au moins 6 caractères"); return; } setLoading(true); try { const response = await fetch("/api/register", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ email: formData.email, username: formData.username, password: formData.password, bio: null, characterClass: null, avatar: null, }), }); const data = await response.json(); if (!response.ok) { setError(data.error || "Une erreur est survenue"); return; } setUserId(data.userId); setStep(2); } catch { setError("Une erreur est survenue"); } finally { setLoading(false); } }; const handleStep2Submit = async (e: FormEvent) => { e.preventDefault(); setError(""); if (!userId) { setError("Erreur: ID utilisateur manquant"); return; } setLoading(true); try { const response = await fetch("/api/register/complete", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ userId, username: formData.username, bio: formData.bio && formData.bio.trim() ? formData.bio.trim() : null, characterClass: formData.characterClass || null, avatar: formData.avatar || null, }), }); if (!response.ok) { const errorData = await response.json(); setError(errorData.error || "Une erreur est survenue"); return; } router.push("/login?registered=true"); } catch (err) { console.error("Registration completion error:", err); setError(err instanceof Error ? err.message : "Une erreur est survenue"); } finally { setLoading(false); } }; return (
{/* Background Image */}
{/* Register Form */}

INSCRIPTION

{step === 1 ? "Créez votre compte pour commencer" : "Personnalisez votre profil"}

{/* Step Indicator */}
= 1 ? "bg-pixel-gold text-black" : "bg-gray-700 text-gray-400" }`} > 1
= 2 ? "bg-pixel-gold" : "bg-gray-700" }`} />
= 2 ? "bg-pixel-gold text-black" : "bg-gray-700 text-gray-400" }`} > 2
{step === 1 ? (
{error && (
{error}
)}
) : (
{error && (
{error}
)} {/* Avatar Selection */}
{/* Preview */}
{formData.avatar ? ( Avatar ) : formData.username ? ( {formData.username.charAt(0).toUpperCase()} ) : ( ? )}
{uploadingAvatar && (
Upload...
)}
{/* Default Avatars */}
{[ "/avatar-1.jpg", "/avatar-2.jpg", "/avatar-3.jpg", "/avatar-4.jpg", "/avatar-5.jpg", "/avatar-6.jpg", ].map((defaultAvatar) => ( ))}
{/* Custom Upload */}

3-20 caractères