| 'use client'; | |
| import { toast } from '@/components/hooks/use-toast'; | |
| import { Button } from '@/components/ui/button'; | |
| import { Checkbox } from '@/components/ui/checkbox'; | |
| import { | |
| Form, | |
| FormControl, | |
| FormField, | |
| FormItem, | |
| FormLabel, | |
| FormMessage, | |
| } from '@/components/ui/form'; | |
| import { Input } from '@/components/ui/input'; | |
| import { | |
| InputOTP, | |
| InputOTPGroup, | |
| InputOTPSlot, | |
| } from '@/components/ui/input-otp'; | |
| import { useTranslate } from '@/hooks/common-hooks'; | |
| import { zodResolver } from '@hookform/resolvers/zod'; | |
| import { useForm } from 'react-hook-form'; | |
| import { z } from 'zod'; | |
| export function SignUpForm() { | |
| const { t } = useTranslate('login'); | |
| const FormSchema = z.object({ | |
| email: z.string().email({ | |
| message: t('emailPlaceholder'), | |
| }), | |
| nickname: z.string({ required_error: t('nicknamePlaceholder') }), | |
| password: z.string({ required_error: t('passwordPlaceholder') }), | |
| agree: z.boolean({ required_error: t('passwordPlaceholder') }), | |
| }); | |
| const form = useForm<z.infer<typeof FormSchema>>({ | |
| resolver: zodResolver(FormSchema), | |
| defaultValues: { | |
| email: '', | |
| }, | |
| }); | |
| function onSubmit(data: z.infer<typeof FormSchema>) { | |
| console.log('π ~ onSubmit ~ data:', data); | |
| toast({ | |
| title: 'You submitted the following values:', | |
| description: ( | |
| <pre className="mt-2 w-[340px] rounded-md bg-slate-950 p-4"> | |
| <code className="text-white">{JSON.stringify(data, null, 2)}</code> | |
| </pre> | |
| ), | |
| }); | |
| } | |
| return ( | |
| <Form {...form}> | |
| <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-6"> | |
| <FormField | |
| control={form.control} | |
| name="email" | |
| render={({ field }) => ( | |
| <FormItem> | |
| <FormLabel>{t('emailLabel')}</FormLabel> | |
| <FormControl> | |
| <Input placeholder={t('emailPlaceholder')} {...field} /> | |
| </FormControl> | |
| <FormMessage /> | |
| </FormItem> | |
| )} | |
| /> | |
| <FormField | |
| control={form.control} | |
| name="nickname" | |
| render={({ field }) => ( | |
| <FormItem> | |
| <FormLabel>{t('nicknameLabel')}</FormLabel> | |
| <FormControl> | |
| <Input placeholder={t('nicknamePlaceholder')} {...field} /> | |
| </FormControl> | |
| <FormMessage /> | |
| </FormItem> | |
| )} | |
| /> | |
| <FormField | |
| control={form.control} | |
| name="password" | |
| render={({ field }) => ( | |
| <FormItem> | |
| <FormLabel>{t('passwordLabel')}</FormLabel> | |
| <FormControl> | |
| <Input | |
| type={'password'} | |
| placeholder={t('passwordPlaceholder')} | |
| {...field} | |
| /> | |
| </FormControl> | |
| <FormMessage /> | |
| </FormItem> | |
| )} | |
| /> | |
| <FormField | |
| control={form.control} | |
| name="agree" | |
| render={({ field }) => ( | |
| <FormItem className="flex flex-row items-start space-x-3 space-y-0 rounded-md"> | |
| <FormControl> | |
| <Checkbox | |
| checked={field.value} | |
| onCheckedChange={field.onChange} | |
| /> | |
| </FormControl> | |
| <div className="space-y-1 leading-none"> | |
| <FormLabel> | |
| I understand and agree to the Terms of Service and Privacy | |
| Policy. | |
| </FormLabel> | |
| </div> | |
| </FormItem> | |
| )} | |
| /> | |
| <Button type="submit" className="w-full"> | |
| {t('signUp')} | |
| </Button> | |
| </form> | |
| </Form> | |
| ); | |
| } | |
| export function SignInForm() { | |
| const { t } = useTranslate('login'); | |
| const FormSchema = z.object({ | |
| email: z.string().email({ | |
| message: t('emailPlaceholder'), | |
| }), | |
| password: z.string({ required_error: t('passwordPlaceholder') }), | |
| }); | |
| const form = useForm<z.infer<typeof FormSchema>>({ | |
| resolver: zodResolver(FormSchema), | |
| defaultValues: { | |
| email: '', | |
| }, | |
| }); | |
| function onSubmit(data: z.infer<typeof FormSchema>) { | |
| console.log('π ~ onSubmit ~ data:', data); | |
| toast({ | |
| title: 'You submitted the following values:', | |
| description: ( | |
| <pre className="mt-2 w-[340px] rounded-md bg-slate-950 p-4"> | |
| <code className="text-white">{JSON.stringify(data, null, 2)}</code> | |
| </pre> | |
| ), | |
| }); | |
| } | |
| return ( | |
| <Form {...form}> | |
| <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-6"> | |
| <FormField | |
| control={form.control} | |
| name="email" | |
| render={({ field }) => ( | |
| <FormItem> | |
| <FormLabel>{t('emailLabel')}</FormLabel> | |
| <FormControl> | |
| <Input placeholder={t('emailPlaceholder')} {...field} /> | |
| </FormControl> | |
| <FormMessage /> | |
| </FormItem> | |
| )} | |
| /> | |
| <FormField | |
| control={form.control} | |
| name="password" | |
| render={({ field }) => ( | |
| <FormItem> | |
| <FormLabel>{t('passwordLabel')}</FormLabel> | |
| <FormControl> | |
| <Input | |
| type={'password'} | |
| placeholder={t('passwordPlaceholder')} | |
| {...field} | |
| /> | |
| </FormControl> | |
| <FormMessage /> | |
| </FormItem> | |
| )} | |
| /> | |
| <div className="flex items-center space-x-2"> | |
| <Checkbox id="terms" /> | |
| <label | |
| htmlFor="terms" | |
| className="text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" | |
| > | |
| {t('rememberMe')} | |
| </label> | |
| </div> | |
| <Button type="submit" className="w-full"> | |
| {t('login')} | |
| </Button> | |
| </form> | |
| </Form> | |
| ); | |
| } | |
| export function VerifyEmailForm() { | |
| const FormSchema = z.object({ | |
| pin: z.string().min(6, { | |
| message: 'Your one-time password must be 6 characters.', | |
| }), | |
| }); | |
| const form = useForm<z.infer<typeof FormSchema>>({ | |
| resolver: zodResolver(FormSchema), | |
| defaultValues: { | |
| pin: '', | |
| }, | |
| }); | |
| function onSubmit(data: z.infer<typeof FormSchema>) { | |
| console.log('π ~ onSubmit ~ data:', data); | |
| toast({ | |
| title: 'You submitted the following values:', | |
| description: ( | |
| <pre className="mt-2 w-[340px] rounded-md bg-slate-950 p-4"> | |
| <code className="text-white">{JSON.stringify(data, null, 2)}</code> | |
| </pre> | |
| ), | |
| }); | |
| } | |
| return ( | |
| <Form {...form}> | |
| <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-6"> | |
| <FormField | |
| control={form.control} | |
| name="pin" | |
| render={({ field }) => ( | |
| <FormItem> | |
| <FormLabel>One-Time Password</FormLabel> | |
| <FormControl> | |
| <InputOTP maxLength={6} {...field}> | |
| <InputOTPGroup> | |
| <InputOTPSlot index={0} /> | |
| <InputOTPSlot index={1} /> | |
| <InputOTPSlot index={2} /> | |
| <InputOTPSlot index={3} /> | |
| <InputOTPSlot index={4} /> | |
| <InputOTPSlot index={5} /> | |
| </InputOTPGroup> | |
| </InputOTP> | |
| </FormControl> | |
| <FormMessage /> | |
| </FormItem> | |
| )} | |
| /> | |
| <Button type="submit" className="w-full"> | |
| Verify | |
| </Button> | |
| </form> | |
| </Form> | |
| ); | |
| } | |