summaryrefslogtreecommitdiff
path: root/src/components/header/authdialog/RegisterForm.tsx
blob: 0370671345d7738d0c4f9168a3fb8cbe35efd54d (plain)
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
'use client';
import { useState } from 'react';
import { Button } from '@/components/ui/button';
import GoogleIcon from '../../../../public/icons/google.svg';
import { InputField } from '@/components/ui/inputfield';
import { validate, registerUser } from './register';
import { useAuthContext } from '@/lib/contexts/Auth.context';
import Image from 'next/image';

export default function RegisterForm() {
    const [errors, setErrors] = useState<any>({});
    const [loading, setLoading] = useState(false);
    const { setUser } = useAuthContext();
    const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
        e.preventDefault();
        setLoading(true);
        setErrors({});

        const formData = new FormData(e.currentTarget);
        const username = formData.get('username')?.toString() || '';
        const email = formData.get('email')?.toString() || '';
        const password = formData.get('password')?.toString() || '';
        const passwordConfirm =
            formData.get('passwordConfirm')?.toString() || '';

        const validationErrors = validate(
            username,
            email,
            password,
            passwordConfirm,
        );

        if (Object.keys(validationErrors).length > 0) {
            setErrors(validationErrors);
            setLoading(false);
            return;
        }

        const { data, error } = await registerUser(username, email, password);

        if (error) {
            setErrors(error);
        } else if (data) {
            setUser(data);
        }
        setLoading(false);
    };

    return (
        <form
            onSubmit={handleSubmit}
            className="flex flex-col gap-5 min-w-[310px] w-fit"
        >
            <Button className="w-full bg-white hover:bg-white hover:text-black">
                <GoogleIcon />
                <span className="text-black">Войти через Google</span>
            </Button>

            <div className="flex flex-col gap-2.5">
                <div className="flex flex-col ">
                    <InputField placeholder="Никнейм" name="username" />
                    {errors.username && (
                        <p className="text-red pl-5 text-[12px] leading-[16px] mt-[5px]">
                            {errors.username}
                        </p>
                    )}
                </div>

                <div className="flex flex-col">
                    <InputField placeholder="E-mail" name="email" />
                    {errors.email && (
                        <p className="text-red pl-5 text-[12px] leading-[16px] mt-[5px]">
                            {errors.email}
                        </p>
                    )}
                </div>

                <div className="flex flex-col ">
                    <InputField
                        isPassword
                        placeholder="Пароль"
                        type="password"
                        name="password"
                    />
                    {errors.password && (
                        <p className="text-red pl-5 text-[12px] leading-[16px] mt-[5px]">
                            {errors.password}
                        </p>
                    )}
                </div>

                <div className="flex flex-col ">
                    <InputField
                        isPassword
                        placeholder="Повторите пароль"
                        type="password"
                        name="passwordConfirm"
                    />
                    {errors.passwordConfirm && (
                        <p className="text-red pl-5 text-[12px] leading-[16px] mt-[5px]">
                            {errors.passwordConfirm}
                        </p>
                    )}
                </div>
            </div>

            {errors.general && <p className="text-red ">{errors.general}</p>}

            <Button type="submit" className="w-full" disabled={loading}>
                {loading ? 'Регистрация...' : 'Зарегистрироваться'}
            </Button>
        </form>
    );
}