'use client'; import { useState } from 'react'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { useAuth } from '@/lib/contexts/AuthContext'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { AlertCircle, Loader2, CheckCircle2 } from 'lucide-react'; const registerSchema = z .object({ email: z.string().email('Invalid email address'), password: z .string() .min(8, 'Password must be at least 8 characters') .regex(/[A-Z]/, 'Password must contain at least one uppercase letter') .regex(/[a-z]/, 'Password must contain at least one lowercase letter') .regex(/[0-9]/, 'Password must contain at least one number'), confirmPassword: z.string(), username: z .string() .min(3, 'Username must be at least 3 characters') .max(30, 'Username must be at most 30 characters') .regex(/^[a-zA-Z0-9_-]+$/, 'Username can only contain letters, numbers, hyphens, and underscores'), }) .refine((data) => data.password === data.confirmPassword, { message: "Passwords don't match", path: ['confirmPassword'], }); type RegisterFormData = z.infer; interface RegisterFormProps { onSuccess?: () => void; onSwitchToLogin?: () => void; } export function RegisterForm({ onSuccess, onSwitchToLogin }: RegisterFormProps) { const { register: registerUser } = useAuth(); const [error, setError] = useState(''); const [isLoading, setIsLoading] = useState(false); const [success, setSuccess] = useState(false); const { register, handleSubmit, formState: { errors }, watch, } = useForm({ resolver: zodResolver(registerSchema), }); const password = watch('password', ''); const onSubmit = async (data: RegisterFormData) => { setError(''); setIsLoading(true); try { await registerUser({ email: data.email, password: data.password, username: data.username, }); setSuccess(true); setTimeout(() => { onSuccess?.(); }, 2000); } catch (err: any) { const errorMessage = err.response?.data?.detail || err.message || 'Registration failed'; setError(errorMessage); } finally { setIsLoading(false); } }; if (success) { return (

Account Created!

Your account has been successfully created. Redirecting to dashboard...

); } return (
{error && ( {error} )}
{errors.username && (

{errors.username.message}

)}
{errors.email && (

{errors.email.message}

)}
{errors.password && (

{errors.password.message}

)} {password && (

= 8 ? 'text-green-600' : 'text-muted-foreground'}> {password.length >= 8 ? '✓' : '○'} At least 8 characters

{/[A-Z]/.test(password) ? '✓' : '○'} One uppercase letter

{/[a-z]/.test(password) ? '✓' : '○'} One lowercase letter

{/[0-9]/.test(password) ? '✓' : '○'} One number

)}
{errors.confirmPassword && (

{errors.confirmPassword.message}

)}
{onSwitchToLogin && (
)}
); }