summaryrefslogtreecommitdiff
path: root/apps/web/src/app/auth/signup/page.tsx
diff options
context:
space:
mode:
authorMaze <167211895+mazeincoding@users.noreply.github.com>2025-06-23 10:52:40 +0200
committerGitHub <noreply@github.com>2025-06-23 10:52:40 +0200
commitd92aed2dac5ea3ff015ce974b9519e03e2e9823c (patch)
tree42bf908761977846377b9b13d72b5602c6d12760 /apps/web/src/app/auth/signup/page.tsx
parentd8917f2632d8205ad12595682f96c7fb3352acd6 (diff)
parent54235d8dfed8e99729ff68e01c7522036a7bfdcf (diff)
downloadopencut-d92aed2dac5ea3ff015ce974b9519e03e2e9823c.tar.gz
Merge pull request #1 from yimothysu/main
Add /auth/login and /auth/signup routes
Diffstat (limited to 'apps/web/src/app/auth/signup/page.tsx')
-rw-r--r--apps/web/src/app/auth/signup/page.tsx108
1 files changed, 108 insertions, 0 deletions
diff --git a/apps/web/src/app/auth/signup/page.tsx b/apps/web/src/app/auth/signup/page.tsx
new file mode 100644
index 00000000..f328851c
--- /dev/null
+++ b/apps/web/src/app/auth/signup/page.tsx
@@ -0,0 +1,108 @@
+"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 SignUpForm() {
+ const searchParams = useSearchParams();
+ const router = useRouter();
+ const redirectUrl = searchParams.get("redirect");
+ const [name, setName] = useState("");
+ const [email, setEmail] = useState("");
+ const [password, setPassword] = useState("");
+ const [error, setError] = useState<string | null>(null);
+
+ const handleSignUp = async () => {
+ setError(null);
+ const { error } = await authClient.signUp.email({
+ name,
+ 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="name">Name</Label>
+ <Input
+ id="name"
+ type="text"
+ placeholder="John Doe"
+ value={name}
+ onChange={(e) => setName(e.target.value)}
+ />
+ </div>
+ <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={handleSignUp}>Sign Up</Button>
+ </div>
+ );
+}
+
+export default function SignUpPage() {
+ return (
+ <div className="flex h-screen items-center justify-center">
+ <Card className="w-[350px]">
+ <CardHeader>
+ <CardTitle>Sign Up</CardTitle>
+ <CardDescription>Create an account to get started.</CardDescription>
+ </CardHeader>
+ <CardContent>
+ <Suspense fallback={<div>Loading...</div>}>
+ <SignUpForm />
+ </Suspense>
+ <div className="mt-4 text-center text-sm">
+ Already have an account?{" "}
+ <Link href="/auth/login" className="underline">
+ Login
+ </Link>
+ </div>
+ </CardContent>
+ </Card>
+ </div>
+ );
+}