import { useState } from 'react'; import { Link, useNavigate } from 'react-router-dom'; import './Register.css'; import { AUTH_API_BASE_URL } from '../constants/api'; import { DATA_KEY_REGISTERED_USER_ID } from '../constants/app'; const Register = () => { const navigate = useNavigate(); const [formData, setFormData] = useState({ username: '', password: '', confirmPassword: '', phoneNumber: '', }); const [errors, setErrors] = useState({}); const [isLoading, setIsLoading] = useState(false); const handleChange = (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 = {}; // Username validation if (!formData.username.trim()) { newErrors.username = 'Username is required'; } else if (formData.username.length < 3) { newErrors.username = 'Username must be at least 3 characters'; } // Password validation if (!formData.password) { newErrors.password = 'Password is required'; } else if (formData.password.length < 6) { newErrors.password = 'Password must be at least 6 characters'; } // Confirm password validation if (formData.password !== formData.confirmPassword) { newErrors.confirmPassword = 'Passwords do not match'; } // Phone number validation const phoneRegex = /^[\+]?[1-9][\d]{0,15}$/; if (!formData.phoneNumber.trim()) { newErrors.phoneNumber = 'Phone number is required'; } else if ( !phoneRegex.test(formData.phoneNumber.replace(/[\s\-\(\)]/g, '')) ) { newErrors.phoneNumber = 'Please enter a valid phone number'; } return newErrors; }; const handleSubmit = async (e) => { e.preventDefault(); setIsLoading(true); const validationErrors = validateForm(); if (Object.keys(validationErrors).length > 0) { setErrors(validationErrors); setIsLoading(false); return; } try { // Prepare data for API call (remove confirmPassword) const { confirmPassword, ...userData } = formData; const reqBod = { phone_number: userData.phoneNumber, username: userData.username, password: userData.password, }; const response = await fetch(`${AUTH_API_BASE_URL}/api/v1/register`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(reqBod), }); if (response.ok) { alert('Registration successful! Redirecting to login...'); const res = await response.json(); console.log(`Result: ${res.message}`); localStorage.setItem(DATA_KEY_REGISTERED_USER_ID, res.data[0].id); navigate('/login'); } else { console.error('Error registering'); setErrors({ submit: 'Registration failed. Please try again.' }); } } catch (error) { console.error('Registration error:', error); setErrors({ submit: 'Registration failed. Please try again.' }); } finally { setIsLoading(false); } }; const formatPhoneNumber = (value) => { // Remove all non-digit characters const cleaned = value.replace(/\D/g, ''); // Format as (XXX) XXX-XXXX for US numbers if (cleaned.length <= 3) { return cleaned; } else if (cleaned.length <= 6) { return `(${cleaned.slice(0, 3)}) ${cleaned.slice(3)}`; } else { return `(${cleaned.slice(0, 3)}) ${cleaned.slice(3, 6)}-${cleaned.slice(6, 10)}`; } }; const handlePhoneChange = (e) => { const formatted = formatPhoneNumber(e.target.value); setFormData((prev) => ({ ...prev, phoneNumber: formatted, })); }; return (

Create Account

{errors.submit && (
{errors.submit}
)}
{errors.username && ( {errors.username} )}
{errors.phoneNumber && ( {errors.phoneNumber} )}
{errors.password && ( {errors.password} )} Minimum 6 characters
{errors.confirmPassword && ( {errors.confirmPassword} )}

Already have an account?{' '} Sign In

By creating an account, you agree to our{' '} Terms of Service {' '} and{' '} Privacy Policy

); }; export default Register;