"use client"; import { useState, useRef } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { useAuth } from "@/contexts/AuthContext"; import { registerSchema, RegisterFormData } from "@/lib/validations"; import Link from "next/link"; import TeaIconsBackground from "@/components/TeaIconsBackground"; import { ROUTES, API_BASE_URL, API_ENDPOINTS } from "@/utils/constants"; import { isValidEmail } from "@/utils/helpers"; import ReCAPTCHA from "react-google-recaptcha"; export default function RegisterPage() { const { register: registerUser } = useAuth(); const [isSubmitting, setIsSubmitting] = useState(false); const [showPassword, setShowPassword] = useState(false); const [showConfirmPassword, setShowConfirmPassword] = useState(false); const [animationKey] = useState(Date.now()); const [captchaToken, setCaptchaToken] = useState(null); const [captchaError, setCaptchaError] = useState(false); const recaptchaRef = useRef(null); // Email validation state const [emailStatus, setEmailStatus] = useState<{ checking: boolean; exists: boolean | null; valid: boolean | null; message: string; }>({ checking: false, exists: null, valid: null, message: '' }); const { register, handleSubmit, formState: { errors }, } = useForm({ resolver: zodResolver(registerSchema), }); const onCaptchaChange = (token: string | null) => { setCaptchaToken(token); setCaptchaError(false); }; // Vérifier si l'email existe déjà const checkEmail = async (email: string) => { if (!email || !isValidEmail(email)) { setEmailStatus({ checking: false, exists: null, valid: null, message: '' }); return; } setEmailStatus({ checking: true, exists: null, valid: null, message: 'Vérification...' }); try { const response = await fetch(`${API_BASE_URL}${API_ENDPOINTS.AUTH.CHECK_EMAIL}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email }), }); const data = await response.json(); setEmailStatus({ checking: false, exists: data.exists, valid: data.isValid, message: data.message, }); } catch (error) { console.error('Error checking email:', error); setEmailStatus({ checking: false, exists: null, valid: null, message: '' }); } }; const onSubmit = async (data: RegisterFormData) => { // Vérifier si l'email existe déjà if (emailStatus.exists) { return; } // Vérifier le captcha if (!captchaToken) { setCaptchaError(true); return; } setIsSubmitting(true); try { await registerUser({ ...data, captchaToken }); } catch (error) { console.error("Registration error:", error); // Reset captcha en cas d'erreur recaptchaRef.current?.reset(); setCaptchaToken(null); } finally { setIsSubmitting(false); } }; return (
{/* Title */}

Inscription

Créez un compte pour participer au jeu-concours

{/* Main Card */}
{/* Tabs */}
Connexion
{/* Form Container */}
{/* Registration Form */}
{/* Prénom et Nom */}
{errors.firstName && (

{errors.firstName.message}

)}
{errors.lastName && (

{errors.lastName.message}

)}
{/* Email */}
checkEmail(e.target.value)} className={`w-full px-4 py-3 border ${ errors.email || emailStatus.exists ? 'border-red-500' : emailStatus.valid ? 'border-primary-500' : 'border-gray-300' } rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent pr-10`} /> {/* Status icon */} {emailStatus.checking && (
)} {!emailStatus.checking && emailStatus.valid && (
)} {!emailStatus.checking && emailStatus.exists && (
)}
{errors.email && (

{errors.email.message}

)} {!errors.email && emailStatus.message && (

{emailStatus.message}

)}
{/* Téléphone */}

Optionnel - Format: 06 12 34 56 78

{errors.phone && (

{errors.phone.message}

)}
{/* Mot de passe */}

Min. 8 caractères, 1 majuscule, 1 minuscule, 1 chiffre

{errors.password && (

{errors.password.message}

)}
{/* Confirmer mot de passe */}
{errors.confirmPassword && (

{errors.confirmPassword.message}

)}
{/* Checkbox CGU */}
{/* reCAPTCHA */}
setCaptchaToken(null)} /> {captchaError && (

Veuillez confirmer que vous n'êtes pas un robot

)}
{/* Submit Button */}
); }