From 3433b73edfa93d948f246a0d44a212b6d5dc8467 Mon Sep 17 00:00:00 2001 From: MaysWind Date: Tue, 11 Jul 2023 00:59:55 +0800 Subject: [PATCH] code refactor --- src/lib/currency.js | 30 ++++++++++++++ src/lib/i18n.js | 25 ++++++++++++ src/views/desktop/ExchangeRatesPage.vue | 52 ++----------------------- src/views/mobile/ExchangeRatesPage.vue | 51 +++--------------------- 4 files changed, 65 insertions(+), 93 deletions(-) diff --git a/src/lib/currency.js b/src/lib/currency.js index 686161b5..449d0e2e 100644 --- a/src/lib/currency.js +++ b/src/lib/currency.js @@ -83,3 +83,33 @@ export function getExchangedAmount(amount, fromRate, toRate) { return amount * exchangeRate; } + +export function getConvertedAmount(baseAmount, fromExchangeRate, toExchangeRate) { + if (!fromExchangeRate || !toExchangeRate) { + return ''; + } + + if (baseAmount === '') { + return 0; + } + + return getExchangedAmount(baseAmount, fromExchangeRate.rate, toExchangeRate.rate); +} + +export function getDisplayExchangeRateAmount(rateStr, isEnableThousandsSeparator) { + if (rateStr.indexOf('.') < 0) { + return appendThousandsSeparator(rateStr, isEnableThousandsSeparator); + } else { + let firstNonZeroPos = 0; + + for (let i = 0; i < rateStr.length; i++) { + if (rateStr.charAt(i) !== '.' && rateStr.charAt(i) !== '0') { + firstNonZeroPos = Math.min(i + 4, rateStr.length); + break; + } + } + + const trimmedRateStr = rateStr.substring(0, Math.max(6, Math.max(firstNonZeroPos, rateStr.indexOf('.') + 2))); + return appendThousandsSeparator(trimmedRateStr, isEnableThousandsSeparator); + } +} diff --git a/src/lib/i18n.js b/src/lib/i18n.js index b5e72a43..b8553499 100644 --- a/src/lib/i18n.js +++ b/src/lib/i18n.js @@ -627,6 +627,30 @@ function getAllTransactionEditScopeTypes(translateFn) { }]; } +function getAllDisplayExchangeRates(exchangeRatesData, translateFn) { + if (!exchangeRatesData || !exchangeRatesData.exchangeRates) { + return []; + } + + const availableExchangeRates = []; + + for (let i = 0; i < exchangeRatesData.exchangeRates.length; i++) { + const exchangeRate = exchangeRatesData.exchangeRates[i]; + + availableExchangeRates.push({ + currencyCode: exchangeRate.currency, + currencyDisplayName: translateFn(`currency.${exchangeRate.currency}`), + rate: exchangeRate.rate + }); + } + + availableExchangeRates.sort(function(c1, c2) { + return c1.currencyDisplayName.localeCompare(c2.currencyDisplayName); + }) + + return availableExchangeRates; +} + function getEnableDisableOptions(translateFn) { return [{ value: true, @@ -906,6 +930,7 @@ export function i18nFunctions(i18nGlobal) { getAllStatisticsChartDataTypes: () => getAllStatisticsChartDataTypes(i18nGlobal.t), getAllStatisticsSortingTypes: () => getAllStatisticsSortingTypes(i18nGlobal.t), getAllTransactionEditScopeTypes: () => getAllTransactionEditScopeTypes(i18nGlobal.t), + getAllDisplayExchangeRates: (exchangeRatesData) => getAllDisplayExchangeRates(exchangeRatesData, i18nGlobal.t), getEnableDisableOptions: () => getEnableDisableOptions(i18nGlobal.t), getDisplayCurrency: (value, currencyCode, options) => getDisplayCurrency(value, currencyCode, options, i18nGlobal.t), setLanguage: (locale, force) => setLanguage(i18nGlobal, locale, force), diff --git a/src/views/desktop/ExchangeRatesPage.vue b/src/views/desktop/ExchangeRatesPage.vue index 49bd84aa..259454db 100644 --- a/src/views/desktop/ExchangeRatesPage.vue +++ b/src/views/desktop/ExchangeRatesPage.vue @@ -84,8 +84,7 @@ import { useSettingsStore } from '@/stores/setting.js'; import { useUserStore } from '@/stores/user.js'; import { useExchangeRatesStore } from '@/stores/exchangeRates.js'; -import { appendThousandsSeparator } from '@/lib/common.js'; -import { getExchangedAmount } from '@/lib/currency.js'; +import { getConvertedAmount, getDisplayExchangeRateAmount } from '@/lib/currency.js'; import { mdiRefresh @@ -117,27 +116,7 @@ export default { return exchangeRatesLastUpdateTime ? this.$locale.formatUnixTimeToLongDate(this.userStore, exchangeRatesLastUpdateTime) : ''; }, availableExchangeRates() { - if (!this.exchangeRatesData || !this.exchangeRatesData.exchangeRates) { - return []; - } - - const availableExchangeRates = []; - - for (let i = 0; i < this.exchangeRatesData.exchangeRates.length; i++) { - const exchangeRate = this.exchangeRatesData.exchangeRates[i]; - - availableExchangeRates.push({ - currencyCode: exchangeRate.currency, - currencyDisplayName: this.$t(`currency.${exchangeRate.currency}`), - rate: exchangeRate.rate - }); - } - - availableExchangeRates.sort(function(c1, c2) { - return c1.currencyDisplayName.localeCompare(c2.currencyDisplayName); - }) - - return availableExchangeRates; + return this.$locale.getAllDisplayExchangeRates(this.exchangeRatesData); } }, created() { @@ -184,38 +163,15 @@ export default { const fromExchangeRate = this.exchangeRatesStore.latestExchangeRateMap[this.baseCurrency]; - if (!fromExchangeRate) { - return ''; - } - - if (this.baseAmount === '') { - return 0; - } - try { - return getExchangedAmount(parseFloat(this.baseAmount), fromExchangeRate.rate, toExchangeRate.rate); + return getConvertedAmount(parseFloat(this.baseAmount), fromExchangeRate, toExchangeRate); } catch (e) { return 0; } }, getDisplayConvertedAmount(toExchangeRate) { const rateStr = this.getConvertedAmount(toExchangeRate).toString(); - - if (rateStr.indexOf('.') < 0) { - return appendThousandsSeparator(rateStr, this.isEnableThousandsSeparator); - } else { - let firstNonZeroPos = 0; - - for (let i = 0; i < rateStr.length; i++) { - if (rateStr.charAt(i) !== '.' && rateStr.charAt(i) !== '0') { - firstNonZeroPos = Math.min(i + 4, rateStr.length); - break; - } - } - - const trimmedRateStr = rateStr.substring(0, Math.max(6, Math.max(firstNonZeroPos, rateStr.indexOf('.') + 2))); - return appendThousandsSeparator(trimmedRateStr, this.isEnableThousandsSeparator); - } + return getDisplayExchangeRateAmount(rateStr, this.isEnableThousandsSeparator); } } } diff --git a/src/views/mobile/ExchangeRatesPage.vue b/src/views/mobile/ExchangeRatesPage.vue index e19e65be..529447d2 100644 --- a/src/views/mobile/ExchangeRatesPage.vue +++ b/src/views/mobile/ExchangeRatesPage.vue @@ -96,11 +96,12 @@ import { useUserStore } from '@/stores/user.js'; import { useExchangeRatesStore } from '@/stores/exchangeRates.js'; import transactionConstants from '@/consts/transaction.js'; -import { isNumber, appendThousandsSeparator } from '@/lib/common.js'; +import { isNumber } from '@/lib/common.js'; import { numericCurrencyToString, stringCurrencyToNumeric, - getExchangedAmount, + getConvertedAmount, + getDisplayExchangeRateAmount } from '@/lib/currency.js'; export default { @@ -128,27 +129,7 @@ export default { return exchangeRatesLastUpdateTime ? this.$locale.formatUnixTimeToLongDate(this.userStore, exchangeRatesLastUpdateTime) : ''; }, availableExchangeRates() { - if (!this.exchangeRatesData || !this.exchangeRatesData.exchangeRates) { - return []; - } - - const availableExchangeRates = []; - - for (let i = 0; i < this.exchangeRatesData.exchangeRates.length; i++) { - const exchangeRate = this.exchangeRatesData.exchangeRates[i]; - - availableExchangeRates.push({ - currencyCode: exchangeRate.currency, - currencyDisplayName: this.$t(`currency.${exchangeRate.currency}`), - rate: exchangeRate.rate - }); - } - - availableExchangeRates.sort(function(c1, c2) { - return c1.currencyDisplayName.localeCompare(c2.currencyDisplayName); - }) - - return availableExchangeRates; + return this.$locale.getAllDisplayExchangeRates(this.exchangeRatesData); }, displayBaseAmount() { return numericCurrencyToString(this.baseAmount, this.isEnableThousandsSeparator); @@ -228,31 +209,11 @@ export default { }, getConvertedAmount(toExchangeRate) { const fromExchangeRate = this.exchangeRatesStore.latestExchangeRateMap[this.baseCurrency]; - - if (!fromExchangeRate) { - return ''; - } - - return getExchangedAmount(this.baseAmount / 100, fromExchangeRate.rate, toExchangeRate.rate); + return getConvertedAmount(this.baseAmount / 100, fromExchangeRate, toExchangeRate); }, getDisplayConvertedAmount(toExchangeRate) { const rateStr = this.getConvertedAmount(toExchangeRate).toString(); - - if (rateStr.indexOf('.') < 0) { - return appendThousandsSeparator(rateStr, this.isEnableThousandsSeparator); - } else { - let firstNonZeroPos = 0; - - for (let i = 0; i < rateStr.length; i++) { - if (rateStr.charAt(i) !== '.' && rateStr.charAt(i) !== '0') { - firstNonZeroPos = Math.min(i + 4, rateStr.length); - break; - } - } - - const trimmedRateStr = rateStr.substring(0, Math.max(6, Math.max(firstNonZeroPos, rateStr.indexOf('.') + 2))); - return appendThousandsSeparator(trimmedRateStr, this.isEnableThousandsSeparator); - } + return getDisplayExchangeRateAmount(rateStr, this.isEnableThousandsSeparator); }, setAsBaseline(currency, amount) { if (!isNumber(amount)) {