summaryrefslogtreecommitdiff
path: root/apps/web/src/app/auth/login
diff options
context:
space:
mode:
Diffstat (limited to 'apps/web/src/app/auth/login')
-rw-r--r--apps/web/src/app/auth/login/page.tsx98
1 files changed, 98 insertions, 0 deletions
diff --git a/apps/web/src/app/auth/login/page.tsx b/apps/web/src/app/auth/login/page.tsx
new file mode 100644
index 00000000..5eadb85c
--- /dev/null
+++ b/apps/web/src/app/auth/login/page.tsx
@@ -0,0 +1,98 @@
+"use client";
+
+import { useSearchParams, useRouter } from "next/navigation";
+import { authClient } from "@/lib/auth-client";
+import { Button } from "@/components/ui/button";
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card";
+import { Suspense, useState } from "react";
+import { Input } from "@/components/ui/input";
+import { Label } from "@/components/ui/label";
+import Link from "next/link";
+import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
+
+function LoginForm() {
+ const searchParams = useSearchParams();
+ const router = useRouter();
+ const redirectUrl = searchParams.get("redirect");
+ const [email, setEmail] = useState("");
+ const [password, setPassword] = useState("");
+ const [error, setError] = useState<string | null>(null);
+
+ const handleLogin = async () => {
+ setError(null);
+ const { error } = await authClient.signIn.email({
+ email,
+ password,
+ });
+
+ if (error) {
+ setError(error.message || "An unexpected error occurred.");
+ return;
+ }
+
+ router.push(redirectUrl || "/");
+ };
+
+ return (
+ <div className="flex flex-col space-y-4">
+ {error && (
+ <Alert variant="destructive">
+ <AlertTitle>Error</AlertTitle>
+ <AlertDescription>{error}</AlertDescription>
+ </Alert>
+ )}
+ <div className="space-y-2">
+ <Label htmlFor="email">Email</Label>
+ <Input
+ id="email"
+ type="email"
+ placeholder="m@example.com"
+ value={email}
+ onChange={(e) => setEmail(e.target.value)}
+ />
+ </div>
+ <div className="space-y-2">
+ <Label htmlFor="password">Password</Label>
+ <Input
+ id="password"
+ type="password"
+ value={password}
+ onChange={(e) => setPassword(e.target.value)}
+ />
+ </div>
+ <Button onClick={handleLogin}>Login</Button>
+ </div>
+ );
+}
+
+export default function LoginPage() {
+ return (
+ <div className="flex h-screen items-center justify-center">
+ <Card className="w-[350px]">
+ <CardHeader>
+ <CardTitle>Login</CardTitle>
+ <CardDescription>
+ Enter your email and password to login.
+ </CardDescription>
+ </CardHeader>
+ <CardContent>
+ <Suspense fallback={<div>Loading...</div>}>
+ <LoginForm />
+ </Suspense>
+ <div className="mt-4 text-center text-sm">
+ Don't have an account?{" "}
+ <Link href="/auth/signup" className="underline">
+ Sign up
+ </Link>
+ </div>
+ </CardContent>
+ </Card>
+ </div>
+ );
+}