From 441a0824cc24aaca603c799f5c7137899b5a7781 Mon Sep 17 00:00:00 2001 From: Fedor Katurov Date: Wed, 19 Aug 2020 18:26:53 +0700 Subject: [PATCH] moved reaction for oauth events to sagas --- src/containers/dialogs/LoginDialog/index.tsx | 22 ++++++-------------- src/redux/auth/actions.ts | 7 ++++++- src/redux/auth/constants.ts | 1 + src/redux/auth/sagas.ts | 14 +++++++++++++ src/redux/types.ts | 11 ++++++++++ 5 files changed, 38 insertions(+), 17 deletions(-) diff --git a/src/containers/dialogs/LoginDialog/index.tsx b/src/containers/dialogs/LoginDialog/index.tsx index 486c48fa..f694d668 100644 --- a/src/containers/dialogs/LoginDialog/index.tsx +++ b/src/containers/dialogs/LoginDialog/index.tsx @@ -14,9 +14,9 @@ import * as styles from './styles.scss'; import * as ACTIONS from '~/redux/auth/actions'; import * as MODAL_ACTIONS from '~/redux/modal/actions'; import { ISocialProvider } from '~/redux/auth/types'; -import { Grid } from '~/components/containers/Grid'; import pick from 'ramda/es/pick'; import { LoginDialogButtons } from '~/containers/dialogs/LoginDialogButtons'; +import { IOAuthEvent } from '~/redux/types'; const mapStateToProps = state => ({ ...pick(['error', 'is_registering'], selectAuthLogin(state)), @@ -27,6 +27,7 @@ const mapDispatchToProps = { userSetLoginError: ACTIONS.userSetLoginError, authLoginWithSocial: ACTIONS.authLoginWithSocial, modalShowDialog: MODAL_ACTIONS.modalShowDialog, + authGotOauthEvent: ACTIONS.authGotOauthEvent, }; type IProps = ReturnType & typeof mapDispatchToProps & IDialogProps & {}; @@ -39,6 +40,7 @@ const LoginDialogUnconnected: FC = ({ userSetLoginError, authLoginWithSocial, modalShowDialog, + authGotOauthEvent, }) => { const [username, setUserName] = useState(''); const [password, setPassword] = useState(''); @@ -67,21 +69,9 @@ const LoginDialogUnconnected: FC = ({ [] ); - const onMessage = useCallback( - (event: MessageEvent) => { - if (!event?.data?.type) return; - - switch (event?.data?.type) { - case 'oauth_processed': - return authLoginWithSocial(event?.data?.payload?.token); - case 'oauth_error': - return userSetLoginError(event?.data?.payload?.error); - default: - return; - } - }, - [authLoginWithSocial, userSetLoginError] - ); + const onMessage = useCallback((event: IOAuthEvent) => authGotOauthEvent(event), [ + authGotOauthEvent, + ]); useEffect(() => { if (error) userSetLoginError(null); diff --git a/src/redux/auth/actions.ts b/src/redux/auth/actions.ts index 15e8eae4..a1a14466 100644 --- a/src/redux/auth/actions.ts +++ b/src/redux/auth/actions.ts @@ -1,6 +1,6 @@ import { AUTH_USER_ACTIONS } from '~/redux/auth/constants'; import { IAuthState, ISocialProvider, IUser } from '~/redux/auth/types'; -import { IMessage } from '../types'; +import { IMessage, IOAuthEvent } from '../types'; export const userSendLoginRequest = ({ username, @@ -133,3 +133,8 @@ export const authLoginWithSocial = (token: string, username?: string, password?: username, password, }); + +export const authGotOauthEvent = (event: IOAuthEvent) => ({ + type: AUTH_USER_ACTIONS.GOT_OAUTH_EVENT, + event, +}); diff --git a/src/redux/auth/constants.ts b/src/redux/auth/constants.ts index 0905e379..9a5ae2ed 100644 --- a/src/redux/auth/constants.ts +++ b/src/redux/auth/constants.ts @@ -31,6 +31,7 @@ export const AUTH_USER_ACTIONS = { SET_SOCIALS: 'SET_SOCIALS', ATTACH_SOCIAL: 'ATTACH_SOCIAL', LOGIN_WITH_SOCIAL: 'LOGIN_WITH_SOCIAL', + GOT_OAUTH_EVENT: 'GOT_OAUTH_EVENT', }; export const USER_ERRORS = { diff --git a/src/redux/auth/sagas.ts b/src/redux/auth/sagas.ts index b3aa7aa8..0207b8a8 100644 --- a/src/redux/auth/sagas.ts +++ b/src/redux/auth/sagas.ts @@ -4,6 +4,7 @@ import { authAttachSocial, authDropSocial, authGetMessages, + authGotOauthEvent, authLoadProfile, authLoggedIn, authLoginWithSocial, @@ -473,6 +474,18 @@ function* loginWithSocial({ token }: ReturnType) { } } +function* gotOauthEvent({ event }: ReturnType) { + if (!event?.data?.type) return; + + switch (event?.data?.type) { + case 'oauth_processed': + return put(authLoginWithSocial(event?.data?.payload?.token)); + case 'oauth_error': + return put(userSetLoginError(event?.data?.payload?.error)); + default: + return; + } +} function* authSaga() { yield takeEvery(REHYDRATE, checkUserSaga); yield takeLatest([REHYDRATE, AUTH_USER_ACTIONS.LOGGED_IN], startPollingSaga); @@ -493,6 +506,7 @@ function* authSaga() { yield takeLatest(AUTH_USER_ACTIONS.DROP_SOCIAL, dropSocial); yield takeLatest(AUTH_USER_ACTIONS.ATTACH_SOCIAL, attachSocial); yield takeLatest(AUTH_USER_ACTIONS.LOGIN_WITH_SOCIAL, loginWithSocial); + yield takeEvery(AUTH_USER_ACTIONS.GOT_OAUTH_EVENT, gotOauthEvent); } export default authSaga; diff --git a/src/redux/types.ts b/src/redux/types.ts index 786fec6f..0f666354 100644 --- a/src/redux/types.ts +++ b/src/redux/types.ts @@ -206,3 +206,14 @@ export interface IEmbed { duration: string; }; } + +export type IOAuthEvent = MessageEvent & { + data: { + type: 'oauth_processed' | 'oauth_error'; + payload: { + token: string; + error: string; + needs_register: boolean; + }; + }; +};