#129: do not render app, if we are on oauth request, that resolves to redirect

This commit is contained in:
SleepWalker 2016-06-02 20:46:49 +03:00
parent 3478c25342
commit 1ff6a05414
5 changed files with 28 additions and 7 deletions

View File

@ -37,7 +37,10 @@ userFactory(store)
ReactDOM.render( ReactDOM.render(
<ReduxProvider store={store}> <ReduxProvider store={store}>
<IntlProvider> <IntlProvider>
<Router history={browserHistory} onUpdate={restoreScroll}> <Router history={browserHistory} onUpdate={() => {
restoreScroll();
stopLoading();
}}>
{routesFactory(store)} {routesFactory(store)}
</Router> </Router>
</IntlProvider> </IntlProvider>
@ -45,7 +48,6 @@ userFactory(store)
document.getElementById('app') document.getElementById('app')
); );
document.getElementById('loader').classList.remove('is-active');
}); });
/** /**
@ -66,7 +68,13 @@ function restoreScroll() {
}, 100); }, 100);
} }
function stopLoading() {
document.getElementById('loader').classList.remove('is-active');
}
if (process.env.NODE_ENV !== 'production') { if (process.env.NODE_ENV !== 'production') {
// some shortcuts for testing on localhost // some shortcuts for testing on localhost
window.testOAuth = () => location.href = '/oauth?client_id=ely&redirect_uri=http%3A%2F%2Fely.by&response_type=code&scope=minecraft_server_session'; window.testOAuth = () => location.href = '/oauth?client_id=ely&redirect_uri=http%3A%2F%2Fely.by&response_type=code&scope=minecraft_server_session';
window.testOAuthStatic = () => location.href = '/oauth?client_id=ely&redirect_uri=static_page_with_code&response_type=code&scope=minecraft_server_session';
window.testOAuthStaticCode = () => location.href = '/oauth?client_id=ely&redirect_uri=static_page&response_type=code&scope=minecraft_server_session';
} }

View File

@ -30,7 +30,7 @@ export default function routesFactory(store) {
authFlow.setStore(store); authFlow.setStore(store);
const startAuthFlow = { const startAuthFlow = {
onEnter: ({location}, replace) => authFlow.handleRequest(location.pathname, replace) onEnter: ({location}, replace, callback) => authFlow.handleRequest(location.pathname, replace, callback)
}; };
const userOnly = { const userOnly = {

View File

@ -77,11 +77,20 @@ export default class AuthFlow {
this.state && this.state.leave(this); this.state && this.state.leave(this);
this.state = state; this.state = state;
this.state.enter(this); const resp = this.state.enter(this);
if (resp && resp.then) {
// this is a state with an async enter phase
// block route components from mounting, till promise will be resolved
const callback = this.onReady;
this.onReady = () => {};
return resp.then(callback);
}
} }
handleRequest(path, replace) { handleRequest(path, replace, callback) {
this.replace = replace; this.replace = replace;
this.onReady = callback;
if (path === '/') { if (path === '/') {
// reset oauth data if user tried to navigate to index route // reset oauth data if user tried to navigate to index route
@ -125,5 +134,7 @@ export default class AuthFlow {
throw new Error(`Unsupported request: ${path}`); throw new Error(`Unsupported request: ${path}`);
} }
} }
this.onReady();
} }
} }

View File

@ -32,13 +32,15 @@ export default class CompleteState extends AbstractState {
context.setState(new PermissionsState()); context.setState(new PermissionsState());
return; return;
} }
context.run('oAuthComplete', data).then((resp) => { // TODO: it seams that oAuthComplete may be a separate state
return context.run('oAuthComplete', data).then((resp) => {
// TODO: пусть в стейт попадает флаг или тип авторизации // TODO: пусть в стейт попадает флаг или тип авторизации
// вместо волшебства над редирект урлой // вместо волшебства над редирект урлой
if (resp.redirectUri.indexOf('static_page') === 0) { if (resp.redirectUri.indexOf('static_page') === 0) {
context.setState(new FinishState()); context.setState(new FinishState());
} else { } else {
context.run('redirect', resp.redirectUri); context.run('redirect', resp.redirectUri);
return Promise.reject(); // do not allow loader to be hidden and app to be rendered
} }
}, (resp) => { }, (resp) => {
if (resp.unauthorized) { if (resp.unauthorized) {

View File

@ -5,7 +5,7 @@ export default class OAuthState extends AbstractState {
enter(context) { enter(context) {
const query = context.getState().routing.location.query; const query = context.getState().routing.location.query;
context.run('oAuthValidate', { return context.run('oAuthValidate', {
clientId: query.client_id, clientId: query.client_id,
redirectUrl: query.redirect_uri, redirectUrl: query.redirect_uri,
responseType: query.response_type, responseType: query.response_type,