| "use client"; | |
| import { zodResolver } from "@hookform/resolvers/zod"; | |
| import { useForm } from "react-hook-form"; | |
| import { Button } from "@/components/ui/button"; | |
| import { | |
| Form, | |
| FormControl, | |
| FormField, | |
| FormItem, | |
| FormLabel, | |
| FormMessage, | |
| FormDescription, | |
| } from "@/components/ui/form"; | |
| import { Input } from "@/components/ui/input"; | |
| import { RegisterSchema, type RegisterInput } from "@/lib/schemas"; | |
| import { registerUser } from "@/lib/actions/auth"; | |
| import { useToast } from "@/hooks/use-toast"; | |
| import { useRouter } from "next/navigation"; | |
| import { useState } from "react"; | |
| import { Loader2 } from "lucide-react"; | |
| export function RegisterForm() { | |
| const { toast } = useToast(); | |
| const router = useRouter(); | |
| const [isLoading, setIsLoading] = useState(false); | |
| const form = useForm<RegisterInput>({ | |
| resolver: zodResolver(RegisterSchema), | |
| defaultValues: { | |
| name: "", | |
| email: "", | |
| password: "", | |
| confirmPassword: "", | |
| referralCode: "", | |
| }, | |
| }); | |
| async function onSubmit(values: RegisterInput) { | |
| setIsLoading(true); | |
| try { | |
| const result = await registerUser(values); | |
| if (result.success) { | |
| toast({ | |
| title: "Registration Complete!", | |
| description: result.message, | |
| }); | |
| router.push('/login'); | |
| } else { | |
| toast({ | |
| title: "Registration Failed", | |
| description: result.message, | |
| variant: "destructive", | |
| }); | |
| } | |
| } catch (error) { | |
| toast({ | |
| title: "Error", | |
| description: "An unexpected error occurred. Please try again.", | |
| variant: "destructive", | |
| }); | |
| } finally { | |
| setIsLoading(false); | |
| } | |
| } | |
| return ( | |
| <Form {...form}> | |
| <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-6"> | |
| <FormField | |
| control={form.control} | |
| name="name" | |
| render={({ field }) => ( | |
| <FormItem> | |
| <FormLabel>Full Name</FormLabel> | |
| <FormControl> | |
| <Input placeholder="Your Name" {...field} /> | |
| </FormControl> | |
| <FormMessage /> | |
| </FormItem> | |
| )} | |
| /> | |
| <FormField | |
| control={form.control} | |
| name="email" | |
| render={({ field }) => ( | |
| <FormItem> | |
| <FormLabel>Email</FormLabel> | |
| <FormControl> | |
| <Input placeholder="you@example.com" {...field} type="email" /> | |
| </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> | |
| )} | |
| /> | |
| <FormField | |
| control={form.control} | |
| name="referralCode" | |
| render={({ field }) => ( | |
| <FormItem> | |
| <FormLabel>Referral Code (Optional)</FormLabel> | |
| <FormControl> | |
| <Input placeholder="Enter referral code" {...field} /> | |
| </FormControl> | |
| <FormDescription>If you were referred by someone, enter their code here.</FormDescription> | |
| <FormMessage /> | |
| </FormItem> | |
| )} | |
| /> | |
| <Button type="submit" className="w-full" disabled={isLoading}> | |
| {isLoading && <Loader2 className="mr-2 h-4 w-4 animate-spin" />} | |
| Create Account | |
| </Button> | |
| </form> | |
| </Form> | |
| ); | |
| } | |