import { useState, useRef } from 'react' import { Link, useNavigate } from 'react-router-dom' import { registerApi, verifyCodeApi } from '../services/auth' import { useAuth } from '../context/AuthContext' // Une naissance ne peut pas être dans le futur : borne haute du sélecteur. const AUJOURD_HUI = new Date().toISOString().split('T')[0] // Valeurs alignées sur le tableau de bord admin, qui compte exactement // "Homme" et "Femme" ; toute autre valeur retombe dans la catégorie "autre". const GENRES = ['Femme', 'Homme', 'Autre'] export default function Inscription() { const navigate = useNavigate() const { login } = useAuth() // Étape : 'form' | 'verify' const [step, setStep] = useState('form') const [email, setEmail] = useState('') const [form, setForm] = useState({ email: '', lastName: '', firstName: '', password: '', birthdate: '', gender: '', }) const [acceptedTerms, setAcceptedTerms] = useState(false) // Consentement marketing : distinct des CGU et décoché par défaut, il doit // rester un choix libre et non une condition d'inscription. const [marketingOptIn, setMarketingOptIn] = useState(false) const [showPassword, setShowPassword] = useState(false) const [error, setError] = useState('') const [loading, setLoading] = useState(false) // Code à 4 chiffres const [digits, setDigits] = useState(['', '', '', '']) const [codeError, setCodeError] = useState('') const [codeLoading, setCodeLoading] = useState(false) const inputRefs = [useRef(), useRef(), useRef(), useRef()] const handleChange = (e) => setForm({ ...form, [e.target.name]: e.target.value }) // Même route que la connexion : Google crée le compte à la première venue. const handleGoogleSignup = () => { window.location.href = '/api/auth/google' } // Étape 1 — Inscription const handleSubmit = async (e) => { e.preventDefault() setError('') setLoading(true) try { await registerApi({ email: form.email, firstname: form.firstName, lastname: form.lastName, password: form.password, birthdate: form.birthdate, gender: form.gender, marketingOptIn, }) setEmail(form.email) setStep('verify') } catch (err) { setError(err.message) } finally { setLoading(false) } } // Étape 2 — Saisie du code const handleDigit = (index, value) => { if (!/^\d?$/.test(value)) return const next = [...digits] next[index] = value setDigits(next) if (value && index < 3) inputRefs[index + 1].current?.focus() } const handleDigitKeyDown = (index, e) => { if (e.key === 'Backspace' && !digits[index] && index > 0) { inputRefs[index - 1].current?.focus() } } const handleVerify = async (e) => { e.preventDefault() const code = digits.join('') if (code.length !== 4) return setCodeError('') setCodeLoading(true) try { const data = await verifyCodeApi({ email, code }) login(data.user, data.token) navigate('/saisir-code-unique') } catch (err) { setCodeError(err.message) setDigits(['', '', '', '']) inputRefs[0].current?.focus() } finally { setCodeLoading(false) } } // ── Étape 2 : Vérification du code ── if (step === 'verify') { return (
Un code à 4 chiffres a été envoyé à
{email}
Le code expire dans 15 minutes.{' '}
Créer votre compte
Vous avez déjà un compte ?{' '} Se connecter