summaryrefslogtreecommitdiff
path: root/apps/web/src/app/(auth)
diff options
context:
space:
mode:
authorHyteq <DerpsDer.es@gmail.com>2025-07-20 11:00:22 +0300
committerHyteq <DerpsDer.es@gmail.com>2025-07-20 11:00:22 +0300
commitbe1ae20d9089e81cb84a8294be76fe680a24b60f (patch)
tree48472c1122d35f45f802bbd1c3cf2c15f653f9cf /apps/web/src/app/(auth)
parentede08dac416b47eac2db151969c164bdf0f06002 (diff)
downloadopencut-be1ae20d9089e81cb84a8294be76fe680a24b60f.tar.gz
format
Diffstat (limited to 'apps/web/src/app/(auth)')
-rw-r--r--apps/web/src/app/(auth)/login/page.tsx248
-rw-r--r--apps/web/src/app/(auth)/signup/page.tsx282
2 files changed, 265 insertions, 265 deletions
diff --git a/apps/web/src/app/(auth)/login/page.tsx b/apps/web/src/app/(auth)/login/page.tsx
index f28cd191..170be83f 100644
--- a/apps/web/src/app/(auth)/login/page.tsx
+++ b/apps/web/src/app/(auth)/login/page.tsx
@@ -3,11 +3,11 @@
import { useRouter } from "next/navigation";
import { Button } from "@/components/ui/button";
import {
- Card,
- CardContent,
- CardDescription,
- CardHeader,
- CardTitle,
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
} from "@/components/ui/card";
import { memo, Suspense } from "react";
import { Input } from "@/components/ui/input";
@@ -20,127 +20,127 @@ import { GoogleIcon } from "@/components/icons";
import { useLogin } from "@/hooks/auth/useLogin";
const LoginPage = () => {
- const router = useRouter();
- const {
- email,
- setEmail,
- password,
- setPassword,
- error,
- isAnyLoading,
- isEmailLoading,
- isGoogleLoading,
- handleLogin,
- handleGoogleLogin,
- } = useLogin();
+ const router = useRouter();
+ const {
+ email,
+ setEmail,
+ password,
+ setPassword,
+ error,
+ isAnyLoading,
+ isEmailLoading,
+ isGoogleLoading,
+ handleLogin,
+ handleGoogleLogin,
+ } = useLogin();
- return (
- <div className="flex h-screen items-center justify-center relative">
- <Button
- variant="text"
- onClick={() => router.back()}
- className="absolute top-6 left-6"
- >
- <ArrowLeft className="h-5 w-5" /> Back
- </Button>
- <Card className="w-[400px] shadow-lg border-0">
- <CardHeader className="text-center pb-4">
- <CardTitle className="text-2xl font-semibold">Welcome back</CardTitle>
- <CardDescription className="text-base">
- Sign in to your account to continue
- </CardDescription>
- </CardHeader>
- <CardContent className="pt-0">
- <Suspense
- fallback={
- <div className="text-center">
- <Loader2 className="animate-spin" />
- </div>
- }
- >
- <div className="flex flex-col space-y-6">
- {error && (
- <Alert variant="destructive">
- <AlertTitle>Error</AlertTitle>
- <AlertDescription>{error}</AlertDescription>
- </Alert>
- )}
+ return (
+ <div className="flex h-screen items-center justify-center relative">
+ <Button
+ variant="text"
+ onClick={() => router.back()}
+ className="absolute top-6 left-6"
+ >
+ <ArrowLeft className="h-5 w-5" /> Back
+ </Button>
+ <Card className="w-[400px] shadow-lg border-0">
+ <CardHeader className="text-center pb-4">
+ <CardTitle className="text-2xl font-semibold">Welcome back</CardTitle>
+ <CardDescription className="text-base">
+ Sign in to your account to continue
+ </CardDescription>
+ </CardHeader>
+ <CardContent className="pt-0">
+ <Suspense
+ fallback={
+ <div className="text-center">
+ <Loader2 className="animate-spin" />
+ </div>
+ }
+ >
+ <div className="flex flex-col space-y-6">
+ {error && (
+ <Alert variant="destructive">
+ <AlertTitle>Error</AlertTitle>
+ <AlertDescription>{error}</AlertDescription>
+ </Alert>
+ )}
- <Button
- onClick={handleGoogleLogin}
- variant="outline"
- size="lg"
- disabled={isAnyLoading}
- >
- {isGoogleLoading ? (
- <Loader2 className="animate-spin" />
- ) : (
- <GoogleIcon />
- )}{" "}
- Continue with Google
- </Button>
- <div className="relative">
- <div className="absolute inset-0 flex items-center">
- <Separator className="w-full" />
- </div>
- <div className="relative flex justify-center text-xs uppercase">
- <span className="bg-background px-2 text-muted-foreground">
- Or continue with
- </span>
- </div>
- </div>
- <div className="space-y-4">
- <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)}
- disabled={isAnyLoading}
- className="h-11"
- />
- </div>
- <div className="space-y-2">
- <Label htmlFor="password">Password</Label>
- <Input
- id="password"
- type="password"
- value={password}
- onChange={(e) => setPassword(e.target.value)}
- disabled={isAnyLoading}
- className="h-11"
- />
- </div>
- <Button
- onClick={handleLogin}
- disabled={isAnyLoading || !email || !password}
- className="w-full h-11"
- size="lg"
- >
- {isEmailLoading ? (
- <Loader2 className="animate-spin" />
- ) : (
- "Sign in"
- )}
- </Button>
- </div>
- </div>
- <div className="mt-6 text-center text-sm">
- Don't have an account?{" "}
- <Link
- href="/signup"
- className="font-medium text-primary underline-offset-4 hover:underline"
- >
- Sign up
- </Link>
- </div>
- </Suspense>
- </CardContent>
- </Card>
- </div>
- );
+ <Button
+ onClick={handleGoogleLogin}
+ variant="outline"
+ size="lg"
+ disabled={isAnyLoading}
+ >
+ {isGoogleLoading ? (
+ <Loader2 className="animate-spin" />
+ ) : (
+ <GoogleIcon />
+ )}{" "}
+ Continue with Google
+ </Button>
+ <div className="relative">
+ <div className="absolute inset-0 flex items-center">
+ <Separator className="w-full" />
+ </div>
+ <div className="relative flex justify-center text-xs uppercase">
+ <span className="bg-background px-2 text-muted-foreground">
+ Or continue with
+ </span>
+ </div>
+ </div>
+ <div className="space-y-4">
+ <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)}
+ disabled={isAnyLoading}
+ className="h-11"
+ />
+ </div>
+ <div className="space-y-2">
+ <Label htmlFor="password">Password</Label>
+ <Input
+ id="password"
+ type="password"
+ value={password}
+ onChange={(e) => setPassword(e.target.value)}
+ disabled={isAnyLoading}
+ className="h-11"
+ />
+ </div>
+ <Button
+ onClick={handleLogin}
+ disabled={isAnyLoading || !email || !password}
+ className="w-full h-11"
+ size="lg"
+ >
+ {isEmailLoading ? (
+ <Loader2 className="animate-spin" />
+ ) : (
+ "Sign in"
+ )}
+ </Button>
+ </div>
+ </div>
+ <div className="mt-6 text-center text-sm">
+ Don't have an account?{" "}
+ <Link
+ href="/signup"
+ className="font-medium text-primary underline-offset-4 hover:underline"
+ >
+ Sign up
+ </Link>
+ </div>
+ </Suspense>
+ </CardContent>
+ </Card>
+ </div>
+ );
};
export default memo(LoginPage);
diff --git a/apps/web/src/app/(auth)/signup/page.tsx b/apps/web/src/app/(auth)/signup/page.tsx
index c3a0f899..a3cd1faf 100644
--- a/apps/web/src/app/(auth)/signup/page.tsx
+++ b/apps/web/src/app/(auth)/signup/page.tsx
@@ -3,11 +3,11 @@
import { useRouter } from "next/navigation";
import { Button } from "@/components/ui/button";
import {
- Card,
- CardContent,
- CardDescription,
- CardHeader,
- CardTitle,
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
} from "@/components/ui/card";
import { memo, Suspense } from "react";
import { Input } from "@/components/ui/input";
@@ -20,143 +20,143 @@ import { GoogleIcon } from "@/components/icons";
import { useSignUp } from "@/hooks/auth/useSignUp";
const SignUpPage = () => {
- const router = useRouter();
- const {
- name,
- setName,
- email,
- setEmail,
- password,
- setPassword,
- error,
- isAnyLoading,
- isEmailLoading,
- isGoogleLoading,
- handleSignUp,
- handleGoogleSignUp,
- } = useSignUp();
+ const router = useRouter();
+ const {
+ name,
+ setName,
+ email,
+ setEmail,
+ password,
+ setPassword,
+ error,
+ isAnyLoading,
+ isEmailLoading,
+ isGoogleLoading,
+ handleSignUp,
+ handleGoogleSignUp,
+ } = useSignUp();
- return (
- <div className="flex h-screen items-center justify-center relative">
- <Button
- variant="text"
- onClick={() => router.back()}
- className="absolute top-6 left-6"
- >
- <ArrowLeft className="h-5 w-5" /> Back
- </Button>
- <Card className="w-[400px] shadow-lg border-0">
- <CardHeader className="text-center pb-4">
- <CardTitle className="text-2xl font-semibold">
- Create your account
- </CardTitle>
- <CardDescription className="text-base">
- Get started with your free account today
- </CardDescription>
- </CardHeader>
- <CardContent className="pt-0">
- <Suspense
- fallback={
- <div className="text-center">
- <Loader2 className="animate-spin" />
- </div>
- }
- >
- <div className="flex flex-col space-y-6">
- {error && (
- <Alert variant="destructive">
- <AlertTitle>Error</AlertTitle>
- <AlertDescription>{error}</AlertDescription>
- </Alert>
- )}
- <Button
- onClick={handleGoogleSignUp}
- variant="outline"
- size="lg"
- disabled={isAnyLoading}
- >
- {isGoogleLoading ? (
- <Loader2 className="animate-spin" />
- ) : (
- <GoogleIcon />
- )}{" "}
- Continue with Google
- </Button>
- <div className="relative">
- <div className="absolute inset-0 flex items-center">
- <Separator className="w-full" />
- </div>
- <div className="relative flex justify-center text-xs uppercase">
- <span className="bg-background px-2 text-muted-foreground">
- Or continue with
- </span>
- </div>
- </div>
- <div className="space-y-4">
- <div className="space-y-2">
- <Label htmlFor="name">Full Name</Label>
- <Input
- id="name"
- type="text"
- placeholder="John Doe"
- value={name}
- onChange={(e) => setName(e.target.value)}
- disabled={isAnyLoading}
- className="h-11"
- />
- </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)}
- disabled={isAnyLoading}
- className="h-11"
- />
- </div>
- <div className="space-y-2">
- <Label htmlFor="password">Password</Label>
- <Input
- id="password"
- type="password"
- placeholder="Create a strong password"
- value={password}
- onChange={(e) => setPassword(e.target.value)}
- disabled={isAnyLoading}
- className="h-11"
- />
- </div>
- <Button
- onClick={handleSignUp}
- disabled={isAnyLoading || !name || !email || !password}
- className="w-full h-11"
- size="lg"
- >
- {isEmailLoading ? (
- <Loader2 className="animate-spin" />
- ) : (
- "Create account"
- )}
- </Button>
- </div>
- </div>
- <div className="mt-6 text-center text-sm">
- Already have an account?{" "}
- <Link
- href="/login"
- className="font-medium text-primary underline-offset-4 hover:underline"
- >
- Sign in
- </Link>
- </div>
- </Suspense>
- </CardContent>
- </Card>
- </div>
- );
+ return (
+ <div className="flex h-screen items-center justify-center relative">
+ <Button
+ variant="text"
+ onClick={() => router.back()}
+ className="absolute top-6 left-6"
+ >
+ <ArrowLeft className="h-5 w-5" /> Back
+ </Button>
+ <Card className="w-[400px] shadow-lg border-0">
+ <CardHeader className="text-center pb-4">
+ <CardTitle className="text-2xl font-semibold">
+ Create your account
+ </CardTitle>
+ <CardDescription className="text-base">
+ Get started with your free account today
+ </CardDescription>
+ </CardHeader>
+ <CardContent className="pt-0">
+ <Suspense
+ fallback={
+ <div className="text-center">
+ <Loader2 className="animate-spin" />
+ </div>
+ }
+ >
+ <div className="flex flex-col space-y-6">
+ {error && (
+ <Alert variant="destructive">
+ <AlertTitle>Error</AlertTitle>
+ <AlertDescription>{error}</AlertDescription>
+ </Alert>
+ )}
+ <Button
+ onClick={handleGoogleSignUp}
+ variant="outline"
+ size="lg"
+ disabled={isAnyLoading}
+ >
+ {isGoogleLoading ? (
+ <Loader2 className="animate-spin" />
+ ) : (
+ <GoogleIcon />
+ )}{" "}
+ Continue with Google
+ </Button>
+ <div className="relative">
+ <div className="absolute inset-0 flex items-center">
+ <Separator className="w-full" />
+ </div>
+ <div className="relative flex justify-center text-xs uppercase">
+ <span className="bg-background px-2 text-muted-foreground">
+ Or continue with
+ </span>
+ </div>
+ </div>
+ <div className="space-y-4">
+ <div className="space-y-2">
+ <Label htmlFor="name">Full Name</Label>
+ <Input
+ id="name"
+ type="text"
+ placeholder="John Doe"
+ value={name}
+ onChange={(e) => setName(e.target.value)}
+ disabled={isAnyLoading}
+ className="h-11"
+ />
+ </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)}
+ disabled={isAnyLoading}
+ className="h-11"
+ />
+ </div>
+ <div className="space-y-2">
+ <Label htmlFor="password">Password</Label>
+ <Input
+ id="password"
+ type="password"
+ placeholder="Create a strong password"
+ value={password}
+ onChange={(e) => setPassword(e.target.value)}
+ disabled={isAnyLoading}
+ className="h-11"
+ />
+ </div>
+ <Button
+ onClick={handleSignUp}
+ disabled={isAnyLoading || !name || !email || !password}
+ className="w-full h-11"
+ size="lg"
+ >
+ {isEmailLoading ? (
+ <Loader2 className="animate-spin" />
+ ) : (
+ "Create account"
+ )}
+ </Button>
+ </div>
+ </div>
+ <div className="mt-6 text-center text-sm">
+ Already have an account?{" "}
+ <Link
+ href="/login"
+ className="font-medium text-primary underline-offset-4 hover:underline"
+ >
+ Sign in
+ </Link>
+ </div>
+ </Suspense>
+ </CardContent>
+ </Card>
+ </div>
+ );
};
export default memo(SignUpPage);