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 { useOauthWindow } from '../../../hooks/useOauthWindow'; import { getAuth } from '../../../actions/auth'; import { getPersonalData } from '../../../actions/profile'; import { CustomInput } from '../../view/CustomInput'; import { CustomInputPassword } from '../../view/CustomInputPassword'; import { FilledButton } from '../../view/FilledButton'; import { OutlinedButton } from '../../view/OutlinedButton'; import { LinkButton } from '../../view/LinkButton'; import { i18nText } from '../../../i18nKeys'; type EnterProps = { form: FormInstance; updateMode: (mode: 'enter' | 'register' | 'reset' | 'finish') => void; locale: string; handleCancel: () => void; updateToken: (token: string) => void; } export const EnterContent: FC = ({ form, updateMode, updateToken, locale, handleCancel }) => { const [isLoading, setIsLoading] = useState(false); const { openOauthWindow } = useOauthWindow(); const onLogin = () => { form.validateFields().then(() => { const { login, password } = form.getFieldsValue(); setIsLoading(true); getAuth(locale, { login, password }) .then((data) => { if (data.jwtToken) { getPersonalData(locale, data.jwtToken) .then((profile) => { localStorage.setItem(AUTH_USER, JSON.stringify(profile)); updateToken(data.jwtToken); handleCancel(); }) } }) .catch((error) => { notification.error({ message: 'Error', description: error?.response?.data?.errMessage }); }) .finally(() => { setIsLoading(false); }) }); }; const onSocialEnter = (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 ( <>
{i18nText('enter', locale)} updateMode('register')}>{i18nText('registration', locale)} updateMode('reset')} > {`${i18nText('forgotPass', locale)}?`} {i18nText('or', locale)} } onClick={() => onSocialEnter(Social.FACEBOOK)} > {i18nText('facebook', locale)} } onClick={() => onSocialEnter(Social.APPLE)} > {i18nText('apple', locale)} } onClick={() => onSocialEnter(Social.GOOGLE)} > {i18nText('google', locale)} ); };