You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

179 lines
5.0 KiB

'use client'
import { useRouter } from 'next/navigation'
import { useForm } from 'react-hook-form'
import { zodResolver } from '@hookform/resolvers/zod'
import * as z from 'zod'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import {
Form,
FormControl,
FormField,
FormItem,
FormLabel,
FormMessage,
} from '@/components/ui/form'
import { signIn } from 'next-auth/react'
import { Checkbox } from '@/components/ui/checkbox'
import { Routes } from '@/config/routes'
const registerSchema = z.object({
name: z
.string()
.min(2, { message: 'Name must be at least 2 characters long' }),
email: z.string().email({ message: 'Invalid email address' }),
password: z
.string()
.min(8, { message: 'Password must be at least 8 characters long' }),
phone: z.string().optional(),
marketingOptIn: z.boolean().optional().default(true),
})
type RegisterFormValues = z.infer<typeof registerSchema>
export default function RegisterForm() {
const router = useRouter()
const form = useForm<RegisterFormValues>({
resolver: zodResolver(registerSchema),
defaultValues: {
name: '',
email: '',
password: '',
phone: '',
marketingOptIn: true,
},
})
const onSubmit = async (data: RegisterFormValues) => {
form.clearErrors()
try {
const result = await signIn('email-password-register', {
redirect: false,
email: data.email,
password: data.password,
name: data.name,
phone: data.phone,
marketingOptIn: data.marketingOptIn,
})
if (result?.error) {
console.log(result.error)
form.setError('root', {
type: 'manual',
message: 'Failed to create account',
})
} else {
router.push(`${Routes.verifyEmail}?verificationEmailSent=1`)
}
} catch (error) {
console.error('register error:', error)
form.setError('root', {
type: 'manual',
message: 'An unexpected error occurred. Please try again.',
})
}
}
return (
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className='space-y-4'>
<FormField
control={form.control}
name='name'
render={({ field }) => (
<FormItem>
<FormLabel>Full Name</FormLabel>
<FormControl>
<Input placeholder='John Doe' {...field} className='dark:text-white dark:bg-gray-800' />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name='email'
render={({ field }) => (
<FormItem>
<FormLabel>Email</FormLabel>
<FormControl>
<Input placeholder='m@example.com' {...field} className='dark:text-white dark:bg-gray-800' />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name='password'
render={({ field }) => (
<FormItem>
<FormLabel>Password</FormLabel>
<FormControl>
<Input type='password' {...field} className='dark:text-white dark:bg-gray-800' />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name='phone'
render={({ field }) => (
<FormItem>
<FormLabel>Phone (optional)</FormLabel>
<FormControl>
<Input placeholder='+1 (555) 000-0000' {...field} className='dark:text-white dark:bg-gray-800' />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
{form.formState.errors.root && (
<p className='text-sm font-medium text-red-500'>
{form.formState.errors.root.message}
</p>
)}
<FormField
control={form.control}
name='marketingOptIn'
render={({ field }) => (
<FormItem>
<div className='flex items-center space-x-3 space-y-0'>
<FormControl>
<Checkbox
checked={field.value}
onCheckedChange={field.onChange}
/>
</FormControl>
<FormLabel className='text-sm'>
I want to receive updates about new features and promotions
</FormLabel>
</div>
<FormMessage />
</FormItem>
)}
/>
<Button
className='w-full'
type='submit'
disabled={form.formState.isSubmitting}
>
{form.formState.isSubmitting ? (
<>
{/* <Icons.spinner className="mr-2 h-4 w-4 animate-spin" /> */}
Creating account...
</>
) : (
'Sign Up'
)}
</Button>
</form>
</Form>
)
}