'use client'; import { useState, useEffect } from 'react'; import { Card, Input, Button, PasswordStrengthIndicator } from '@zen/core/shared/components'; import AuthPageHeader from '../components/AuthPageHeader.js'; 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()); }, []); 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 = () => { return validateEmail(formData.email).length === 0 && validatePassword(formData.password).length === 0 && validateName(formData.name).length === 0 && formData.password === formData.confirmPassword && formData.email.trim().length > 0; }; async function handleSubmit(e) { e.preventDefault(); setError(''); setSuccess(''); setIsLoading(true); const emailErrors = validateEmail(formData.email); const passwordErrors = validatePassword(formData.password); const nameErrors = validateName(formData.name); if (emailErrors.length > 0) { setError(emailErrors[0]); setIsLoading(false); return; } if (passwordErrors.length > 0) { setError(passwordErrors[0]); setIsLoading(false); return; } if (nameErrors.length > 0) { setError(nameErrors[0]); setIsLoading(false); return; } 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); } } return ( {currentUser && (
Vous êtes connecté en tant que {currentUser.name}.{' '} Se déconnecter ?
)} {error && !currentUser && !success && (
{error}
)} {success && !currentUser && (
{success}
)}
setFormData(prev => ({ ...prev, name: value }))} placeholder="Lou Doe" disabled={!!success || !!currentUser} maxLength="100" autoComplete="name" required /> setFormData(prev => ({ ...prev, email: value }))} placeholder="votre@courriel.com" disabled={!!success || !!currentUser} maxLength="254" autoComplete="email" required />
setFormData(prev => ({ ...prev, password: value }))} placeholder="••••••••" disabled={!!success || !!currentUser} minLength="8" maxLength="128" autoComplete="new-password" required />
setFormData(prev => ({ ...prev, confirmPassword: value }))} placeholder="••••••••" disabled={!!success || !!currentUser} minLength="8" maxLength="128" autoComplete="new-password" required />
); }