File size: 2,317 Bytes
41a71fd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import { z } from 'zod';
import { zodResolver } from '@hookform/resolvers/zod';
import { FormProvider, useForm } from 'react-hook-form';
import { HInput } from '@/shared/ui/FormComponents';
import { classNames } from '@/shared/lib/classNames/classNames';
import { Button, ButtonSize, ButtonTheme } from '@/shared/ui/Button';
import { useSignInByEmail } from '../../lib/query/useSignInByEmail';
import cls from './AuthByEmail.module.scss';

const AuthByEmailSchema = z.object({
    email: z.string().email('email написан некоректно'),
    password: z.string().min(5, { message: 'Введите не менее 5 символов' }),
});

export type AuthByEmailType = z.infer<typeof AuthByEmailSchema>;

interface AuthByEmailProps {
    className?: string;
}

const defaultValues = {
    email: '',
    password: '',
};

export const AuthByEmail = (props: AuthByEmailProps) => {
    const { className } = props;
    const { mutate: onAuth, isPending } = useSignInByEmail();

    const methods = useForm<AuthByEmailType>({
        defaultValues,
        resolver: zodResolver(AuthByEmailSchema),
    });

    const { handleSubmit } = methods;

    const submitHandler = async (loginData: AuthByEmailType) => {
        onAuth(loginData);
    };

    return (
        <div className={classNames(cls.AuthByEmail, {}, [className])}>
            <FormProvider {...methods}>
                <form onSubmit={handleSubmit(submitHandler)}>
                    <HInput //
                        className={cls.field}
                        name="email"
                        placeholder="Введите email"
                    />
                    <HInput //
                        className={cls.field}
                        name="password"
                        placeholder="Введите пароль"
                        type="password"
                    />
                    <Button
                        theme={ButtonTheme.PRIMARY}
                        size={ButtonSize.XL}
                        type="submit"
                        showSpinner={isPending}
                        disabled={isPending}
                    >
                        Сохранить
                    </Button>
                </form>
            </FormProvider>
        </div>
    );
};