"use client"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from "@/components/ui/card"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { zodResolver } from "@hookform/resolvers/zod"; import { useRouter } from "next/navigation"; import { useToast } from "@/components/ui/use-toast"; import { useForm } from "react-hook-form"; import * as z from "zod"; const authSchema = z.object({ email: z.string().email("Please enter a valid email"), password: z.string().min(8, "Password must be at least 8 characters"), }); export default function Auth() { const { push } = useRouter(); const { toast } = useToast(); const form = useForm<z.infer<typeof authSchema>>({ resolver: zodResolver(authSchema), defaultValues: { email: "", password: "", }, }); async function handleSignup(values: z.infer<typeof authSchema>) { try { const res = await fetch("/auth/signup", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(values), }); const { error, message } = await res.json(); if (error) { toast({ variant: "destructive", title: "Uh oh! Something went wrong.", description: error, }); throw new Error(error); } else if (message) { toast({ title: "Check your email!", description: message, }); } } catch (error) { console.error(error); } } async function handleLogin(values: z.infer<typeof authSchema>) { try { const res = await fetch("/auth/login", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(values), }); const { error } = await res.json(); if (error) { toast({ variant: "destructive", title: "Uh oh! Something went wrong.", description: error.message, }); throw new Error(error); } push("/"); } catch (error) { console.error(error); } } return ( <div className="flex flex-col min-w-screen min-h-screen px-8 justify-center items-center gap-2"> <Tabs defaultValue="login" className="w-[400px]"> <TabsList className="grid w-full grid-cols-2"> <TabsTrigger value="login">Login</TabsTrigger> <TabsTrigger value="signup">Signup</TabsTrigger> </TabsList> <TabsContent value="login"> <Card> <CardHeader> <CardTitle>Login to your account</CardTitle> <CardDescription> Enter your email and password below to login. </CardDescription> </CardHeader> <Form {...form}> <form className="space-y-2" onSubmit={form.handleSubmit(handleLogin)} > <CardContent className="space-y-2"> <FormField control={form.control} name="email" render={({ field }) => ( <FormItem> <FormLabel>Email</FormLabel> <FormControl> <Input type="email" placeholder="you@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> )} /> </CardContent> <CardFooter> <Button type="submit">Login</Button> </CardFooter> </form> </Form> </Card> </TabsContent> <TabsContent value="signup"> <Card> <CardHeader> <CardTitle>Create your account</CardTitle> <CardDescription> Enter your email and password below to create an account. </CardDescription> </CardHeader> <Form {...form}> <form className="space-y-2" onSubmit={form.handleSubmit(handleSignup)} > <CardContent className="space-y-2"> <FormField control={form.control} name="email" render={({ field }) => ( <FormItem> <FormLabel>Email</FormLabel> <FormControl> <Input type="email" placeholder="you@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> )} /> </CardContent> <CardFooter> <Button type="submit">Signup</Button> </CardFooter> </form> </Form> </Card> </TabsContent> </Tabs> </div> ); }