import React, { useState } from 'react'; import { Eye, EyeOff, Loader2, Check } from 'lucide-react'; import toast from 'react-hot-toast'; import { useAuth, RegisterRequest } from '../../api'; interface RegisterPageProps { onLogin: (user: any, token: string) => void; onNavigateToLogin: () => void; } interface RegisterForm { fullName: string; email: string; password: string; confirmPassword: string; acceptTerms: boolean; } const RegisterPage: React.FC = ({ onLogin, onNavigateToLogin }) => { const { register, isLoading, error } = useAuth(); const [formData, setFormData] = useState({ fullName: '', email: '', password: '', confirmPassword: '', acceptTerms: false }); const [showPassword, setShowPassword] = useState(false); const [showConfirmPassword, setShowConfirmPassword] = useState(false); const [errors, setErrors] = useState>({}); const validateForm = (): boolean => { const newErrors: Partial = {}; if (!formData.fullName.trim()) { newErrors.fullName = 'El nombre completo es obligatorio'; } else if (formData.fullName.trim().length < 2) { newErrors.fullName = 'El nombre debe tener al menos 2 caracteres'; } if (!formData.email) { newErrors.email = 'El email es obligatorio'; } else if (!/\S+@\S+\.\S+/.test(formData.email)) { newErrors.email = 'El email no es válido'; } if (!formData.password) { newErrors.password = 'La contraseña es obligatoria'; } else if (formData.password.length < 8) { newErrors.password = 'La contraseña debe tener al menos 8 caracteres'; } if (formData.password !== formData.confirmPassword) { newErrors.confirmPassword = 'Las contraseñas no coinciden'; } if (!formData.acceptTerms) { newErrors.acceptTerms = 'Debes aceptar los términos y condiciones'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) return; try { const registerData: RegisterRequest = { email: formData.email, password: formData.password, full_name: formData.fullName, role: 'user' // Default role }; await register(registerData); toast.success('¡Registro exitoso! Bienvenido a PanIA'); // The useAuth hook handles auto-login after registration // Get the user data from localStorage since useAuth auto-logs in const userData = localStorage.getItem('user_data'); const token = localStorage.getItem('auth_token'); if (userData && token) { onLogin(JSON.parse(userData), token); } } catch (error) { console.error('Registration error:', error); toast.error(error instanceof Error ? error.message : 'Error en el registro'); } }; const handleInputChange = (e: React.ChangeEvent) => { const { name, value, type, checked } = e.target; setFormData(prev => ({ ...prev, [name]: type === 'checkbox' ? checked : value })); // Clear error when user starts typing if (errors[name as keyof RegisterForm]) { setErrors(prev => ({ ...prev, [name]: undefined })); } }; const getPasswordStrength = (password: string) => { let strength = 0; if (password.length >= 8) strength++; if (/[a-z]/.test(password)) strength++; if (/[A-Z]/.test(password)) strength++; if (/\d/.test(password)) strength++; if (/[^A-Za-z0-9]/.test(password)) strength++; return strength; }; const passwordStrength = getPasswordStrength(formData.password); const strengthLabels = ['Muy débil', 'Débil', 'Regular', 'Buena', 'Excelente']; const strengthColors = ['bg-red-500', 'bg-orange-500', 'bg-yellow-500', 'bg-blue-500', 'bg-green-500']; return (
{/* Logo and Header */}
🥖

Únete a PanIA

Crea tu cuenta y transforma tu panadería

Únete a más de 500 panaderías en Madrid

{/* Register Form */}
{/* Full Name Field */}
{errors.fullName && (

{errors.fullName}

)}
{/* Email Field */}
{errors.email && (

{errors.email}

)}
{/* Password Field */}
{/* Password Strength Indicator */} {formData.password && (
{[...Array(5)].map((_, i) => (
))}

Seguridad: {strengthLabels[passwordStrength - 1] || 'Muy débil'}

)} {errors.password && (

{errors.password}

)}
{/* Confirm Password Field */}
{formData.confirmPassword && formData.password === formData.confirmPassword && (
)}
{errors.confirmPassword && (

{errors.confirmPassword}

)}
{/* Terms and Conditions */}
{errors.acceptTerms && (

{errors.acceptTerms}

)}
{/* Submit Button */}
{/* Login Link */}

¿Ya tienes una cuenta?{' '}

{/* Benefits */}

Al registrarte obtienes acceso completo durante 30 días gratis

Predicciones IA
Soporte 24/7
Sin compromiso
); }; export default RegisterPage;