'use client'; /** * Register Page Component */ import { useState, useEffect } from 'react'; import { PasswordStrengthIndicator } from '@zen/core/shared/components'; export default function RegisterPage({ onSubmit, onNavigate, currentUser = null }) { const [error, setError] = useState(''); const [isLoading, setIsLoading] = useState(false); const [success, setSuccess] = useState(''); const [formData, setFormData] = useState({ name: '', email: '', password: '', confirmPassword: '' }); const [honeypot, setHoneypot] = useState(''); const [formLoadedAt, setFormLoadedAt] = useState(0); useEffect(() => { setFormLoadedAt(Date.now()); }, []); // Validation functions const validateEmail = (email) => { const errors = []; if (email.length > 254) { errors.push('L\'e-mail doit contenir 254 caractères ou moins'); } return errors; }; const validatePassword = (password) => { const errors = []; if (password.length < 8) { errors.push('Le mot de passe doit contenir au moins 8 caractères'); } if (password.length > 128) { errors.push('Le mot de passe doit contenir 128 caractères ou moins'); } if (!/[A-Z]/.test(password)) { errors.push('Le mot de passe doit contenir au moins une majuscule'); } if (!/[a-z]/.test(password)) { errors.push('Le mot de passe doit contenir au moins une minuscule'); } if (!/\d/.test(password)) { errors.push('Le mot de passe doit contenir au moins un chiffre'); } return errors; }; const validateName = (name) => { const errors = []; if (name.trim().length === 0) { errors.push('Le nom ne peut pas être vide'); } if (name.length > 100) { errors.push('Le nom doit contenir 100 caractères ou moins'); } return errors; }; const isFormValid = () => { const emailErrors = validateEmail(formData.email); const passwordErrors = validatePassword(formData.password); const nameErrors = validateName(formData.name); return emailErrors.length === 0 && passwordErrors.length === 0 && nameErrors.length === 0 && formData.password === formData.confirmPassword && formData.email.trim().length > 0; }; const handleChange = (e) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value })); }; async function handleSubmit(e) { e.preventDefault(); setError(''); setSuccess(''); setIsLoading(true); // Frontend validation const emailErrors = validateEmail(formData.email); const passwordErrors = validatePassword(formData.password); const nameErrors = validateName(formData.name); if (emailErrors.length > 0) { setError(emailErrors[0]); // Show first error setIsLoading(false); return; } if (passwordErrors.length > 0) { setError(passwordErrors[0]); // Show first error setIsLoading(false); return; } if (nameErrors.length > 0) { setError(nameErrors[0]); // Show first error setIsLoading(false); return; } // Validate password match if (formData.password !== formData.confirmPassword) { setError('Les mots de passe ne correspondent pas'); setIsLoading(false); return; } const submitData = new FormData(); submitData.append('name', formData.name); submitData.append('email', formData.email); submitData.append('password', formData.password); submitData.append('confirmPassword', formData.confirmPassword); submitData.append('_hp', honeypot); submitData.append('_t', String(formLoadedAt)); try { const result = await onSubmit(submitData); if (result.success) { setSuccess(result.message); setIsLoading(false); } else { setError(result.error || 'Échec de l\'inscription'); setIsLoading(false); } } catch (err) { console.error('Registration error:', err); setError('Une erreur inattendue s\'est produite'); setIsLoading(false); } } const inputClasses = 'w-full px-3 py-2.5 rounded-lg text-sm focus:outline-none transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed bg-white border border-neutral-300 text-neutral-900 placeholder-neutral-400 focus:border-neutral-500 focus:ring-1 focus:ring-neutral-500/20 dark:bg-neutral-900 dark:border-neutral-700/50 dark:text-white dark:placeholder-neutral-500 dark:focus:border-neutral-600 dark:focus:ring-neutral-600/20'; return (
Inscrivez-vous pour commencer.