From 92a626fb210a39c63bd051d690fdcf9b8ad06cef Mon Sep 17 00:00:00 2001 From: MaysWind Date: Sun, 5 Jan 2025 22:56:07 +0800 Subject: [PATCH] migrate token store to composition API and typescript --- src/DesktopApp.vue | 2 +- src/MobileApp.vue | 2 +- src/stores/token.js | 115 ---------------- src/stores/token.ts | 125 ++++++++++++++++++ src/views/desktop/UnlockPage.vue | 2 +- .../settings/tabs/UserSecuritySettingTab.vue | 2 +- src/views/mobile/UnlockPage.vue | 2 +- src/views/mobile/users/SessionListPage.vue | 2 +- 8 files changed, 131 insertions(+), 121 deletions(-) delete mode 100644 src/stores/token.js create mode 100644 src/stores/token.ts diff --git a/src/DesktopApp.vue b/src/DesktopApp.vue index fd9ba9ed..d511db6c 100644 --- a/src/DesktopApp.vue +++ b/src/DesktopApp.vue @@ -23,7 +23,7 @@ import { mapStores } from 'pinia'; import { useRootStore } from '@/stores/index.js'; import { useSettingsStore } from '@/stores/setting.ts'; import { useUserStore } from '@/stores/user.ts'; -import { useTokensStore } from '@/stores/token.js'; +import { useTokensStore } from '@/stores/token.ts'; import { useExchangeRatesStore } from '@/stores/exchangeRates.js'; import { APPLICATION_LOGO_PATH } from '@/consts/asset.ts'; diff --git a/src/MobileApp.vue b/src/MobileApp.vue index 872b2cee..998dfa32 100644 --- a/src/MobileApp.vue +++ b/src/MobileApp.vue @@ -12,7 +12,7 @@ import { mapStores } from 'pinia'; import { useRootStore } from '@/stores/index.js'; import { useSettingsStore } from '@/stores/setting.ts'; import { useUserStore } from '@/stores/user.ts'; -import { useTokensStore } from '@/stores/token.js'; +import { useTokensStore } from '@/stores/token.ts'; import { useExchangeRatesStore } from '@/stores/exchangeRates.js'; import { APPLICATION_LOGO_PATH } from '@/consts/asset.ts'; diff --git a/src/stores/token.js b/src/stores/token.js deleted file mode 100644 index 0c762754..00000000 --- a/src/stores/token.js +++ /dev/null @@ -1,115 +0,0 @@ -import { defineStore } from 'pinia'; - -import { useUserStore } from './user.ts'; - -import { updateCurrentToken } from '@/lib/userstate.ts'; -import services from '@/lib/services.ts'; -import logger from '@/lib/logger.ts'; -import { isObject } from '@/lib/common.ts'; - -export const useTokensStore = defineStore('tokens', { - actions: { - getAllTokens() { - return new Promise((resolve, reject) => { - services.getTokens().then(response => { - const data = response.data; - - if (!data || !data.success || !data.result) { - reject({ message: 'Unable to retrieve 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 retrieve session list' }); - } else { - reject(error); - } - }); - }); - }, - refreshTokenAndRevokeOldToken() { - const self = this; - - return new Promise((resolve) => { - services.refreshToken().then(response => { - const data = response.data; - - if (data && data.success && data.result && data.result.user && isObject(data.result.user)) { - const userStore = useUserStore(); - userStore.storeUserBasicInfo(data.result.user); - } - - if (data && data.success && data.result && data.result.newToken) { - updateCurrentToken(data.result.newToken); - - if (data.result.oldTokenId) { - self.revokeToken({ - tokenId: data.result.oldTokenId, - ignoreError: true - }); - } - } - - resolve(data.result); - }); - }); - }, - revokeToken({ 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); - } - }); - }); - }, - 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); - } - }); - }); - } - } -}); diff --git a/src/stores/token.ts b/src/stores/token.ts new file mode 100644 index 00000000..7e282f84 --- /dev/null +++ b/src/stores/token.ts @@ -0,0 +1,125 @@ +import { defineStore } from 'pinia'; + +import { useUserStore } from './user.ts'; + +import type { TokenRefreshResponse, TokenInfoResponse } from '@/models/token.ts'; + +import { isObject } from '@/lib/common.ts'; +import { updateCurrentToken } from '@/lib/userstate.ts'; + +import logger from '@/lib/logger.ts'; +import services from '@/lib/services.ts'; + +export const useTokensStore = defineStore('tokens', () => { + function getAllTokens(): Promise { + return new Promise((resolve, reject) => { + services.getTokens().then(response => { + const data = response.data; + + if (!data || !data.success || !data.result) { + reject({ message: 'Unable to retrieve 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 retrieve session list' }); + } else { + reject(error); + } + }); + }); + } + + function refreshTokenAndRevokeOldToken(): Promise { + return new Promise((resolve) => { + services.refreshToken().then(response => { + const data = response.data; + + if (data && data.success && data.result && data.result.user && isObject(data.result.user)) { + const userStore = useUserStore(); + userStore.storeUserBasicInfo(data.result.user); + } + + if (data && data.success && data.result && data.result.newToken) { + updateCurrentToken(data.result.newToken); + + if (data.result.oldTokenId) { + revokeToken({ + tokenId: data.result.oldTokenId, + ignoreError: true + }); + } + } + + resolve(data.result); + }); + }); + } + + function revokeToken(req: { tokenId: string, ignoreError?: boolean }): Promise { + return new Promise((resolve, reject) => { + services.revokeToken({ + tokenId: req.tokenId, + ignoreError: !!req.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(): Promise { + 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); + } + }); + }); + } + + return { + // functions + getAllTokens, + refreshTokenAndRevokeOldToken, + revokeToken, + revokeAllTokens + }; +}); diff --git a/src/views/desktop/UnlockPage.vue b/src/views/desktop/UnlockPage.vue index d6799257..aab5e5e8 100644 --- a/src/views/desktop/UnlockPage.vue +++ b/src/views/desktop/UnlockPage.vue @@ -113,7 +113,7 @@ import { mapStores } from 'pinia'; import { useRootStore } from '@/stores/index.js'; import { useSettingsStore } from '@/stores/setting.ts'; import { useUserStore } from '@/stores/user.ts'; -import { useTokensStore } from '@/stores/token.js'; +import { useTokensStore } from '@/stores/token.ts'; import { useTransactionsStore } from '@/stores/transaction.js'; import { useExchangeRatesStore } from '@/stores/exchangeRates.js'; diff --git a/src/views/desktop/user/settings/tabs/UserSecuritySettingTab.vue b/src/views/desktop/user/settings/tabs/UserSecuritySettingTab.vue index 2a749f82..18cf93ee 100644 --- a/src/views/desktop/user/settings/tabs/UserSecuritySettingTab.vue +++ b/src/views/desktop/user/settings/tabs/UserSecuritySettingTab.vue @@ -133,7 +133,7 @@ import { mapStores } from 'pinia'; import { useRootStore } from '@/stores/index.js'; import { useSettingsStore } from '@/stores/setting.ts'; import { useUserStore } from '@/stores/user.ts'; -import { useTokensStore } from '@/stores/token.js'; +import { useTokensStore } from '@/stores/token.ts'; import { isEquals } from '@/lib/common.ts'; import { parseSessionInfo } from '@/lib/session.ts'; diff --git a/src/views/mobile/UnlockPage.vue b/src/views/mobile/UnlockPage.vue index 8eac3066..631113bb 100644 --- a/src/views/mobile/UnlockPage.vue +++ b/src/views/mobile/UnlockPage.vue @@ -69,7 +69,7 @@ import { mapStores } from 'pinia'; import { useRootStore } from '@/stores/index.js'; import { useSettingsStore } from '@/stores/setting.ts'; import { useUserStore } from '@/stores/user.ts'; -import { useTokensStore } from '@/stores/token.js'; +import { useTokensStore } from '@/stores/token.ts'; import { useTransactionsStore } from '@/stores/transaction.js'; import { useExchangeRatesStore } from '@/stores/exchangeRates.js'; diff --git a/src/views/mobile/users/SessionListPage.vue b/src/views/mobile/users/SessionListPage.vue index e4746f3c..7736f961 100644 --- a/src/views/mobile/users/SessionListPage.vue +++ b/src/views/mobile/users/SessionListPage.vue @@ -45,7 +45,7 @@