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) {
|
|
|
|
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');
|
|
|
|
}
|
|
|
|
|
2016-03-13 14:32:24 +05:30
|
|
|
// if (this.state instanceof state.constructor) {
|
|
|
|
// // already in this state
|
|
|
|
// return;
|
|
|
|
// }
|
2016-03-02 02:06:14 +05:30
|
|
|
|
|
|
|
this.state && this.state.leave(this);
|
|
|
|
this.state = state;
|
|
|
|
this.state.enter(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
handleRequest(path, replace) {
|
|
|
|
this.replace = replace;
|
|
|
|
|
|
|
|
switch (path) {
|
|
|
|
case '/oauth':
|
|
|
|
this.setState(new OAuthState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case '/register':
|
|
|
|
this.setState(new RegisterState());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case '/forgot-password':
|
|
|
|
this.setState(new ForgotPasswordState());
|
|
|
|
break;
|
|
|
|
|
2016-03-13 14:32:24 +05:30
|
|
|
case '/':
|
2016-03-02 02:06:14 +05:30
|
|
|
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());
|
|
|
|
}
|
|
|
|
}
|