1
0
Fork 0
mirror of https://github.com/muerwre/vault-frontend.git synced 2025-04-25 04:46:40 +07:00

receiving window messages

This commit is contained in:
Fedor Katurov 2019-11-02 18:45:58 +07:00
parent f7b8b56b53
commit 49bccb96c1
8 changed files with 68 additions and 37 deletions

View file

@ -13,6 +13,7 @@ import { DIALOGS } from '~/redux/modal/constants';
import { pick } from 'ramda';
import { Icon } from '~/components/input/Icon';
import { getURL } from '~/utils/dom';
import { API } from '~/constants/api';
const mapStateToProps = state => ({
user: pick(['username', 'is_user', 'photo'])(selectUser(state)),
@ -27,6 +28,9 @@ type IProps = ReturnType<typeof mapStateToProps> & typeof mapDispatchToProps & {
const HeaderUnconnected: FC<IProps> = memo(({ user: { username, is_user, photo }, showDialog }) => {
const onLogin = useCallback(() => showDialog(DIALOGS.LOGIN), [showDialog]);
const onSocialLogin = useCallback(() => {
window.open(API.USER.VKONTAKTE_LOGIN, '', 'width=600,height=400');
}, []);
return (
<div className={style.container}>
@ -36,6 +40,7 @@ const HeaderUnconnected: FC<IProps> = memo(({ user: { username, is_user, photo }
<div className={style.plugs}>
<Link to="/">flow</Link>
<a onClick={onSocialLogin}>SOCIAL</a>
</div>
{is_user && (

View file

@ -4,6 +4,7 @@ export const API = {
BASE: process.env.API_HOST,
USER: {
LOGIN: '/auth/login',
VKONTAKTE_LOGIN: `${process.env.API_HOST}/auth/vkontakte`,
ME: '/auth/', //
UPLOAD: (target, type) => `/upload/${target}/${type}`,
},

View file

@ -1,4 +1,4 @@
import React, { FC } from 'react';
import React, { FC, useEffect } from 'react';
import { connect } from 'react-redux';
import { hot } from 'react-hot-loader';
import { ConnectedRouter } from 'connected-react-router';
@ -25,31 +25,33 @@ const mapDispatchToProps = {};
type IProps = typeof mapDispatchToProps & ReturnType<typeof mapStateToProps> & {};
const Component: FC<IProps> = ({ modal: { is_shown } }) => (
<ConnectedRouter history={history}>
<div>
<BlurWrapper is_blurred={is_shown}>
<PageCover />
<MainLayout>
<Modal />
<Sprites />
const Component: FC<IProps> = ({ modal: { is_shown } }) => {
return (
<ConnectedRouter history={history}>
<div>
<BlurWrapper is_blurred={is_shown}>
<PageCover />
<MainLayout>
<Modal />
<Sprites />
<Switch>
<Route exact path={URLS.BASE} component={FlowLayout} />
<Route path={URLS.EXAMPLES.IMAGE} component={ImageExample} />
<Route path={URLS.EXAMPLES.EDITOR} component={EditorExample} />
<Route path="/examples/horizontal" component={HorizontalExample} />
<Route path="/post:id" component={NodeLayout} />
<Switch>
<Route exact path={URLS.BASE} component={FlowLayout} />
<Route path={URLS.EXAMPLES.IMAGE} component={ImageExample} />
<Route path={URLS.EXAMPLES.EDITOR} component={EditorExample} />
<Route path="/examples/horizontal" component={HorizontalExample} />
<Route path="/post:id" component={NodeLayout} />
<Redirect to="/" />
</Switch>
</MainLayout>
</BlurWrapper>
<Redirect to="/" />
</Switch>
</MainLayout>
</BlurWrapper>
<BottomContainer />
</div>
</ConnectedRouter>
);
<BottomContainer />
</div>
</ConnectedRouter>
);
};
export default connect(
mapStateToProps,

View file

@ -2,17 +2,29 @@ import { AUTH_USER_ACTIONS } from '~/redux/auth/constants';
import { IAuthState, IUser } from '~/redux/auth/types';
export const userSendLoginRequest = ({
username, password
username,
password,
}: {
username: string; password: string;
username: string;
password: string;
}) => ({ type: AUTH_USER_ACTIONS.SEND_LOGIN_REQUEST, username, password });
export const userSetLoginError = (error: IAuthState['login']['error']) => ({
type: AUTH_USER_ACTIONS.SET_LOGIN_ERROR, error
type: AUTH_USER_ACTIONS.SET_LOGIN_ERROR,
error,
});
export const authSetToken = (token: IAuthState['token']) => ({
type: AUTH_USER_ACTIONS.SET_TOKEN, token,
type: AUTH_USER_ACTIONS.SET_TOKEN,
token,
});
export const authSetUser = (profile: Partial<IUser>) => ({ type: AUTH_USER_ACTIONS.SET_USER, profile });
export const gotPostMessage = (message: MessageEvent) => ({
type: AUTH_USER_ACTIONS.GOT_POST_MESSAGE,
message,
});
export const authSetUser = (profile: Partial<IUser>) => ({
type: AUTH_USER_ACTIONS.SET_USER,
profile,
});

View file

@ -5,6 +5,8 @@ export const AUTH_USER_ACTIONS = {
SET_LOGIN_ERROR: 'SET_LOGIN_ERROR',
SET_USER: 'SET_USER',
SET_TOKEN: 'SET_TOKEN',
GOT_POST_MESSAGE: 'GOT_POST_MESSAGE',
};
export const USER_ERRORS = {

View file

@ -5,6 +5,7 @@ import {
userSetLoginError,
authSetUser,
userSendLoginRequest,
gotPostMessage,
} from '~/redux/auth/actions';
import { apiUserLogin, apiAuthGetUser } from '~/redux/auth/api';
import { modalSetShown } from '~/redux/modal/actions';
@ -12,6 +13,7 @@ import { selectToken } from './selectors';
import { IResultWithStatus } from '../types';
import { IUser } from './types';
import { REHYDRATE, RehydrateAction } from 'redux-persist';
import path from 'ramda/es/path';
export function* reqWrapper(requestAction, props = {}): ReturnType<typeof requestAction> {
const access = yield select(selectToken);
@ -68,9 +70,16 @@ function* checkUserSaga({ key }: RehydrateAction) {
yield put(authSetUser({ ...user, is_user: true }));
}
function* gotPostMessageSaga({ message }: ReturnType<typeof gotPostMessage>) {
if (path(['data', 'type'], message) !== 'oauth_login') return;
console.log({ message });
}
function* authSaga() {
yield takeLatest(REHYDRATE, checkUserSaga);
yield takeLatest(AUTH_USER_ACTIONS.SEND_LOGIN_REQUEST, sendLoginRequestSaga);
yield takeLatest(AUTH_USER_ACTIONS.GOT_POST_MESSAGE, gotPostMessageSaga);
}
export default authSaga;

View file

@ -87,13 +87,12 @@ export const NODE_INLINES: INodeComponents = {
export const EMPTY_COMMENT: IComment = {
id: null,
text: '',
// files: [],
// temp_ids: [],
// is_private: false,
// user: null,
files: [],
temp_ids: [],
is_private: false,
user: null,
// id: null,
// text: '',
/*
files: [
{
name: 'screenshot_2019-09-29_21-13-38_502253296-1572589001092.png',
@ -179,9 +178,7 @@ export const EMPTY_COMMENT: IComment = {
id: 8713,
},
],
temp_ids: [],
is_private: false,
user: null,
*/
};
export const NODE_EDITORS = {

View file

@ -25,6 +25,7 @@ import playerSaga from '~/redux/player/sagas';
import { IAuthState } from '~/redux/auth/types';
import modalReducer, { IModalState } from '~/redux/modal/reducer';
import { gotPostMessage } from './auth/actions';
const authPersistConfig: PersistConfig = {
key: 'auth',
@ -70,6 +71,8 @@ export function configureStore(): { store: Store<IState>; persistor: Persistor }
sagaMiddleware.run(flowSaga);
sagaMiddleware.run(playerSaga);
window.addEventListener('message', message => store.dispatch(gotPostMessage(message)));
const persistor = persistStore(store);
return { store, persistor };