2016-03-02 02:06:14 +05:30
|
|
|
import AbstractState from './AbstractState';
|
|
|
|
import LoginState from './LoginState';
|
|
|
|
import PermissionsState from './PermissionsState';
|
2016-11-13 20:17:56 +05:30
|
|
|
import ChooseAccountState from './ChooseAccountState';
|
2016-03-02 02:06:14 +05:30
|
|
|
import ActivationState from './ActivationState';
|
2016-08-03 00:29:29 +05:30
|
|
|
import AcceptRulesState from './AcceptRulesState';
|
2016-03-15 12:06:13 +05:30
|
|
|
import FinishState from './FinishState';
|
2016-03-02 02:06:14 +05:30
|
|
|
|
2016-11-19 20:11:15 +05:30
|
|
|
const PROMPT_ACCOUNT_CHOOSE = 'select_account';
|
|
|
|
const PROMPT_PERMISSIONS = 'consent';
|
|
|
|
|
2016-03-02 02:06:14 +05:30
|
|
|
export default class CompleteState extends AbstractState {
|
2016-03-15 12:06:13 +05:30
|
|
|
constructor(options = {}) {
|
|
|
|
super(options);
|
|
|
|
|
2016-03-21 11:46:37 +05:30
|
|
|
this.isPermissionsAccepted = options.accept;
|
2016-03-15 12:06:13 +05:30
|
|
|
}
|
|
|
|
|
2016-03-02 02:06:14 +05:30
|
|
|
enter(context) {
|
2016-11-19 18:13:50 +05:30
|
|
|
const {auth = {}, user, accounts} = context.getState();
|
2016-03-02 02:06:14 +05:30
|
|
|
|
|
|
|
if (user.isGuest) {
|
|
|
|
context.setState(new LoginState());
|
|
|
|
} else if (!user.isActive) {
|
|
|
|
context.setState(new ActivationState());
|
2016-08-03 00:29:29 +05:30
|
|
|
} else if (user.shouldAcceptRules) {
|
|
|
|
context.setState(new AcceptRulesState());
|
2016-03-16 10:33:23 +05:30
|
|
|
} else if (auth.oauth && auth.oauth.clientId) {
|
2016-11-19 20:11:15 +05:30
|
|
|
let isSwitcherEnabled = auth.isSwitcherEnabled;
|
|
|
|
|
|
|
|
if (auth.oauth.loginHint) {
|
|
|
|
const account = accounts.available.filter((account) =>
|
|
|
|
account.id === auth.oauth.loginHint * 1
|
|
|
|
|| account.email === auth.oauth.loginHint
|
|
|
|
|| account.username === auth.oauth.loginHint
|
|
|
|
)[0];
|
|
|
|
|
|
|
|
if (account) {
|
|
|
|
// disable switching, because we are know the account, user must be authorized with
|
|
|
|
context.run('setAccountSwitcher', false);
|
|
|
|
isSwitcherEnabled = false;
|
|
|
|
|
|
|
|
if (account.id !== accounts.active.id) {
|
|
|
|
// lets switch user to an account, that is needed for auth
|
|
|
|
return context.run('authenticate', account)
|
|
|
|
.then(() => context.setState(new CompleteState()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isSwitcherEnabled
|
|
|
|
&& (accounts.available.length > 1
|
|
|
|
|| auth.oauth.prompt.includes(PROMPT_ACCOUNT_CHOOSE)
|
|
|
|
)
|
|
|
|
) {
|
2016-11-13 20:17:56 +05:30
|
|
|
context.setState(new ChooseAccountState());
|
|
|
|
} else if (auth.oauth.code) {
|
2016-03-15 12:06:13 +05:30
|
|
|
context.setState(new FinishState());
|
|
|
|
} else {
|
2016-03-21 11:46:37 +05:30
|
|
|
const data = {};
|
|
|
|
if (typeof this.isPermissionsAccepted !== 'undefined') {
|
2016-03-15 12:06:13 +05:30
|
|
|
data.accept = this.isPermissionsAccepted;
|
2016-11-19 20:11:15 +05:30
|
|
|
} else if (auth.oauth.acceptRequired || auth.oauth.prompt.includes(PROMPT_PERMISSIONS)) {
|
2016-04-15 01:24:35 +05:30
|
|
|
context.setState(new PermissionsState());
|
|
|
|
return;
|
2016-03-02 02:06:14 +05:30
|
|
|
}
|
2016-06-02 23:16:49 +05:30
|
|
|
// TODO: it seams that oAuthComplete may be a separate state
|
|
|
|
return context.run('oAuthComplete', data).then((resp) => {
|
2016-03-21 11:46:37 +05:30
|
|
|
// TODO: пусть в стейт попадает флаг или тип авторизации
|
|
|
|
// вместо волшебства над редирект урлой
|
|
|
|
if (resp.redirectUri.indexOf('static_page') === 0) {
|
2016-03-21 01:06:30 +05:30
|
|
|
context.setState(new FinishState());
|
|
|
|
} else {
|
2016-12-07 02:38:51 +05:30
|
|
|
return new Promise(() => {
|
|
|
|
// do not resolve promise to make loader visible and
|
|
|
|
// overcome app rendering
|
|
|
|
context.run('redirect', resp.redirectUri);
|
|
|
|
});
|
2016-03-15 12:06:13 +05:30
|
|
|
}
|
|
|
|
}, (resp) => {
|
|
|
|
if (resp.unauthorized) {
|
|
|
|
context.setState(new LoginState());
|
|
|
|
} else if (resp.acceptRequired) {
|
|
|
|
context.setState(new PermissionsState());
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2016-03-02 02:06:14 +05:30
|
|
|
} else {
|
|
|
|
context.navigate('/');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|