Made great progress on monorepo & auth for next. Very happy with work!

This commit is contained in:
2026-01-12 11:55:15 -06:00
parent 72f11f0b02
commit 321fecb5e1
58 changed files with 1266 additions and 222 deletions

View File

@@ -1,12 +1,17 @@
'use client';
import { z } from 'zod';
import { zodResolver } from '@hookform/resolvers/zod';
import { useForm } from 'react-hook-form';
import Link from 'next/link';
import { useAuthActions } from '@convex-dev/auth/react';
import { useRouter } from 'next/navigation';
import { ConvexError } from 'convex/values';
import { useState } from 'react';
import Link from 'next/link';
import { useRouter } from 'next/navigation';
import { GibsAuthSignInButton } from '@/components/layout/auth/buttons';
import { useAuthActions } from '@convex-dev/auth/react';
import { zodResolver } from '@hookform/resolvers/zod';
import { ConvexError } from 'convex/values';
import { useForm } from 'react-hook-form';
import { toast } from 'sonner';
import { z } from 'zod';
import { PASSWORD_MAX, PASSWORD_MIN, PASSWORD_REGEX } from '@gib/backend/types';
import {
Card,
CardContent,
@@ -20,8 +25,8 @@ import {
Input,
InputOTP,
InputOTPGroup,
InputOTPSlot,
InputOTPSeparator,
InputOTPSlot,
Separator,
SubmitButton,
Tabs,
@@ -29,11 +34,6 @@ import {
TabsList,
TabsTrigger,
} from '@gib/ui';
import { toast } from 'sonner';
import {
GibsAuthSignInButton,
} from '@/components/layout/auth/buttons';
import { PASSWORD_MIN, PASSWORD_MAX, PASSWORD_REGEX } from '@gib/backend/types';
const signInFormSchema = z.object({
email: z.email({
@@ -179,24 +179,24 @@ const SignIn = () => {
if (flow === 'email-verification') {
return (
<div className='flex flex-col items-center'>
<Card className='p-4 bg-card/25 min-h-[720px] w-md'>
<div className="flex flex-col items-center">
<Card className="bg-card/25 min-h-[720px] w-md p-4">
<CardContent>
<div className='text-center mb-6'>
<h2 className='text-2xl font-bold'>Verify Your Email</h2>
<p className='text-muted-foreground'>We sent a code to {email}</p>
<div className="mb-6 text-center">
<h2 className="text-2xl font-bold">Verify Your Email</h2>
<p className="text-muted-foreground">We sent a code to {email}</p>
</div>
<Form {...verifyEmailForm}>
<form
onSubmit={verifyEmailForm.handleSubmit(handleVerifyEmail)}
className='flex flex-col space-y-8'
className="flex flex-col space-y-8"
>
<FormField
control={verifyEmailForm.control}
name='code'
name="code"
render={({ field }) => (
<FormItem>
<FormLabel className='text-xl'>Code</FormLabel>
<FormLabel className="text-xl">Code</FormLabel>
<FormControl>
<InputOTP
maxLength={6}
@@ -217,25 +217,25 @@ const SignIn = () => {
<FormDescription>
Please enter the one-time password sent to your email.
</FormDescription>
<div className='flex flex-col w-full items-center'>
<FormMessage className='w-5/6 text-center' />
<div className="flex w-full flex-col items-center">
<FormMessage className="w-5/6 text-center" />
</div>
</FormItem>
)}
/>
<SubmitButton
disabled={loading}
pendingText='Signing Up...'
className='text-xl font-semibold w-2/3 mx-auto'
pendingText="Signing Up..."
className="mx-auto w-2/3 text-xl font-semibold"
>
Verify Email
</SubmitButton>
</form>
</Form>
<div className='text-center mt-4'>
<div className="mt-4 text-center">
<button
onClick={() => setFlow('signUp')}
className='text-sm text-muted-foreground hover:underline'
className="text-muted-foreground text-sm hover:underline"
>
Back to Sign Up
</button>
@@ -247,207 +247,204 @@ const SignIn = () => {
}
return (
<div className='flex flex-col items-center'>
<Card className='p-4 bg-card/25 min-h-[720px] w-md'>
<div className="flex flex-col items-center">
<Card className="bg-card/25 min-h-[720px] w-md p-4">
<Tabs
defaultValue={flow}
onValueChange={(value) => setFlow(value as 'signIn' | 'signUp')}
className='items-center'
className="items-center"
>
<TabsList className='py-6'>
<TabsList className="py-6">
<TabsTrigger
value='signIn'
className='p-6 text-2xl font-bold cursor-pointer'
value="signIn"
className="cursor-pointer p-6 text-2xl font-bold"
>
Sign In
</TabsTrigger>
<TabsTrigger
value='signUp'
className='p-6 text-2xl font-bold cursor-pointer'
value="signUp"
className="cursor-pointer p-6 text-2xl font-bold"
>
Sign Up
</TabsTrigger>
</TabsList>
<TabsContent value='signIn'>
<Card className='min-w-xs sm:min-w-sm bg-card/50'>
<TabsContent value="signIn">
<Card className="bg-card/50 min-w-xs sm:min-w-sm">
<CardContent>
<Form {...signInForm}>
<form
onSubmit={signInForm.handleSubmit(handleSignIn)}
className='flex flex-col space-y-8'
className="flex flex-col space-y-8"
>
<FormField
control={signInForm.control}
name='email'
name="email"
render={({ field }) => (
<FormItem>
<FormLabel className='text-xl'>Email</FormLabel>
<FormLabel className="text-xl">Email</FormLabel>
<FormControl>
<Input
type='email'
placeholder='you@example.com'
type="email"
placeholder="you@example.com"
{...field}
/>
</FormControl>
<div className='flex flex-col w-full items-center'>
<FormMessage className='w-5/6 text-center' />
<div className="flex w-full flex-col items-center">
<FormMessage className="w-5/6 text-center" />
</div>
</FormItem>
)}
/>
<FormField
control={signInForm.control}
name='password'
name="password"
render={({ field }) => (
<FormItem>
<div className='flex justify-between'>
<FormLabel className='text-xl'>Password</FormLabel>
<Link href='/forgot-password'>
<div className="flex justify-between">
<FormLabel className="text-xl">Password</FormLabel>
<Link href="/forgot-password">
Forgot Password?
</Link>
</div>
<FormControl>
<Input
type='password'
placeholder='Your password'
type="password"
placeholder="Your password"
{...field}
/>
</FormControl>
<div className='flex flex-col w-full items-center'>
<FormMessage className='w-5/6 text-center' />
<div className="flex w-full flex-col items-center">
<FormMessage className="w-5/6 text-center" />
</div>
</FormItem>
)}
/>
<SubmitButton
disabled={loading}
pendingText='Signing in...'
className='text-xl font-semibold w-2/3 mx-auto'
pendingText="Signing in..."
className="mx-auto w-2/3 text-xl font-semibold"
>
Sign In
</SubmitButton>
</form>
</Form>
<div className='flex justify-center'>
<div
className='flex flex-row items-center
my-2.5 mx-auto justify-center w-1/4'
>
<Separator className='py-0.5 mr-3' />
<span className='font-semibold text-lg'>or</span>
<Separator className='py-0.5 ml-3' />
<div className="flex justify-center">
<div className="mx-auto my-2.5 flex w-1/4 flex-row items-center justify-center">
<Separator className="mr-3 py-0.5" />
<span className="text-lg font-semibold">or</span>
<Separator className="ml-3 py-0.5" />
</div>
</div>
<div className='flex justify-center mt-3'>
<div className="mt-3 flex justify-center">
<GibsAuthSignInButton />
</div>
</CardContent>
</Card>
</TabsContent>
<TabsContent value='signUp'>
<Card className='min-w-xs sm:min-w-sm bg-card/50'>
<TabsContent value="signUp">
<Card className="bg-card/50 min-w-xs sm:min-w-sm">
<CardContent>
<Form {...signUpForm}>
<form
onSubmit={signUpForm.handleSubmit(handleSignUp)}
className='flex flex-col space-y-8'
className="flex flex-col space-y-8"
>
<FormField
control={signUpForm.control}
name='name'
name="name"
render={({ field }) => (
<FormItem>
<FormLabel className='text-xl'>Name</FormLabel>
<FormLabel className="text-xl">Name</FormLabel>
<FormControl>
<Input
type='text'
placeholder='Full Name'
type="text"
placeholder="Full Name"
{...field}
/>
</FormControl>
<div className='flex flex-col w-full items-center'>
<FormMessage className='w-5/6 text-center' />
<div className="flex w-full flex-col items-center">
<FormMessage className="w-5/6 text-center" />
</div>
</FormItem>
)}
/>
<FormField
control={signUpForm.control}
name='email'
name="email"
render={({ field }) => (
<FormItem>
<FormLabel className='text-xl'>Email</FormLabel>
<FormLabel className="text-xl">Email</FormLabel>
<FormControl>
<Input
type='email'
placeholder='you@example.com'
type="email"
placeholder="you@example.com"
{...field}
/>
</FormControl>
<div className='flex flex-col w-full items-center'>
<FormMessage className='w-5/6 text-center' />
<div className="flex w-full flex-col items-center">
<FormMessage className="w-5/6 text-center" />
</div>
</FormItem>
)}
/>
<FormField
control={signUpForm.control}
name='password'
name="password"
render={({ field }) => (
<FormItem>
<FormLabel className='text-xl'>Password</FormLabel>
<FormLabel className="text-xl">Password</FormLabel>
<FormControl>
<Input
type='password'
placeholder='Your password'
type="password"
placeholder="Your password"
{...field}
/>
</FormControl>
<div className='flex flex-col w-full items-center'>
<FormMessage className='w-5/6 text-center' />
<div className="flex w-full flex-col items-center">
<FormMessage className="w-5/6 text-center" />
</div>
</FormItem>
)}
/>
<FormField
control={signUpForm.control}
name='confirmPassword'
name="confirmPassword"
render={({ field }) => (
<FormItem>
<FormLabel className='text-xl'>
<FormLabel className="text-xl">
Confirm Passsword
</FormLabel>
<FormControl>
<Input
type='password'
placeholder='Confirm your password'
type="password"
placeholder="Confirm your password"
{...field}
/>
</FormControl>
<div className='flex flex-col w-full items-center'>
<FormMessage className='w-5/6 text-center' />
<div className="flex w-full flex-col items-center">
<FormMessage className="w-5/6 text-center" />
</div>
</FormItem>
)}
/>
<SubmitButton
disabled={loading}
pendingText='Signing Up...'
className='text-xl font-semibold w-2/3 mx-auto'
pendingText="Signing Up..."
className="mx-auto w-2/3 text-xl font-semibold"
>
Sign Up
</SubmitButton>
</form>
</Form>
<div className='flex my-auto justify-center w-2/3'>
<div className='flex flex-row w-1/3 items-center my-2.5'>
<Separator className='py-0.5 mr-3' />
<span className='font-semibold text-lg'>or</span>
<Separator className='py-0.5 ml-3' />
<div className="my-auto flex w-2/3 justify-center">
<div className="my-2.5 flex w-1/3 flex-row items-center">
<Separator className="mr-3 py-0.5" />
<span className="text-lg font-semibold">or</span>
<Separator className="ml-3 py-0.5" />
</div>
</div>
<div className='flex justify-center mt-3'>
<GibsAuthSignInButton type='signUp' />
<div className="mt-3 flex justify-center">
<GibsAuthSignInButton type="signUp" />
</div>
</CardContent>
</Card>