import React, { FC, useState } from 'react'; import { Form, FormInstance, notification } from 'antd'; import Image from 'next/image'; import { Social } from '../../../types/social'; import { AUTH_USER } from '../../../constants/common'; import { SocialConfig } from '../../../constants/social'; import { getRegister } from '../../../actions/auth'; import { setPersonData } from '../../../actions/profile'; import { useOauthWindow } from '../../../hooks/useOauthWindow'; import { CustomInput } from '../../view/CustomInput'; import { CustomInputPassword } from '../../view/CustomInputPassword'; import { FilledButton } from '../../view/FilledButton'; import { OutlinedButton } from '../../view/OutlinedButton'; import { i18nText } from '../../../i18nKeys'; type RegisterProps = { form: FormInstance; locale: string; updateMode: (mode: 'enter' | 'register' | 'reset' | 'finish') => void; updateToken: (token: string) => void; handleCancel: () => void; }; export const RegisterContent: FC = ({ form, updateMode, locale, updateToken, handleCancel }) => { const [isLoading, setIsLoading] = useState(false); const { openOauthWindow } = useOauthWindow(); const onRegister = () => { form.validateFields().then(() => { const { login, password } = form.getFieldsValue(); setIsLoading(true); getRegister(locale) .then((data) => { if (data.jwtToken) { setPersonData( { login, password, role: 'client', languagesLinks: [] }, locale, data.jwtToken) .then((profile) => { updateToken(data.jwtToken); localStorage.setItem(AUTH_USER, JSON.stringify(profile.userData)); handleCancel(); }) .catch((error) => { notification.error({ message: 'Error', description: error?.response?.data?.errors?.toString() }); }); } }) .catch((error) => { notification.error({ message: 'Error', description: error?.response?.data?.errMessage }); }) .finally(() => { setIsLoading(false); }) }); }; const onSocialRegister = (type: Social) => { const url = SocialConfig[type].oauthUrl; if (!url) return; openOauthWindow(url, type, async (event: MessageEvent) => { const { data: socialData } = event // примерная схема последующей обработки // const socialErrors: string[] = []; // try { // // отправляем запрос на бэк с данными из соц сети // const { data: { jwtToken } } = await query(socialData); // // обновляем токен // updateToken(jwtToken); // // получаем данные о пользователе // await getAuthUser() // } catch (error: any) { // if (error.httpStatus === 449) { // // ошибка, когда отсутствует e-mail // // // какие-то дальнейшие действия после получения ошибки, например, закрываем окно и открываем модалку регистрации // handleCancel(); // openSocialEmailRequestModal(socialData); // } else if (error.httpStatus === 409) { // // ошибка, когда по переданному email уже существует аккаунт // // // какие-то дальнейшие действия после получения ошибки, например, закрываем окно и открываем модалку с вводом пароля // handleCancel(); // openSocialPasswordModal(socialData); // } else { // // в остальных случаях записываем ошибку в массив ошибок // socialErrors.push(error.toString()); // } // } // // // если все успешно, закрываем окно // handleCancel(); }) }; return ( <>
({ validator(_, value) { if (!value || getFieldValue('password') === value) { return Promise.resolve(); } return Promise.reject(new Error(i18nText('errors.notMatchPass', locale))); }, }), ]} >
{i18nText('registration', locale)} updateMode('enter')}>{i18nText('enter', locale)} {i18nText('or', locale)} } onClick={() => onSocialRegister(Social.FACEBOOK)} > {i18nText('facebook', locale)} } onClick={() => onSocialRegister(Social.APPLE)} > {i18nText('apple', locale)} } onClick={() => onSocialRegister(Social.GOOGLE)} > {i18nText('google', locale)} ); };