code refactor
This commit is contained in:
@@ -60,6 +60,19 @@ export default {
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
if (this.$user.isUserLogined()) {
|
||||
if (!this.$settings.isEnableApplicationLock()) {
|
||||
// refresh token if user is logined
|
||||
this.$store.dispatch('refreshTokenAndRevokeOldToken');
|
||||
|
||||
// auto refresh exchange rates data
|
||||
if (this.$settings.isAutoUpdateExchangeRatesData()) {
|
||||
this.$services.autoRefreshLatestExchangeRates();
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
isiOSHomeScreenMode() {
|
||||
if ((/iphone|ipod|ipad/gi).test(navigator.platform) && (/Safari/i).test(navigator.appVersion) &&
|
||||
|
||||
+16
-23
@@ -96,31 +96,22 @@ export default {
|
||||
return axios.get('logout.json');
|
||||
},
|
||||
refreshToken: () => {
|
||||
needBlockRequest = true;
|
||||
return new Promise((resolve) => {
|
||||
needBlockRequest = true;
|
||||
|
||||
return axios.post('v1/tokens/refresh.json', {} , {
|
||||
ignoreBlocked: true
|
||||
}).then(response => {
|
||||
const data = response.data;
|
||||
axios.post('v1/tokens/refresh.json', {}, {
|
||||
ignoreBlocked: true
|
||||
}).then(response => {
|
||||
const data = response.data;
|
||||
|
||||
if (data && data.success && data.result && data.result.newToken) {
|
||||
userState.updateToken(data.result.newToken);
|
||||
userState.updateUserInfo(data.result.user);
|
||||
resolve(response);
|
||||
needBlockRequest = false;
|
||||
|
||||
if (data.result.oldTokenId) {
|
||||
axios.post('v1/tokens/revoke.json', {
|
||||
tokenId: data.result.oldTokenId
|
||||
}, {
|
||||
ignoreError: true
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
needBlockRequest = false;
|
||||
return data.result.newToken;
|
||||
}).then(newToken => {
|
||||
blockedRequests.forEach(func => func(newToken));
|
||||
blockedRequests.length = 0;
|
||||
return data.result.newToken;
|
||||
}).then(newToken => {
|
||||
blockedRequests.forEach(func => func(newToken));
|
||||
blockedRequests.length = 0;
|
||||
});
|
||||
});
|
||||
},
|
||||
getDataExportUrl: () => {
|
||||
@@ -130,9 +121,11 @@ export default {
|
||||
getTokens: () => {
|
||||
return axios.get('v1/tokens/list.json');
|
||||
},
|
||||
revokeToken: ({ tokenId }) => {
|
||||
revokeToken: ({ tokenId, ignoreError }) => {
|
||||
return axios.post('v1/tokens/revoke.json', {
|
||||
tokenId
|
||||
}, {
|
||||
ignoreError: !!ignoreError
|
||||
});
|
||||
},
|
||||
revokeAllTokens: () => {
|
||||
|
||||
+4
-12
@@ -160,16 +160,8 @@ function updateUserInfo(user) {
|
||||
}
|
||||
}
|
||||
|
||||
function updateTokenAndUserInfo(item) {
|
||||
if (utils.isObject(item)) {
|
||||
if (item.token) {
|
||||
updateToken(item.token);
|
||||
}
|
||||
|
||||
if (item.user) {
|
||||
updateUserInfo(item.user);
|
||||
}
|
||||
}
|
||||
function clearUserInfo() {
|
||||
localStorage.removeItem(userInfoLocalStorageKey);
|
||||
}
|
||||
|
||||
function clearTokenAndUserInfo(clearAppLockState) {
|
||||
@@ -179,7 +171,7 @@ function clearTokenAndUserInfo(clearAppLockState) {
|
||||
|
||||
sessionStorage.removeItem(tokenSessionStorageKey);
|
||||
localStorage.removeItem(tokenLocalStorageKey);
|
||||
localStorage.removeItem(userInfoLocalStorageKey);
|
||||
clearUserInfo();
|
||||
}
|
||||
|
||||
export default {
|
||||
@@ -198,6 +190,6 @@ export default {
|
||||
isCorrectPinCode,
|
||||
updateToken,
|
||||
updateUserInfo,
|
||||
updateTokenAndUserInfo,
|
||||
clearUserInfo,
|
||||
clearTokenAndUserInfo
|
||||
};
|
||||
|
||||
@@ -227,18 +227,6 @@ Vue.filter('tokenIcon', (value) => tokenIconFilter(value));
|
||||
|
||||
Vue.prototype.$locale.init();
|
||||
|
||||
if (userstate.isUserLogined()) {
|
||||
if (!settings.isEnableApplicationLock()) {
|
||||
// refresh token if user is logined
|
||||
services.refreshToken();
|
||||
|
||||
// auto refresh exchange rates data
|
||||
if (settings.isAutoUpdateExchangeRatesData()) {
|
||||
services.autoRefreshLatestExchangeRates();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
new Vue({
|
||||
el: '#app',
|
||||
i18n: i18n,
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
import userState from "../lib/userstate.js";
|
||||
import utils from "../lib/utils.js";
|
||||
|
||||
import {
|
||||
RESET_STATE,
|
||||
|
||||
STORE_USER_INFO,
|
||||
CLEAR_USER_INFO,
|
||||
|
||||
LOAD_ACCOUNT_LIST,
|
||||
ADD_ACCOUNT_TO_ACCOUNT_LIST,
|
||||
SAVE_ACCOUNT_IN_ACCOUNT_LIST,
|
||||
@@ -20,12 +26,15 @@ import {
|
||||
UPDATE_TRANSACTION_TAG_LIST_INVALID_STATE
|
||||
} from './mutations.js';
|
||||
|
||||
import user from './user.js';
|
||||
import token from './token.js';
|
||||
import account from './account.js';
|
||||
import transactionTag from './transactionTag.js';
|
||||
|
||||
const stores = {
|
||||
strict: process.env.NODE_ENV !== 'production',
|
||||
state: {
|
||||
currentUserInfo: userState.getUserInfo(),
|
||||
allAccounts: [],
|
||||
allAccountsMap: {},
|
||||
allCategorizedAccounts: {},
|
||||
@@ -38,10 +47,32 @@ const stores = {
|
||||
transactions: [],
|
||||
},
|
||||
getters: {
|
||||
currentUserNickname: user.currentUserNickname,
|
||||
currentUserDefaultCurrency: user.currentUserDefaultCurrency,
|
||||
allAvailableAccountsCount: account.allAvailableAccountsCount,
|
||||
allVisibleAccountsCount: account.allVisibleAccountsCount,
|
||||
},
|
||||
mutations: {
|
||||
[RESET_STATE] (state) {
|
||||
state.allAccounts = [];
|
||||
state.allAccountsMap = {};
|
||||
state.allCategorizedAccounts = {};
|
||||
state.accountListStateInvalid = true;
|
||||
state.allTransactionCategories = [];
|
||||
state.allTransactionCategoriesMap = {};
|
||||
state.allTransactionTags = [];
|
||||
state.allTransactionTagsMap = {};
|
||||
state.transactionTagListStateInvalid = true;
|
||||
state.transactions = [];
|
||||
},
|
||||
[STORE_USER_INFO] (state, userInfo) {
|
||||
state.currentUserInfo = userInfo;
|
||||
userState.updateUserInfo(userInfo);
|
||||
},
|
||||
[CLEAR_USER_INFO] (state) {
|
||||
state.currentUserInfo = null;
|
||||
userState.clearUserInfo();
|
||||
},
|
||||
[LOAD_ACCOUNT_LIST] (state, accounts) {
|
||||
state.allAccounts = accounts;
|
||||
state.allAccountsMap = {};
|
||||
@@ -212,6 +243,17 @@ const stores = {
|
||||
},
|
||||
},
|
||||
actions: {
|
||||
authorize: user.authorize,
|
||||
authorize2FA: user.authorize2FA,
|
||||
register: user.register,
|
||||
logout: user.logout,
|
||||
getCurrentUserProfile: user.getCurrentUserProfile,
|
||||
updateUserProfile: user.updateUserProfile,
|
||||
clearUserInfoState: user.clearUserInfoState,
|
||||
getAllTokens: token.getAllTokens,
|
||||
refreshTokenAndRevokeOldToken: token.refreshTokenAndRevokeOldToken,
|
||||
revokeToken: token.revokeToken,
|
||||
revokeAllTokens: token.revokeAllTokens,
|
||||
loadAllAccounts: account.loadAllAccounts,
|
||||
saveAccount: account.saveAccount,
|
||||
getAccount: account.getAccount,
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
export const RESET_STATE = 'RESET_STATE';
|
||||
|
||||
export const STORE_USER_INFO = 'STORE_USER_INFO';
|
||||
export const CLEAR_USER_INFO = 'CLEAR_USER_INFO';
|
||||
|
||||
export const LOAD_ACCOUNT_LIST = 'LOAD_ACCOUNT_LIST';
|
||||
export const ADD_ACCOUNT_TO_ACCOUNT_LIST = 'ADD_ACCOUNT_TO_ACCOUNT_LIST';
|
||||
export const SAVE_ACCOUNT_IN_ACCOUNT_LIST = 'SAVE_ACCOUNT_IN_ACCOUNT_LIST';
|
||||
|
||||
@@ -0,0 +1,118 @@
|
||||
import userState from '../lib/userstate.js';
|
||||
import services from '../lib/services.js';
|
||||
import logger from '../lib/logger.js';
|
||||
import utils from '../lib/utils.js';
|
||||
|
||||
import {
|
||||
STORE_USER_INFO
|
||||
} from './mutations.js';
|
||||
|
||||
function getAllTokens() {
|
||||
return new Promise((resolve, reject) => {
|
||||
services.getTokens().then(response => {
|
||||
const data = response.data;
|
||||
|
||||
if (!data || !data.success || !data.result) {
|
||||
reject({ message: 'Unable to get session list' });
|
||||
return;
|
||||
}
|
||||
|
||||
resolve(data.result);
|
||||
}).catch(error => {
|
||||
logger.error('failed to load token list', error);
|
||||
|
||||
if (error.response && error.response.data && error.response.data.errorMessage) {
|
||||
reject({ error: error.response.data });
|
||||
} else if (!error.processed) {
|
||||
reject({ message: 'Unable to get session list' });
|
||||
} else {
|
||||
reject(error);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function refreshTokenAndRevokeOldToken(context) {
|
||||
return new Promise((resolve) => {
|
||||
services.refreshToken().then(response => {
|
||||
const data = response.data;
|
||||
|
||||
if (data && data.success && data.result && data.result.newToken) {
|
||||
userState.updateToken(data.result.newToken);
|
||||
|
||||
if (data.result.user && utils.isObject(data.result.user)) {
|
||||
context.commit(STORE_USER_INFO, data.result.user);
|
||||
}
|
||||
|
||||
if (data.result.oldTokenId) {
|
||||
revokeToken(context, {
|
||||
tokenId: data.result.oldTokenId,
|
||||
ignoreError: true
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
resolve(data.result);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function revokeToken(context, { tokenId, ignoreError }) {
|
||||
return new Promise((resolve, reject) => {
|
||||
services.revokeToken({
|
||||
tokenId: tokenId,
|
||||
ignoreError: !!ignoreError
|
||||
}).then(response => {
|
||||
const data = response.data;
|
||||
|
||||
if (!data || !data.success || !data.result) {
|
||||
reject({ message: 'Unable to logout from this session' });
|
||||
return;
|
||||
}
|
||||
|
||||
resolve(data.result);
|
||||
}).catch(error => {
|
||||
logger.error('failed to revoke token', error);
|
||||
|
||||
if (error.response && error.response.data && error.response.data.errorMessage) {
|
||||
reject({ error: error.response.data });
|
||||
} else if (!error.processed) {
|
||||
reject({ message: 'Unable to logout from this session' });
|
||||
} else {
|
||||
reject(error);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function revokeAllTokens() {
|
||||
return new Promise((resolve, reject) => {
|
||||
services.revokeAllTokens().then(response => {
|
||||
const data = response.data;
|
||||
|
||||
if (!data || !data.success || !data.result) {
|
||||
reject({ message: 'Unable to logout all other sessions' });
|
||||
return;
|
||||
}
|
||||
|
||||
resolve(data.result);
|
||||
}).catch(error => {
|
||||
logger.error('failed to revoke all tokens', error);
|
||||
|
||||
if (error.response && error.response.data && error.response.data.errorMessage) {
|
||||
reject({ error: error.response.data });
|
||||
} else if (!error.processed) {
|
||||
reject({ message: 'Unable to logout all other sessions' });
|
||||
} else {
|
||||
reject(error);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export default {
|
||||
getAllTokens,
|
||||
refreshTokenAndRevokeOldToken,
|
||||
revokeToken,
|
||||
revokeAllTokens
|
||||
}
|
||||
@@ -0,0 +1,287 @@
|
||||
import userState from '../lib/userstate.js';
|
||||
import services from '../lib/services.js';
|
||||
import settings from '../lib/settings.js';
|
||||
import logger from '../lib/logger.js';
|
||||
import utils from '../lib/utils.js';
|
||||
|
||||
import {
|
||||
RESET_STATE,
|
||||
|
||||
STORE_USER_INFO,
|
||||
CLEAR_USER_INFO
|
||||
} from './mutations.js';
|
||||
|
||||
function authorize(context, { loginName, password }) {
|
||||
return new Promise((resolve, reject) => {
|
||||
services.authorize({
|
||||
loginName: loginName,
|
||||
password: password
|
||||
}).then(response => {
|
||||
const data = response.data;
|
||||
|
||||
if (!data || !data.success || !data.result || !data.result.token) {
|
||||
reject({ message: 'Unable to login' });
|
||||
return;
|
||||
}
|
||||
|
||||
if (data.result.need2FA) {
|
||||
resolve(data.result);
|
||||
return;
|
||||
}
|
||||
|
||||
if (settings.isEnableApplicationLock() || userState.getUserAppLockState()) {
|
||||
const appLockState = userState.getUserAppLockState();
|
||||
|
||||
if (!appLockState || appLockState.username !== data.result.user.username) {
|
||||
userState.clearTokenAndUserInfo(true);
|
||||
settings.setEnableApplicationLock(false);
|
||||
settings.setEnableApplicationLockWebAuthn(false);
|
||||
userState.clearWebAuthnConfig();
|
||||
}
|
||||
}
|
||||
|
||||
userState.updateToken(data.result.token);
|
||||
|
||||
if (data.result.user && utils.isObject(data.result.user)) {
|
||||
context.commit(STORE_USER_INFO, data.result.user);
|
||||
}
|
||||
|
||||
resolve(data.result);
|
||||
}).catch(error => {
|
||||
logger.error('failed to login', error);
|
||||
|
||||
if (error && error.processed) {
|
||||
reject(error);
|
||||
} else if (error.response && error.response.data && error.response.data.errorMessage) {
|
||||
reject({ error: error.response.data });
|
||||
} else {
|
||||
reject({ message: 'Unable to login' });
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function authorize2FA(context, { token, passcode, recoveryCode }) {
|
||||
return new Promise((resolve, reject) => {
|
||||
let promise = null;
|
||||
|
||||
if (passcode) {
|
||||
promise = services.authorize2FA({
|
||||
passcode: passcode,
|
||||
token: token
|
||||
});
|
||||
} else if (recoveryCode) {
|
||||
promise = services.authorize2FAByBackupCode({
|
||||
recoveryCode: recoveryCode,
|
||||
token: token
|
||||
});
|
||||
} else {
|
||||
reject({ message: 'An error has occurred' });
|
||||
return;
|
||||
}
|
||||
|
||||
promise.then(response => {
|
||||
const data = response.data;
|
||||
|
||||
if (!data || !data.success || !data.result || !data.result.token) {
|
||||
reject({ message: 'Unable to verify' });
|
||||
return;
|
||||
}
|
||||
|
||||
if (settings.isEnableApplicationLock() || userState.getUserAppLockState()) {
|
||||
const appLockState = userState.getUserAppLockState();
|
||||
|
||||
if (!appLockState || appLockState.username !== data.result.user.username) {
|
||||
userState.clearTokenAndUserInfo(true);
|
||||
settings.setEnableApplicationLock(false);
|
||||
settings.setEnableApplicationLockWebAuthn(false);
|
||||
userState.clearWebAuthnConfig();
|
||||
}
|
||||
}
|
||||
|
||||
userState.updateToken(data.result.token);
|
||||
|
||||
if (data.result.user && utils.isObject(data.result.user)) {
|
||||
context.commit(STORE_USER_INFO, data.result.user);
|
||||
}
|
||||
|
||||
resolve(data.result);
|
||||
}).catch(error => {
|
||||
logger.error('failed to verify 2fa', error);
|
||||
|
||||
if (error && error.processed) {
|
||||
reject(error);
|
||||
} else if (error.response && error.response.data && error.response.data.errorMessage) {
|
||||
reject({ error: error.response.data });
|
||||
} else {
|
||||
reject({ message: 'Unable to verify' });
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function register(context, { user }) {
|
||||
return new Promise((resolve, reject) => {
|
||||
services.register({
|
||||
username: user.username,
|
||||
password: user.password,
|
||||
email: user.email,
|
||||
nickname: user.nickname,
|
||||
defaultCurrency: user.defaultCurrency
|
||||
}).then(response => {
|
||||
const data = response.data;
|
||||
|
||||
if (!data || !data.success || !data.result) {
|
||||
reject({ message: 'Unable to sign up' });
|
||||
return;
|
||||
}
|
||||
|
||||
if (settings.isEnableApplicationLock()) {
|
||||
settings.setEnableApplicationLock(false);
|
||||
settings.setEnableApplicationLockWebAuthn(false);
|
||||
userState.clearWebAuthnConfig();
|
||||
}
|
||||
|
||||
if (data.result.token && utils.isString(data.result.token)) {
|
||||
userState.updateToken(data.result.token);
|
||||
}
|
||||
|
||||
if (data.result.user && utils.isObject(data.result.user)) {
|
||||
context.commit(STORE_USER_INFO, data.result.user);
|
||||
}
|
||||
|
||||
resolve(data.result);
|
||||
}).catch(error => {
|
||||
logger.error('failed to sign up', error);
|
||||
|
||||
if (error.response && error.response.data && error.response.data.errorMessage) {
|
||||
reject({ error: error.response.data });
|
||||
} else if (!error.processed) {
|
||||
reject({ message: 'Unable to sign up' });
|
||||
} else {
|
||||
reject(error);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function logout(context) {
|
||||
return new Promise((resolve, reject) => {
|
||||
services.logout().then(response => {
|
||||
const data = response.data;
|
||||
|
||||
if (!data || !data.success || !data.result) {
|
||||
reject({ message: 'Unable to logout' });
|
||||
return;
|
||||
}
|
||||
|
||||
context.commit(CLEAR_USER_INFO);
|
||||
userState.clearTokenAndUserInfo(true);
|
||||
userState.clearWebAuthnConfig();
|
||||
|
||||
context.commit(RESET_STATE);
|
||||
|
||||
resolve(data.result);
|
||||
}).catch(error => {
|
||||
logger.error('failed to log out', error);
|
||||
|
||||
if (error && error.processed) {
|
||||
reject(error);
|
||||
} else if (error.response && error.response.data && error.response.data.errorMessage) {
|
||||
reject({ error: error.response.data });
|
||||
} else {
|
||||
reject({ message: 'Unable to logout' });
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function getCurrentUserProfile() {
|
||||
return new Promise((resolve, reject) => {
|
||||
services.getProfile().then(response => {
|
||||
const data = response.data;
|
||||
|
||||
if (!data || !data.success || !data.result) {
|
||||
reject({ message: 'Unable to get user profile' });
|
||||
return;
|
||||
}
|
||||
|
||||
resolve(data.result);
|
||||
}).catch(error => {
|
||||
logger.error('failed to get user profile', error);
|
||||
|
||||
if (error.response && error.response.data && error.response.data.errorMessage) {
|
||||
reject({ error: error.response.data });
|
||||
} else if (!error.processed) {
|
||||
reject({ message: 'Unable to get user profile' });
|
||||
} else {
|
||||
reject(error);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function updateUserProfile(context, { profile, currentPassword }) {
|
||||
return new Promise((resolve, reject) => {
|
||||
services.updateProfile({
|
||||
password: profile.password,
|
||||
oldPassword: currentPassword,
|
||||
email: profile.email,
|
||||
nickname: profile.nickname,
|
||||
defaultCurrency: profile.defaultCurrency
|
||||
}).then(response => {
|
||||
const data = response.data;
|
||||
|
||||
if (!data || !data.success || !data.result) {
|
||||
reject({ message: 'Unable to update user profile' });
|
||||
return;
|
||||
}
|
||||
|
||||
if (data.result.newToken && utils.isString(data.result.newToken)) {
|
||||
userState.updateToken(data.result.newToken);
|
||||
}
|
||||
|
||||
if (data.result.user && utils.isObject(data.result.user)) {
|
||||
context.commit(STORE_USER_INFO, data.result.user);
|
||||
}
|
||||
|
||||
resolve(data.result);
|
||||
}).catch(error => {
|
||||
logger.error('failed to save user profile', error);
|
||||
|
||||
if (error.response && error.response.data && error.response.data.errorMessage) {
|
||||
reject({ error: error.response.data });
|
||||
} else if (!error.processed) {
|
||||
reject({ message: 'Unable to update user profile' });
|
||||
} else {
|
||||
reject(error);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function clearUserInfoState(context) {
|
||||
context.commit(CLEAR_USER_INFO);
|
||||
}
|
||||
|
||||
function currentUserNickname(state) {
|
||||
const userInfo = state.currentUserInfo || {};
|
||||
return userInfo.nickname || userInfo.username || null;
|
||||
}
|
||||
|
||||
function currentUserDefaultCurrency(state) {
|
||||
const userInfo = state.currentUserInfo || {};
|
||||
return userInfo.defaultCurrency || null;
|
||||
}
|
||||
|
||||
export default {
|
||||
authorize,
|
||||
authorize2FA,
|
||||
register,
|
||||
logout,
|
||||
getCurrentUserProfile,
|
||||
updateUserProfile,
|
||||
clearUserInfoState,
|
||||
currentUserNickname,
|
||||
currentUserDefaultCurrency
|
||||
}
|
||||
@@ -65,7 +65,7 @@ export default {
|
||||
|
||||
self.$webauthn.registerCredential(
|
||||
self.$user.getUserAppLockState(),
|
||||
self.$user.getUserInfo(),
|
||||
self.$store.state.currentUserInfo,
|
||||
).then(({ id }) => {
|
||||
self.$hideLoading();
|
||||
|
||||
@@ -120,7 +120,7 @@ export default {
|
||||
return;
|
||||
}
|
||||
|
||||
const user = this.$user.getUserInfo();
|
||||
const user = this.$store.state.currentUserInfo;
|
||||
|
||||
if (!user || !user.username) {
|
||||
this.$alert('An error has occurred');
|
||||
|
||||
@@ -55,7 +55,7 @@ export default {
|
||||
const self = this;
|
||||
|
||||
return {
|
||||
baseCurrency: self.$user.getUserInfo() ? self.$user.getUserInfo().defaultCurrency : self.$t('default.currency'),
|
||||
baseCurrency: self.$store.getters.currentUserDefaultCurrency || self.$t('default.currency'),
|
||||
exchangeRatesData: self.$exchangeRates.getExchangeRates(),
|
||||
updating: false
|
||||
};
|
||||
|
||||
+14
-74
@@ -174,57 +174,30 @@ export default {
|
||||
self.logining = true;
|
||||
self.$showLoading(() => self.logining);
|
||||
|
||||
self.$services.authorize({
|
||||
self.$store.dispatch('authorize', {
|
||||
loginName: self.username,
|
||||
password: self.password
|
||||
}).then(response => {
|
||||
}).then(authResponse => {
|
||||
self.logining = false;
|
||||
self.$hideLoading();
|
||||
const data = response.data;
|
||||
|
||||
if (!data || !data.success || !data.result || !data.result.token) {
|
||||
self.$toast('Unable to login');
|
||||
return;
|
||||
}
|
||||
|
||||
if (data.result.need2FA) {
|
||||
self.tempToken = data.result.token;
|
||||
if (authResponse.need2FA) {
|
||||
self.tempToken = authResponse.token;
|
||||
self.show2faSheet = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (self.$settings.isEnableApplicationLock() || self.$user.getUserAppLockState()) {
|
||||
const appLockState = self.$user.getUserAppLockState();
|
||||
|
||||
if (!appLockState || appLockState.username !== data.result.user.username) {
|
||||
self.$user.clearTokenAndUserInfo(true);
|
||||
self.$settings.setEnableApplicationLock(false);
|
||||
self.$settings.setEnableApplicationLockWebAuthn(false);
|
||||
self.$user.clearWebAuthnConfig();
|
||||
}
|
||||
}
|
||||
|
||||
self.$user.updateTokenAndUserInfo(data.result);
|
||||
|
||||
if (self.$settings.isAutoUpdateExchangeRatesData()) {
|
||||
self.$services.autoRefreshLatestExchangeRates();
|
||||
}
|
||||
|
||||
router.refreshPage();
|
||||
}).catch(error => {
|
||||
self.$logger.error('failed to login', error);
|
||||
|
||||
self.logining = false;
|
||||
self.$hideLoading();
|
||||
|
||||
if (error && error.processed) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (error.response && error.response.data && error.response.data.errorMessage) {
|
||||
self.$toast({ error: error.response.data });
|
||||
} else if (!error.processed) {
|
||||
self.$toast('Unable to login');
|
||||
if (!error.processed) {
|
||||
self.$toast(error.message || error);
|
||||
}
|
||||
});
|
||||
},
|
||||
@@ -257,42 +230,13 @@ export default {
|
||||
self.verifying = true;
|
||||
self.$showLoading(() => self.verifying);
|
||||
|
||||
let promise = null;
|
||||
|
||||
if (self.twoFAVerifyType === 'backupcode') {
|
||||
promise = self.$services.authorize2FAByBackupCode({
|
||||
recoveryCode: self.backupCode,
|
||||
token: self.tempToken
|
||||
});
|
||||
} else {
|
||||
promise = self.$services.authorize2FA({
|
||||
passcode: self.passcode,
|
||||
token: self.tempToken
|
||||
});
|
||||
}
|
||||
|
||||
promise.then(response => {
|
||||
self.$store.dispatch('authorize2FA', {
|
||||
token: self.tempToken,
|
||||
passcode: self.twoFAVerifyType === 'passcode' ? self.passcode : null,
|
||||
recoveryCode: self.twoFAVerifyType === 'backupcode' ? self.backupCode : null
|
||||
}).then(() => {
|
||||
self.verifying = false;
|
||||
self.$hideLoading();
|
||||
const data = response.data;
|
||||
|
||||
if (!data || !data.success || !data.result || !data.result.token) {
|
||||
self.$toast('Unable to verify');
|
||||
return;
|
||||
}
|
||||
|
||||
if (self.$settings.isEnableApplicationLock() || self.$user.getUserAppLockState()) {
|
||||
const appLockState = self.$user.getUserAppLockState();
|
||||
|
||||
if (!appLockState || appLockState.username !== data.result.user.username) {
|
||||
self.$user.clearTokenAndUserInfo(true);
|
||||
self.$settings.setEnableApplicationLock(false);
|
||||
self.$settings.setEnableApplicationLockWebAuthn(false);
|
||||
self.$user.clearWebAuthnConfig();
|
||||
}
|
||||
}
|
||||
|
||||
self.$user.updateTokenAndUserInfo(data.result);
|
||||
|
||||
if (self.$settings.isAutoUpdateExchangeRatesData()) {
|
||||
self.$services.autoRefreshLatestExchangeRates();
|
||||
@@ -301,17 +245,13 @@ export default {
|
||||
self.show2faSheet = false;
|
||||
router.refreshPage();
|
||||
}).catch(error => {
|
||||
self.$logger.error('failed to verify 2fa', error);
|
||||
|
||||
self.verifying = false;
|
||||
self.$hideLoading();
|
||||
|
||||
if (error.response && error.response.data && error.response.data.errorMessage) {
|
||||
self.$toast({ error: error.response.data });
|
||||
} else if (!error.processed) {
|
||||
self.$toast('Unable to verify');
|
||||
if (!error.processed) {
|
||||
self.$toast(error.message || error);
|
||||
}
|
||||
})
|
||||
});
|
||||
},
|
||||
switch2FAVerifyType() {
|
||||
if (this.twoFAVerifyType === 'passcode') {
|
||||
|
||||
@@ -86,7 +86,6 @@ export default {
|
||||
const self = this;
|
||||
|
||||
return {
|
||||
currentNickName: self.getCurrentUserNickName(),
|
||||
isEnableApplicationLock: this.$settings.isEnableApplicationLock(),
|
||||
exchangeRatesLastUpdateDate: self.getExchangeRatesLastUpdateDate(),
|
||||
logouting: false
|
||||
@@ -108,6 +107,9 @@ export default {
|
||||
this.exchangeRatesLastUpdateDate = this.getExchangeRatesLastUpdateDate();
|
||||
}
|
||||
},
|
||||
currentNickName() {
|
||||
return this.$store.getters.currentUserNickname || this.$t('User');
|
||||
},
|
||||
isDataExportingEnabled() {
|
||||
return this.$settings.isDataExportingEnabled();
|
||||
},
|
||||
@@ -168,14 +170,9 @@ export default {
|
||||
},
|
||||
methods: {
|
||||
onPageAfterIn() {
|
||||
this.currentNickName = this.getCurrentUserNickName();
|
||||
this.isEnableApplicationLock = this.$settings.isEnableApplicationLock();
|
||||
this.exchangeRatesLastUpdateDate = this.getExchangeRatesLastUpdateDate();
|
||||
},
|
||||
getCurrentUserNickName() {
|
||||
const userInfo = this.$user.getUserInfo() || {};
|
||||
return userInfo.nickname || userInfo.username || this.$t('User');
|
||||
},
|
||||
getExchangeRatesLastUpdateDate() {
|
||||
const exchangeRates = this.$exchangeRates.getExchangeRates();
|
||||
return exchangeRates && exchangeRates.date ? this.$moment(exchangeRates.date).format(this.$t('format.date.long')) : '';
|
||||
@@ -188,37 +185,21 @@ export default {
|
||||
self.logouting = true;
|
||||
self.$showLoading(() => self.logouting);
|
||||
|
||||
self.$services.logout().then(response => {
|
||||
self.$store.dispatch('logout').then(() => {
|
||||
self.logouting = false;
|
||||
self.$hideLoading();
|
||||
const data = response.data;
|
||||
|
||||
if (!data || !data.success || !data.result) {
|
||||
self.$toast('Unable to logout');
|
||||
return;
|
||||
}
|
||||
|
||||
self.$user.clearTokenAndUserInfo(true);
|
||||
self.$user.clearWebAuthnConfig();
|
||||
self.$exchangeRates.clearExchangeRates();
|
||||
self.$settings.clearSettings();
|
||||
self.$locale.init();
|
||||
|
||||
router.navigate('/');
|
||||
}).catch(error => {
|
||||
self.$logger.error('failed to log out', error);
|
||||
|
||||
self.logouting = false;
|
||||
self.$hideLoading();
|
||||
|
||||
if (error && error.processed) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (error.response && error.response.data && error.response.data.errorMessage) {
|
||||
self.$toast({ error: error.response.data });
|
||||
} else if (!error.processed) {
|
||||
self.$toast('Unable to logout');
|
||||
if (!error.processed) {
|
||||
self.$toast(error.message || error);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -152,31 +152,13 @@ export default {
|
||||
self.submitting = true;
|
||||
self.$showLoading(() => self.submitting);
|
||||
|
||||
self.$services.register({
|
||||
username: self.user.username,
|
||||
password: self.user.password,
|
||||
email: self.user.email,
|
||||
nickname: self.user.nickname,
|
||||
defaultCurrency: self.user.defaultCurrency
|
||||
}).then(response => {
|
||||
self.$store.dispatch('register', {
|
||||
user: self.user
|
||||
}).then(() => {
|
||||
self.submitting = false;
|
||||
self.$hideLoading();
|
||||
const data = response.data;
|
||||
|
||||
if (!data || !data.success || !data.result) {
|
||||
self.$toast('Unable to sign up');
|
||||
return;
|
||||
}
|
||||
|
||||
if (self.$settings.isEnableApplicationLock()) {
|
||||
self.$settings.setEnableApplicationLock(false);
|
||||
self.$settings.setEnableApplicationLockWebAuthn(false);
|
||||
self.$user.clearWebAuthnConfig();
|
||||
}
|
||||
|
||||
if (self.$utilities.isString(data.result.token)) {
|
||||
self.$user.updateTokenAndUserInfo(data.result);
|
||||
|
||||
if (self.$user.isUserLogined()) {
|
||||
if (self.$settings.isAutoUpdateExchangeRatesData()) {
|
||||
self.$services.autoRefreshLatestExchangeRates();
|
||||
}
|
||||
@@ -189,15 +171,11 @@ export default {
|
||||
router.navigate('/category/default?type=0');
|
||||
});
|
||||
}).catch(error => {
|
||||
self.$logger.error('failed to sign up', error);
|
||||
|
||||
self.submitting = false;
|
||||
self.$hideLoading();
|
||||
|
||||
if (error.response && error.response.data && error.response.data.errorMessage) {
|
||||
self.$toast({ error: error.response.data });
|
||||
} else if (!error.processed) {
|
||||
self.$toast('Unable to sign up');
|
||||
if (!error.processed) {
|
||||
self.$toast(error.message || error);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -51,13 +51,13 @@ export default {
|
||||
self.$showLoading();
|
||||
|
||||
self.$webauthn.verifyCredential(
|
||||
self.$user.getUserInfo(),
|
||||
self.$store.state.currentUserInfo,
|
||||
self.$user.getWebAuthnCredentialId()
|
||||
).then(({ id, userName, userSecret }) => {
|
||||
self.$hideLoading();
|
||||
|
||||
self.$user.unlockTokenByWebAuthn(id, userName, userSecret);
|
||||
self.$services.refreshToken();
|
||||
self.$store.dispatch('refreshTokenAndRevokeOldToken');
|
||||
|
||||
if (self.$settings.isAutoUpdateExchangeRatesData()) {
|
||||
self.$services.autoRefreshLatestExchangeRates();
|
||||
@@ -92,7 +92,7 @@ export default {
|
||||
}
|
||||
|
||||
const router = this.$f7router;
|
||||
const user = this.$user.getUserInfo();
|
||||
const user = this.$store.state.currentUserInfo;
|
||||
|
||||
if (!user || !user.username) {
|
||||
this.$alert('An error has occurred');
|
||||
@@ -101,7 +101,7 @@ export default {
|
||||
|
||||
try {
|
||||
this.$user.unlockTokenByPinCode(user.username, this.pinCode);
|
||||
this.$services.refreshToken();
|
||||
this.$store.dispatch('refreshTokenAndRevokeOldToken');
|
||||
|
||||
if (this.$settings.isAutoUpdateExchangeRatesData()) {
|
||||
this.$services.autoRefreshLatestExchangeRates();
|
||||
@@ -120,6 +120,7 @@ export default {
|
||||
self.$confirm('Are you sure you want to re-login?', () => {
|
||||
self.$user.clearTokenAndUserInfo(true);
|
||||
self.$user.clearWebAuthnConfig();
|
||||
self.$store.dispatch('clearUserInfoState');
|
||||
self.$exchangeRates.clearExchangeRates();
|
||||
self.$settings.clearSettings();
|
||||
self.$locale.init();
|
||||
|
||||
@@ -320,7 +320,7 @@ export default {
|
||||
name: '',
|
||||
icon: self.$constants.icons.defaultAccountIconId,
|
||||
color: self.$constants.colors.defaultAccountColor,
|
||||
currency: self.$user.getUserInfo() ? self.$user.getUserInfo().defaultCurrency : self.$t('default.currency'),
|
||||
currency: self.$store.getters.currentUserDefaultCurrency || self.$t('default.currency'),
|
||||
balance: 0,
|
||||
comment: '',
|
||||
visible: true,
|
||||
@@ -447,9 +447,9 @@ export default {
|
||||
category: null,
|
||||
type: null,
|
||||
name: '',
|
||||
icon: this.account.icon,
|
||||
color: this.account.color,
|
||||
currency: self.$user.getUserInfo() ? self.$user.getUserInfo().defaultCurrency : self.$t('default.currency'),
|
||||
icon: self.account.icon,
|
||||
color: self.account.color,
|
||||
currency: self.$store.getters.currentUserDefaultCurrency || self.$t('default.currency'),
|
||||
balance: 0,
|
||||
comment: '',
|
||||
visible: true,
|
||||
|
||||
@@ -214,7 +214,7 @@ export default {
|
||||
},
|
||||
computed: {
|
||||
defaultCurrency() {
|
||||
return this.$user.getUserInfo() ? this.$user.getUserInfo().defaultCurrency : this.$t('default.currency');
|
||||
return this.$store.getters.currentUserDefaultCurrency || this.$t('default.currency');
|
||||
},
|
||||
allAccountCategories() {
|
||||
return this.$constants.account.allCategories;
|
||||
|
||||
@@ -308,7 +308,7 @@ export default {
|
||||
}
|
||||
},
|
||||
defaultCurrency() {
|
||||
return this.$user.getUserInfo() ? this.$user.getUserInfo().defaultCurrency : this.$t('default.currency');
|
||||
return this.$store.getters.currentUserDefaultCurrency || this.$t('default.currency');
|
||||
},
|
||||
hasAvailableExpenseCategories() {
|
||||
if (!this.allCategories || !this.allCategories[this.$constants.category.allCategoryTypes.Expense] || !this.allCategories[this.$constants.category.allCategoryTypes.Expense].length) {
|
||||
|
||||
@@ -394,7 +394,7 @@ export default {
|
||||
},
|
||||
computed: {
|
||||
defaultCurrency() {
|
||||
return this.$user.getUserInfo() ? this.$user.getUserInfo().defaultCurrency : this.$t('default.currency');
|
||||
return this.$store.getters.currentUserDefaultCurrency || this.$t('default.currency');
|
||||
},
|
||||
noTransaction() {
|
||||
for (let i = 0; i < this.transactions.length; i++) {
|
||||
|
||||
@@ -56,25 +56,14 @@ export default {
|
||||
|
||||
self.loading = true;
|
||||
|
||||
self.$services.getTokens().then(response => {
|
||||
const data = response.data;
|
||||
|
||||
if (!data || !data.success || !data.result) {
|
||||
self.$toast('Unable to get session list');
|
||||
router.back();
|
||||
return;
|
||||
}
|
||||
|
||||
self.tokens = data.result;
|
||||
self.$store.dispatch('getAllTokens').then(tokens => {
|
||||
self.tokens = tokens;
|
||||
self.loading = false;
|
||||
}).catch(error => {
|
||||
self.$logger.error('failed to load token list', error);
|
||||
self.loading = false;
|
||||
|
||||
if (error.response && error.response.data && error.response.data.errorMessage) {
|
||||
self.$toast({ error: error.response.data });
|
||||
router.back();
|
||||
} else if (!error.processed) {
|
||||
self.$toast('Unable to get session list');
|
||||
if (!error.processed) {
|
||||
self.$toast(error.message || error);
|
||||
router.back();
|
||||
}
|
||||
});
|
||||
@@ -83,26 +72,19 @@ export default {
|
||||
reload(done) {
|
||||
const self = this;
|
||||
|
||||
self.$services.getTokens().then(response => {
|
||||
done();
|
||||
|
||||
const data = response.data;
|
||||
|
||||
if (!data || !data.success || !data.result) {
|
||||
self.$toast('Unable to get session list');
|
||||
return;
|
||||
self.$store.dispatch('getAllTokens').then(tokens => {
|
||||
if (done) {
|
||||
done();
|
||||
}
|
||||
|
||||
self.tokens = data.result;
|
||||
self.tokens = tokens;
|
||||
}).catch(error => {
|
||||
self.$logger.error('failed to reload token list', error);
|
||||
if (done) {
|
||||
done();
|
||||
}
|
||||
|
||||
done();
|
||||
|
||||
if (error.response && error.response.data && error.response.data.errorMessage) {
|
||||
self.$toast({ error: error.response.data });
|
||||
} else if (!error.processed) {
|
||||
self.$toast('Unable to get session list');
|
||||
if (!error.processed) {
|
||||
self.$toast(error.message || error);
|
||||
}
|
||||
});
|
||||
},
|
||||
@@ -114,16 +96,10 @@ export default {
|
||||
self.$confirm('Are you sure you want to logout from this session?', () => {
|
||||
self.$showLoading();
|
||||
|
||||
self.$services.revokeToken({
|
||||
self.$store.dispatch('revokeToken', {
|
||||
tokenId: token.tokenId
|
||||
}).then(response => {
|
||||
}).then(() => {
|
||||
self.$hideLoading();
|
||||
const data = response.data;
|
||||
|
||||
if (!data || !data.success || !data.result) {
|
||||
self.$toast('Unable to logout from this session');
|
||||
return;
|
||||
}
|
||||
|
||||
app.swipeout.delete($$(`#${self.$options.filters.tokenDomId(token)}`), () => {
|
||||
for (let i = 0; i < self.tokens.length; i++) {
|
||||
@@ -133,14 +109,10 @@ export default {
|
||||
}
|
||||
});
|
||||
}).catch(error => {
|
||||
self.$logger.error('failed to revoke token', error);
|
||||
|
||||
self.$hideLoading();
|
||||
|
||||
if (error.response && error.response.data && error.response.data.errorMessage) {
|
||||
self.$toast({error: error.response.data});
|
||||
} else if (!error.processed) {
|
||||
self.$toast('Unable to logout from this session');
|
||||
if (!error.processed) {
|
||||
self.$toast(error.message || error);
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -155,14 +127,8 @@ export default {
|
||||
self.$confirm('Are you sure you want to logout all other sessions?', () => {
|
||||
self.$showLoading();
|
||||
|
||||
self.$services.revokeAllTokens().then(response => {
|
||||
self.$store.dispatch('revokeAllTokens').then(() => {
|
||||
self.$hideLoading();
|
||||
const data = response.data;
|
||||
|
||||
if (!data || !data.success || !data.result) {
|
||||
self.$toast('Unable to logout all other sessions');
|
||||
return;
|
||||
}
|
||||
|
||||
for (let i = self.tokens.length - 1; i >= 0; i--) {
|
||||
if (!self.tokens[i].isCurrent) {
|
||||
@@ -172,14 +138,10 @@ export default {
|
||||
|
||||
self.$toast('You have logged out all other sessions');
|
||||
}).catch(error => {
|
||||
self.$logger.error('failed to revoke all tokens', error);
|
||||
|
||||
self.$hideLoading();
|
||||
|
||||
if (error.response && error.response.data && error.response.data.errorMessage) {
|
||||
self.$toast({error: error.response.data});
|
||||
} else if (!error.processed) {
|
||||
self.$toast('Unable to logout all other sessions');
|
||||
if (!error.processed) {
|
||||
self.$toast(error.message || error);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -158,31 +158,21 @@ export default {
|
||||
|
||||
self.loading = true;
|
||||
|
||||
self.$services.getProfile().then(response => {
|
||||
const data = response.data;
|
||||
|
||||
if (!data || !data.success || !data.result) {
|
||||
self.$toast('Unable to get user profile');
|
||||
router.back();
|
||||
return;
|
||||
}
|
||||
|
||||
self.oldProfile.email = data.result.email;
|
||||
self.oldProfile.nickname = data.result.nickname;
|
||||
self.oldProfile.defaultCurrency = data.result.defaultCurrency;
|
||||
self.$store.dispatch('getCurrentUserProfile').then(profile => {
|
||||
self.oldProfile.email = profile.email;
|
||||
self.oldProfile.nickname = profile.nickname;
|
||||
self.oldProfile.defaultCurrency = profile.defaultCurrency;
|
||||
|
||||
self.newProfile.email = self.oldProfile.email
|
||||
self.newProfile.nickname = self.oldProfile.nickname;
|
||||
self.newProfile.defaultCurrency = self.oldProfile.defaultCurrency;
|
||||
|
||||
self.loading = false;
|
||||
}).catch(error => {
|
||||
self.$logger.error('failed to get user profile', error);
|
||||
self.loading = false;
|
||||
|
||||
if (error.response && error.response.data && error.response.data.errorMessage) {
|
||||
self.$toast({ error: error.response.data });
|
||||
router.back();
|
||||
} else if (!error.processed) {
|
||||
self.$toast('Unable to get user profile');
|
||||
if (!error.processed) {
|
||||
self.$toast(error.message || error);
|
||||
router.back();
|
||||
}
|
||||
});
|
||||
@@ -209,45 +199,23 @@ export default {
|
||||
self.saving = true;
|
||||
self.$showLoading(() => self.saving);
|
||||
|
||||
self.$services.updateProfile({
|
||||
password: self.newProfile.password,
|
||||
oldPassword: self.currentPassword,
|
||||
email: self.newProfile.email,
|
||||
nickname: self.newProfile.nickname,
|
||||
defaultCurrency: self.newProfile.defaultCurrency
|
||||
}).then(response => {
|
||||
self.$store.dispatch('updateUserProfile', {
|
||||
profile: self.newProfile,
|
||||
currentPassword: self.currentPassword
|
||||
}).then(() => {
|
||||
self.saving = false;
|
||||
self.$hideLoading();
|
||||
self.currentPassword = '';
|
||||
|
||||
const data = response.data;
|
||||
|
||||
if (!data || !data.success || !data.result) {
|
||||
self.$toast('Unable to update user profile');
|
||||
return;
|
||||
}
|
||||
|
||||
if (self.$utilities.isString(data.result.newToken)) {
|
||||
self.$user.updateToken(data.result.newToken);
|
||||
}
|
||||
|
||||
if (self.$utilities.isObject(data.result.user)) {
|
||||
self.$user.updateUserInfo(data.result.user);
|
||||
}
|
||||
|
||||
self.$toast('Your profile has been successfully updated');
|
||||
router.back();
|
||||
}).catch(error => {
|
||||
self.$logger.error('failed to save user profile', error);
|
||||
|
||||
self.saving = false;
|
||||
self.$hideLoading();
|
||||
self.currentPassword = '';
|
||||
|
||||
if (error.response && error.response.data && error.response.data.errorMessage) {
|
||||
self.$toast({ error: error.response.data });
|
||||
} else if (!error.processed) {
|
||||
self.$toast('Unable to update user profile');
|
||||
if (!error.processed) {
|
||||
self.$toast(error.message || error);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user