skalara-core/app/auth/page.tsx
Christopher Arraya 788b952127 initial commit
2023-11-18 21:09:24 -05:00

224 lines
6.7 KiB
TypeScript

"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>
);
}