mirror of
https://github.com/elyby/accounts-frontend.git
synced 2025-01-14 15:52:44 +05:30
#245: back button on login panel for users with multy accs. Added history service
This commit is contained in:
parent
a4fd1314c2
commit
b2202f8831
@ -323,9 +323,15 @@ class PanelTransition extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getHeader({key, style, data}) {
|
getHeader({key, style, data}) {
|
||||||
const {Title, hasBackButton} = data;
|
const {Title} = data;
|
||||||
const {transformSpring} = style;
|
const {transformSpring} = style;
|
||||||
|
|
||||||
|
let {hasBackButton} = data;
|
||||||
|
|
||||||
|
if (typeof hasBackButton === 'function') {
|
||||||
|
hasBackButton = hasBackButton(this.props);
|
||||||
|
}
|
||||||
|
|
||||||
style = {
|
style = {
|
||||||
...this.getDefaultTransitionStyles(key, style),
|
...this.getDefaultTransitionStyles(key, style),
|
||||||
opacity: 1 // reset default
|
opacity: 1 // reset default
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import { routeActions } from 'react-router-redux';
|
import { routeActions } from 'react-router-redux';
|
||||||
|
|
||||||
import logger from 'services/logger';
|
import logger from 'services/logger';
|
||||||
|
import history from 'services/history';
|
||||||
import { updateUser, acceptRules as userAcceptRules } from 'components/user/actions';
|
import { updateUser, acceptRules as userAcceptRules } from 'components/user/actions';
|
||||||
import { authenticate, logoutAll } from 'components/accounts/actions';
|
import { authenticate, logoutAll } from 'components/accounts/actions';
|
||||||
import authentication from 'services/api/authentication';
|
import authentication from 'services/api/authentication';
|
||||||
@ -11,6 +12,25 @@ import dispatchBsod from 'components/ui/bsod/dispatchBsod';
|
|||||||
export { updateUser } from 'components/user/actions';
|
export { updateUser } from 'components/user/actions';
|
||||||
export { authenticate, logoutAll as logout } from 'components/accounts/actions';
|
export { authenticate, logoutAll as logout } from 'components/accounts/actions';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reoutes user to the previous page if it is possible
|
||||||
|
*
|
||||||
|
* @param {string} fallbackUrl - an url to route user to if goBack is not possible
|
||||||
|
*
|
||||||
|
* @return {object} - action definition
|
||||||
|
*/
|
||||||
|
export function goBack(fallbackUrl = null) {
|
||||||
|
if (history.canGoBack()) {
|
||||||
|
return routeActions.goBack();
|
||||||
|
} else if (fallbackUrl) {
|
||||||
|
return routeActions.push(fallbackUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
type: 'noop'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
export function login({login = '', password = '', rememberMe = false}) {
|
export function login({login = '', password = '', rememberMe = false}) {
|
||||||
const PASSWORD_REQUIRED = 'error.password_required';
|
const PASSWORD_REQUIRED = 'error.password_required';
|
||||||
const LOGIN_REQUIRED = 'error.login_required';
|
const LOGIN_REQUIRED = 'error.login_required';
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
import React from 'react';
|
|
||||||
|
|
||||||
import { Input } from 'components/ui/form';
|
import { Input } from 'components/ui/form';
|
||||||
import BaseAuthBody from 'components/auth/BaseAuthBody';
|
import BaseAuthBody from 'components/auth/BaseAuthBody';
|
||||||
|
|
||||||
@ -8,6 +6,9 @@ import messages from './Login.intl.json';
|
|||||||
export default class LoginBody extends BaseAuthBody {
|
export default class LoginBody extends BaseAuthBody {
|
||||||
static displayName = 'LoginBody';
|
static displayName = 'LoginBody';
|
||||||
static panelId = 'login';
|
static panelId = 'login';
|
||||||
|
static hasGoBack = (state) => {
|
||||||
|
return !state.user.isGuest;
|
||||||
|
};
|
||||||
|
|
||||||
autoFocusField = 'login';
|
autoFocusField = 'login';
|
||||||
|
|
||||||
|
@ -15,6 +15,9 @@ import storeFactory from 'storeFactory';
|
|||||||
import bsodFactory from 'components/ui/bsod/factory';
|
import bsodFactory from 'components/ui/bsod/factory';
|
||||||
import loader from 'services/loader';
|
import loader from 'services/loader';
|
||||||
import logger from 'services/logger';
|
import logger from 'services/logger';
|
||||||
|
import history from 'services/history';
|
||||||
|
|
||||||
|
history.init();
|
||||||
|
|
||||||
logger.init({
|
logger.init({
|
||||||
sentryCdn: window.SENTRY_CDN
|
sentryCdn: window.SENTRY_CDN
|
||||||
|
@ -7,15 +7,16 @@ export default class LoginState extends AbstractState {
|
|||||||
enter(context) {
|
enter(context) {
|
||||||
const {auth, user} = context.getState();
|
const {auth, user} = context.getState();
|
||||||
|
|
||||||
|
const isUserAddsSecondAccount = !user.isGuest
|
||||||
|
&& /login|password/.test(context.getRequest().path); // TODO: improve me
|
||||||
|
|
||||||
// TODO: it may not allow user to leave password state till he click back or enters password
|
// TODO: it may not allow user to leave password state till he click back or enters password
|
||||||
if (auth.login) {
|
if (auth.login) {
|
||||||
context.setState(new PasswordState());
|
context.setState(new PasswordState());
|
||||||
} else if (user.isGuest
|
} else if (user.isGuest || isUserAddsSecondAccount) {
|
||||||
// for the case, when user is logged in and wants to add a new aacount
|
|
||||||
|| /login|password/.test(context.getRequest().path) // TODO: improve me
|
|
||||||
) {
|
|
||||||
context.navigate('/login');
|
context.navigate('/login');
|
||||||
} else {
|
} else {
|
||||||
|
// can not detect needed state. Delegating decision to the next state
|
||||||
context.setState(new PasswordState());
|
context.setState(new PasswordState());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -25,4 +26,8 @@ export default class LoginState extends AbstractState {
|
|||||||
.then(() => context.setState(new PasswordState()))
|
.then(() => context.setState(new PasswordState()))
|
||||||
.catch((err = {}) => err.errors || logger.warn(err));
|
.catch((err = {}) => err.errors || logger.warn(err));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
goBack(context) {
|
||||||
|
context.run('goBack', '/');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
17
src/services/history.js
Normal file
17
src/services/history.js
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* A helper wrapper service around window.history
|
||||||
|
*/
|
||||||
|
|
||||||
|
export default {
|
||||||
|
init() {
|
||||||
|
this.initialLength = window.history.length;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return {bool} - whether history.back() can be safetly called
|
||||||
|
*/
|
||||||
|
canGoBack() {
|
||||||
|
return document.referrer.includes(`${location.protocol}//${location.host}`)
|
||||||
|
|| this.initialLength < window.history.length;
|
||||||
|
}
|
||||||
|
}
|
@ -81,4 +81,12 @@ describe('LoginState', () => {
|
|||||||
return promise.catch(mock.verify.bind(mock));
|
return promise.catch(mock.verify.bind(mock));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('#goBack', () => {
|
||||||
|
it('should return to previous page', () => {
|
||||||
|
expectRun(mock, 'goBack', '/');
|
||||||
|
|
||||||
|
state.goBack(context);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user