src/views/Login.tsx
import {
Card,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import {
Form,
FormControl,
FormField,
FormItem,
FormLabel,
FormMessage,
} from "@/components/ui/form";
import { Button } from "@/components/ui/button";
import { HiddenInput, Input } from "@/components/ui/input";
import { loginSchema } from "@/lib/schemas";
import { zodResolver } from "@hookform/resolvers/zod";
import { useForm } from "react-hook-form";
import { z } from "zod";
import { login } from "@/db/auth";
import { Link, useNavigate } from "@tanstack/react-router";
import { toast } from "sonner";
import { useState } from "react";
export default function Login() {
const [isLoading, setIsLoading] = useState<boolean>(false);
const navigate = useNavigate();
const form = useForm<z.infer<typeof loginSchema>>({
resolver: zodResolver(loginSchema),
});
async function onSubmit(values: z.infer<typeof loginSchema>) {
setIsLoading(true);
const data = await login(values.email, values.password);
if (data.data.session) {
setIsLoading(false);
navigate({ to: "/pages" });
toast("Signed In!");
}
if (data.error) {
setIsLoading(false);
toast("Authentication Error", { description: data.error.message });
}
}
return (
<div className="flex h-full items-center justify-center">
<Card className="w-full max-w-md">
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)}>
<CardHeader className="text-center">
<CardTitle className="text-2xl">Login</CardTitle>
<CardDescription>
Enter your email below to login to your account.
</CardDescription>
</CardHeader>
<CardContent className="grid gap-4">
<FormField
control={form.control}
name="email"
render={({ field }) => (
<FormItem>
<div className="grid gap-2">
<FormLabel>Email</FormLabel>
<FormControl>
<Input
id="email"
type="email"
placeholder="mac@justapps.com"
{...field}
/>
</FormControl>
<FormMessage />
</div>
</FormItem>
)}
/>
<FormField
control={form.control}
name="password"
render={({ field }) => (
<FormItem>
<div className="grid gap-2">
<FormLabel>Password</FormLabel>
<FormControl>
{/* <Input id="password" type="password" {...field} /> */}
<HiddenInput id="password" {...field} />
</FormControl>
<FormMessage />
</div>
</FormItem>
)}
/>
</CardContent>
<CardFooter className="flex flex-col gap-3">
<Button
className="w-full"
type="submit"
isLoading={isLoading}
loadingText="Signing In"
>
Login
</Button>
<div className="flex space-x-2">
<h1>Don't have an account?</h1>
<Link className="font-bold underline" to="/signup">
Sign up
</Link>
</div>
</CardFooter>
</form>
</Form>
</Card>
</div>
);
}