| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- import { z } from 'zod'
- import { useForm } from 'react-hook-form'
- import { zodResolver } from '@hookform/resolvers/zod'
- import { useNavigate } from '@tanstack/react-router'
- import { Loader2, LogIn } from 'lucide-react'
- import { toast } from 'sonner'
- import { useLogin } from '@/hooks/auth/useAuth'
- import { cn } from '@/lib/utils'
- import { Button } from '@/components/ui/button'
- import {
- Form,
- FormControl,
- FormField,
- FormItem,
- FormLabel,
- FormMessage,
- } from '@/components/ui/form'
- import { Input } from '@/components/ui/input'
- import { PasswordInput } from '@/components/password-input'
- const formSchema = z.object({
- username: z
- .string()
- .min(1, 'نام کاربری الزامی است')
- .min(3, 'نام کاربری باید حداقل ۳ کاراکتر باشد'),
- password: z
- .string()
- .min(1, 'رمز عبور الزامی است')
- .min(6, 'رمز عبور باید حداقل ۶ کاراکتر باشد'),
- })
- interface UserAuthFormProps extends React.HTMLAttributes<HTMLFormElement> {
- redirectTo?: string
- }
- export function UserAuthForm({
- className,
- redirectTo,
- ...props
- }: UserAuthFormProps) {
- const navigate = useNavigate()
- const { mutateAsync: login, isPending } = useLogin()
- const form = useForm<z.infer<typeof formSchema>>({
- resolver: zodResolver(formSchema),
- defaultValues: {
- username: '',
- password: '',
- },
- })
- const onSubmit = async (data: z.infer<typeof formSchema>) => {
- try {
- await login(data)
- toast.success('ورود با موفقیت انجام شد')
- navigate({
- to: redirectTo || '/',
- replace: true,
- })
- } catch {
- toast.error('نام کاربری یا رمز عبور اشتباه است')
- }
- }
- return (
- <Form {...form}>
- <form
- onSubmit={form.handleSubmit(onSubmit)}
- className={cn('grid gap-3', className)}
- {...props}
- >
- <FormField
- control={form.control}
- name='username'
- render={({ field }) => (
- <FormItem>
- <FormLabel>نام کاربری</FormLabel>
- <FormControl>
- <Input
- placeholder='نام کاربری یا شماره موبایل'
- autoComplete='username'
- {...field}
- />
- </FormControl>
- <FormMessage />
- </FormItem>
- )}
- />
- <FormField
- control={form.control}
- name='password'
- render={({ field }) => (
- <FormItem>
- <FormLabel>رمز عبور</FormLabel>
- <FormControl>
- <PasswordInput
- placeholder='********'
- autoComplete='current-password'
- {...field}
- />
- </FormControl>
- <FormMessage />
- </FormItem>
- )}
- />
- <Button className='mt-2' disabled={isPending}>
- {isPending ? (
- <Loader2 className='mr-2 h-4 w-4 animate-spin' />
- ) : (
- <LogIn className='mr-2 h-4 w-4' />
- )}
- ورود
- </Button>
- </form>
- </Form>
- )
- }
|