import React, { useState, useEffect } from 'react'; import { Navigate, Link } from 'react-router-dom'; import { useAuthStore } from '../store/authStore'; import { AuthLayout } from '../components/AuthLayout'; import { AuthInput } from '../components/AuthInput'; import { AuthButton } from '../components/AuthButton'; import { PasswordStrengthIndicator } from '../components/PasswordStrengthIndicator'; import { useRegister } from '../hooks/useRegister'; import { useUsernameAvailability } from '../hooks/useUsernameAvailability'; import { resendVerificationEmail } from '../services/authService'; import type { RegisterFormData } from '../types'; export function RegisterPage() { const { isAuthenticated } = useAuthStore(); const { mutate: handleRegister, isPending: loading, error, isSuccess: success, } = useRegister(); const [formData, setFormData] = useState({ email: '', password: '', password_confirm: '', username: '', }); const { available: usernameAvailable, checking: checkingUsername } = useUsernameAvailability(formData.username); const [errors, setErrors] = useState< Partial> >({}); const [acceptedTerms, setAcceptedTerms] = useState(false); const [showVerificationNotice, setShowVerificationNotice] = useState(false); const [resendLoading, setResendLoading] = useState(false); const [resendSuccess, setResendSuccess] = useState(false); // Détecter quand l'inscription réussit useEffect(() => { if (success) { setShowVerificationNotice(true); } }, [success]); // Rediriger si déjà connecté if (isAuthenticated) { return ; } const validate = (): boolean => { const newErrors: Partial> = {}; if (!formData.email) { newErrors.email = 'Email requis'; } else if (!/\S+@\S+\.\S+/.test(formData.email)) { newErrors.email = 'Email invalide'; } if (!formData.username) { newErrors.username = "Nom d'utilisateur requis"; } else if (formData.username.length < 3) { newErrors.username = "Le nom d'utilisateur doit contenir au moins 3 caractères"; } else if (usernameAvailable === false) { newErrors.username = "Ce nom d'utilisateur est déjà pris"; } if (!formData.password) { newErrors.password = 'Mot de passe requis'; } else if (formData.password.length < 12) { newErrors.password = 'Le mot de passe doit contenir au moins 12 caractères'; } if (formData.password !== formData.password_confirm) { newErrors.password_confirm = 'Les mots de passe ne correspondent pas'; } if (!acceptedTerms) { newErrors.terms = "Vous devez accepter les conditions d'utilisation et la politique de confidentialité"; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleChange = (field: keyof RegisterFormData, value: string) => { setFormData({ ...formData, [field]: value }); // Clear error for this field when user starts typing if (errors[field]) { setErrors({ ...errors, [field]: undefined }); } }; const handleBlur = (field: keyof RegisterFormData) => { const value = formData[field]; let error: string | undefined; switch (field) { case 'email': if (!value) { error = 'Email requis'; } else if (!/\S+@\S+\.\S+/.test(value)) { error = 'Email invalide'; } break; case 'username': if (!value) { error = "Nom d'utilisateur requis"; } else if (value.length < 3) { error = "Le nom d'utilisateur doit contenir au moins 3 caractères"; } break; case 'password': if (!value) { error = 'Mot de passe requis'; } else if (value.length < 12) { error = 'Le mot de passe doit contenir au moins 12 caractères'; } break; case 'password_confirm': if (formData.password !== value) { error = 'Les mots de passe ne correspondent pas'; } break; } if (error) { setErrors({ ...errors, [field]: error }); } else { setErrors({ ...errors, [field]: undefined }); } }; const onSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (validate()) { await handleRegister(formData); } }; const handleResendVerificationEmail = async () => { try { setResendLoading(true); setResendSuccess(false); await resendVerificationEmail(formData.email); setResendSuccess(true); } catch (err) { // Gérer l'erreur silencieusement ou afficher un message console.error("Erreur lors du renvoi de l'email:", err); } finally { setResendLoading(false); } }; return ( {showVerificationNotice ? (

Inscription réussie !

Un email de vérification a été envoyé à {formData.email}

Veuillez vérifier votre boîte mail et cliquer sur le lien de vérification.

{resendSuccess && (

Email de vérification renvoyé avec succès !

)}
) : (
{error && (
{error.message}
)}
handleChange('username', e.target.value)} onBlur={() => handleBlur('username')} error={errors.username} required autoComplete="username" /> {formData.username.length >= 3 && (
{checkingUsername ? (

Vérification en cours

) : usernameAvailable === true ? (

Disponible: Ce nom d'utilisateur est disponible

) : usernameAvailable === false ? (

Indisponible: Ce nom d'utilisateur est déjà pris

) : null}
)}
handleChange('email', e.target.value)} onBlur={() => handleBlur('email')} error={errors.email} required autoComplete="email" />
handleChange('password', e.target.value)} onBlur={() => handleBlur('password')} error={errors.password} required autoComplete="new-password" />
handleChange('password_confirm', e.target.value)} onBlur={() => handleBlur('password_confirm')} error={errors.password_confirm} required autoComplete="new-password" />
{ setAcceptedTerms(e.target.checked); if (errors.terms) { setErrors({ ...errors, terms: undefined }); } }} className="h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded mt-1" aria-invalid={errors.terms ? 'true' : 'false'} aria-describedby={ errors.terms ? 'terms-error' : 'terms-description' } required />

Vous devez accepter les conditions d'utilisation et la politique de confidentialité pour créer un compte

{errors.terms && ( )} S'inscrire )}
); } export default RegisterPage;