Files
ea-chatbot-lg/frontend/src/components/auth/RegisterForm.tsx

130 lines
4.1 KiB
TypeScript

import { useForm } from "react-hook-form"
import { zodResolver } from "@hookform/resolvers/zod"
import { registerSchema, type RegisterInput } from "@/lib/validations/auth"
import { AuthService } from "@/services/auth"
import { Button } from "@/components/ui/button"
import {
Form,
FormControl,
FormField,
FormItem,
FormLabel,
FormMessage,
} from "@/components/ui/form"
import { Input } from "@/components/ui/input"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
import { useState } from "react"
import { Alert, AlertDescription } from "@/components/ui/alert"
import { AlertCircle } from "lucide-react"
import axios from "axios"
interface RegisterFormProps {
onSuccess: () => void
onToggleMode: () => void
}
export function RegisterForm({ onSuccess, onToggleMode }: RegisterFormProps) {
const [error, setError] = useState<string | null>(null)
const [isLoading, setIsLoading] = useState(false)
const form = useForm<RegisterInput>({
resolver: zodResolver(registerSchema),
defaultValues: {
email: "",
password: "",
confirmPassword: "",
},
})
async function onSubmit(values: RegisterInput) {
setIsLoading(true)
setError(null)
try {
await AuthService.register(values.email, values.password)
// Since backend sets cookie on registration now, we can just call onSuccess
onSuccess()
} catch (err: unknown) {
if (axios.isAxiosError(err)) {
setError(err.response?.data?.detail || "Registration failed. Please try again.")
} else {
setError("An unexpected error occurred.")
}
} finally {
setIsLoading(false)
}
}
return (
<Card className="w-full max-w-md mx-auto">
<CardHeader>
<CardTitle>Create an Account</CardTitle>
<CardDescription>Enter your email and a password to get started.</CardDescription>
</CardHeader>
<CardContent>
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
{error && (
<Alert variant="destructive">
<AlertCircle className="h-4 w-4" />
<AlertDescription>{error}</AlertDescription>
</Alert>
)}
<FormField
control={form.control}
name="email"
render={({ field }) => (
<FormItem>
<FormLabel>Email</FormLabel>
<FormControl>
<Input placeholder="name@example.com" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="password"
render={({ field }) => (
<FormItem>
<FormLabel>Password</FormLabel>
<FormControl>
<Input type="password" placeholder="••••••••" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="confirmPassword"
render={({ field }) => (
<FormItem>
<FormLabel>Confirm Password</FormLabel>
<FormControl>
<Input type="password" placeholder="••••••••" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<Button type="submit" className="w-full" disabled={isLoading}>
{isLoading ? "Creating account..." : "Register"}
</Button>
</form>
</Form>
<div className="mt-4 text-center text-sm">
Already have an account?{" "}
<Button
variant="link"
className="p-0 h-auto font-normal"
onClick={onToggleMode}
>
Login
</Button>
</div>
</CardContent>
</Card>
)
}