import React, { useState } from 'react'; import { Eye, EyeOff, Mail, Lock, User, ArrowRight, Shield, Phone, Globe } from 'lucide-react'; import { useAppConfig } from '../contexts/AppConfigContext'; import '../styles/Signup.css'; const Signup = ({ onNavigateToLogin, onNavigateToHome }) => { const { config } = useAppConfig(); const [showPassword, setShowPassword] = useState(false); const [showConfirmPassword, setShowConfirmPassword] = useState(false); const [formData, setFormData] = useState({ firstName: '', lastName: '', email: '', password: '', confirmPassword: '', academicStage: '', researchArea: '' }); const [isLoading, setIsLoading] = useState(false); const [errors, setErrors] = useState({}); const knowledgeLevels = config?.login?.knowledge_levels?.length ? config.login.knowledge_levels : config?.login?.academic_stages?.length ? config.login.academic_stages : [ { value: '', label: 'Select your cybersecurity knowledge level' }, { value: 'newcomer', label: 'New to cybersecurity' }, { value: 'foundational', label: 'Foundational' }, { value: 'practitioner', label: 'Practitioner' }, { value: 'experienced', label: 'Experienced' }, { value: 'expert', label: 'Expert / specialist' }, ]; const timezones = config?.login?.timezones?.length ? config.login.timezones : [{ value: '', label: 'Select timezone (optional)' }]; const handleInputChange = (e) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value })); // Clear error when user starts typing if (errors[name]) { setErrors(prev => ({ ...prev, [name]: '' })); } }; const validateForm = () => { const newErrors = {}; if (!formData.firstName.trim()) { newErrors.firstName = 'First name is required'; } if (!formData.lastName.trim()) { newErrors.lastName = 'Last name is required'; } if (!formData.email) { newErrors.email = 'Email is required'; } else if (!/\S+@\S+\.\S+/.test(formData.email)) { newErrors.email = 'Please enter a valid email address'; } if (!formData.password) { newErrors.password = 'Password is required'; } else if (formData.password.length < 8) { newErrors.password = 'Password must be at least 8 characters'; } else if (!/(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/.test(formData.password)) { newErrors.password = 'Password must contain uppercase, lowercase, and number'; } if (!formData.confirmPassword) { newErrors.confirmPassword = 'Please confirm your password'; } else if (formData.password !== formData.confirmPassword) { newErrors.confirmPassword = 'Passwords do not match'; } if (!formData.academicStage) { newErrors.academicStage = 'Please select your cybersecurity knowledge level'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = async (e) => { e.preventDefault(); if (!validateForm()) return; setIsLoading(true); try { const response = await fetch(`${process.env.REACT_APP_API_URL}/auth/signup`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ firstName: formData.firstName, lastName: formData.lastName, email: formData.email, password: formData.password, academicStage: formData.academicStage, researchArea: formData.researchArea }), }); const data = await response.json(); if (response.ok) { // Store the token and user info localStorage.setItem('authToken', data.access_token); localStorage.setItem('user', JSON.stringify(data.user)); onNavigateToHome?.(data.user, data.access_token); } else { setErrors({ submit: data.detail || 'Signup failed. Please try again.' }); } } catch (error) { console.error('Signup error:', error); setErrors({ submit: 'Signup failed. Please try again.' }); } finally { setIsLoading(false); } }; const handleGoogleSignUp = () => { console.log('Google Sign Up clicked'); // Future Google Auth integration will go here }; const handlePhoneSignUp = () => { console.log('Phone Sign Up clicked'); // Future Phone Auth integration will go here }; return (
{config?.login?.signup_subtitle || 'Create your account to get personalized guidance from expert advisors'}
Already have an account?{' '}