accounts-frontend/src/services/authFlow/AuthFlow.js

117 lines
2.8 KiB
JavaScript
Raw Normal View History

2016-03-02 02:06:14 +05:30
import { routeActions } from 'react-router-redux';
import * as actions from 'components/auth/actions';
import {updateUser} from 'components/user/actions';
import RegisterState from './RegisterState';
import LoginState from './LoginState';
import OAuthState from './OAuthState';
import ForgotPasswordState from './ForgotPasswordState';
const availableActions = {
...actions,
updateUser
};
export default class AuthFlow {
constructor(states) {
this.states = states;
}
setStore(store) {
this.navigate = (route) => {
const {routing} = this.getState();
if (routing.location.pathname !== route) {
this.ignoreRequest = true; // TODO: remove me
if (this.replace) {
this.replace(route);
}
store.dispatch(routeActions.push(route));
}
this.replace = null;
};
this.getState = store.getState.bind(store);
this.dispatch = store.dispatch.bind(store);
}
resolve(payload = {}) {
this.state.resolve(this, payload);
}
reject(payload = {}) {
this.state.reject(this, payload);
}
goBack() {
this.state.goBack(this);
}
run(actionId, payload) {
if (!availableActions[actionId]) {
throw new Error(`Action ${actionId} does not exists`);
}
return this.dispatch(availableActions[actionId](payload));
}
setState(state) {
if (!state) {
throw new Error('State is required');
}
if (this.state instanceof state.constructor) {
// already in this state
return;
}
this.state && this.state.leave(this);
this.state = state;
this.state.enter(this);
}
handleRequest(path, replace) {
this.replace = replace;
if (this.ignoreRequest) {
this.ignoreRequest = false;
return;
}
switch (path) {
case '/oauth':
this.setState(new OAuthState());
break;
case '/register':
this.setState(new RegisterState());
break;
case '/forgot-password':
this.setState(new ForgotPasswordState());
break;
case '/login':
case '/password':
case '/activation':
case '/password-change':
case '/oauth/permissions':
this.setState(new LoginState());
break;
case '/logout':
this.run('logout');
this.setState(new LoginState());
break;
default:
throw new Error(`Unsupported request: ${path}`);
}
}
login() {
this.setState(new LoginState());
}
}