From 03d95033d703d46fcc934785a3a9fe338bf9804c Mon Sep 17 00:00:00 2001 From: MaysWind Date: Thu, 21 Jul 2022 00:41:37 +0800 Subject: [PATCH] allow set base amount in exchange rate page --- src/filters/exchangeRate.js | 30 +++------ src/lib/utils.js | 11 ++++ src/locales/en.js | 2 + src/locales/zh_Hans.js | 2 + src/store/exchangeRates.js | 8 +-- src/views/mobile/ExchangeRates.vue | 99 ++++++++++++++++++++++++++++-- 6 files changed, 118 insertions(+), 34 deletions(-) diff --git a/src/filters/exchangeRate.js b/src/filters/exchangeRate.js index b886e200..9e98ad3c 100644 --- a/src/filters/exchangeRate.js +++ b/src/filters/exchangeRate.js @@ -1,32 +1,18 @@ -export default function (oldRate, currentCurrency, allExchangeRates) { - const exchangeRateMap = {}; +export default function (rate) { + const rateStr = rate.toString(); - for (let i = 0; i < allExchangeRates.length; i++) { - const exchangeRate = allExchangeRates[i]; - exchangeRateMap[exchangeRate.currency] = exchangeRate; - } - - const toCurrencyExchangeRate = exchangeRateMap[currentCurrency]; - - if (!toCurrencyExchangeRate) { - return ''; - } - - const newRate = parseFloat(oldRate) / parseFloat(toCurrencyExchangeRate.rate); - const newRateStr = newRate.toString(); - - if (newRateStr.indexOf('.') < 0) { - return newRateStr; + if (rateStr.indexOf('.') < 0) { + return rateStr; } else { let firstNonZeroPos = 0; - for (let i = 0; i < newRateStr.length; i++) { - if (newRateStr.charAt(i) !== '.' && newRateStr.charAt(i) !== '0') { - firstNonZeroPos = Math.min(i + 4, newRateStr.length); + for (let i = 0; i < rateStr.length; i++) { + if (rateStr.charAt(i) !== '.' && rateStr.charAt(i) !== '0') { + firstNonZeroPos = Math.min(i + 4, rateStr.length); break; } } - return newRateStr.substr(0, Math.max(6, Math.max(firstNonZeroPos, newRateStr.indexOf('.') + 2))); + return rateStr.substr(0, Math.max(6, Math.max(firstNonZeroPos, rateStr.indexOf('.') + 2))); } } diff --git a/src/lib/utils.js b/src/lib/utils.js index 236a3ea8..b0057101 100644 --- a/src/lib/utils.js +++ b/src/lib/utils.js @@ -508,6 +508,16 @@ function stringCurrencyToNumeric(str) { } } +function getExchangedAmount(amount, fromRate, toRate) { + const exchangeRate = parseFloat(toRate) / parseFloat(fromRate); + + if (!isNumber(exchangeRate)) { + return null; + } + + return amount * exchangeRate; +} + function base64encode(arrayBuffer) { if (!arrayBuffer || arrayBuffer.length === 0) { return null; @@ -684,6 +694,7 @@ export default { appendThousandsSeparator, numericCurrencyToString, stringCurrencyToNumeric, + getExchangedAmount, base64encode, arrayBufferToString, stringToArrayBuffer, diff --git a/src/locales/en.js b/src/locales/en.js index 008709fc..19c4949c 100644 --- a/src/locales/en.js +++ b/src/locales/en.js @@ -993,6 +993,8 @@ export default { 'Are you sure you want to re-login?': 'Are you sure you want to re-login?', 'Exchange Rates Data': 'Exchange Rates Data', 'Base Currency': 'Base Currency', + 'Base Amount': 'Base Amount', + 'Set As Baseline': 'Set As Baseline', 'Last Updated': 'Last Updated', 'Data source': 'Data source', 'No exchange rates data': 'No exchange rates data', diff --git a/src/locales/zh_Hans.js b/src/locales/zh_Hans.js index 2a31bd9c..be498d74 100644 --- a/src/locales/zh_Hans.js +++ b/src/locales/zh_Hans.js @@ -993,6 +993,8 @@ export default { 'Are you sure you want to re-login?': '您确定要重新登录?', 'Exchange Rates Data': '汇率数据', 'Base Currency': '基准货币', + 'Base Amount': '基准金额', + 'Set As Baseline': '设置为基准', 'Last Updated': '最后更新', 'Data source': '数据来源', 'No exchange rates data': '没有汇率数据', diff --git a/src/store/exchangeRates.js b/src/store/exchangeRates.js index 2b2541e0..4d06332c 100644 --- a/src/store/exchangeRates.js +++ b/src/store/exchangeRates.js @@ -81,13 +81,7 @@ export function getExchangedAmount(state) { return null; } - const exchangeRate = parseFloat(toCurrencyExchangeRate.rate) / parseFloat(fromCurrencyExchangeRate.rate); - - if (!utils.isNumber(exchangeRate)) { - return null; - } - - return amount * exchangeRate; + return utils.getExchangedAmount(amount, fromCurrencyExchangeRate.rate, toCurrencyExchangeRate.rate) }; } diff --git a/src/views/mobile/ExchangeRates.vue b/src/views/mobile/ExchangeRates.vue index 9320eb9f..6f250ab0 100644 --- a/src/views/mobile/ExchangeRates.vue +++ b/src/views/mobile/ExchangeRates.vue @@ -4,7 +4,7 @@ - + @@ -12,14 +12,31 @@ + class="list-item-with-header-and-title list-item-no-item-after" + :header="$t('Base Currency')" + :title="`currency.${baseCurrency}` | localized" + smart-select :smart-select-params="{ openIn: 'popup', pageTitle: $t('Base Currency'), searchbar: true, searchbarPlaceholder: $t('Currency Name'), searchbarDisableText: $t('Cancel'), closeOnSelect: true, popupCloseLinkText: $t('Done'), scrollToSelectedItem: true }" + > + + + @@ -34,7 +51,12 @@ + :after="getConvertedAmount(exchangeRate) | exchangeRate" + swipeout> + + + + @@ -47,6 +69,17 @@ {{ exchangeRatesData.dataSource }} + + + + + {{ $t('Update') }} + + + + {{ $t('Cancel') }} + + @@ -57,13 +90,30 @@ export default { return { baseCurrency: self.$store.getters.currentUserDefaultCurrency, - updating: false + baseAmount: 100, + updating: false, + showMoreActionSheet: false, + showBaseAmountSheet: false }; }, computed: { exchangeRatesData() { return this.$store.state.latestExchangeRates.data; }, + exchangeRateMap() { + const exchangeRateMap = {}; + + if (!this.exchangeRatesData.exchangeRates) { + return exchangeRateMap; + } + + for (let i = 0; i < this.exchangeRatesData.exchangeRates.length; i++) { + const exchangeRate = this.exchangeRatesData.exchangeRates[i]; + exchangeRateMap[exchangeRate.currency] = exchangeRate; + } + + return exchangeRateMap; + }, availableExchangeRates() { if (!this.exchangeRatesData || !this.exchangeRatesData.exchangeRates) { return []; @@ -86,6 +136,9 @@ export default { }) return availableExchangeRates; + }, + baseAmountFontSize() { + return this.getFontSizeByAmount(this.baseAmount); } }, created() { @@ -144,7 +197,43 @@ export default { self.$toast(error.message || error); } }); + }, + getConvertedAmount(toExchangeRate) { + const fromExchangeRate = this.exchangeRateMap[this.baseCurrency]; + + if (!fromExchangeRate) { + return ''; + } + + return this.$utilities.getExchangedAmount(this.baseAmount / 100, fromExchangeRate.rate, toExchangeRate.rate); + }, + setAsBaseline(currency, amount) { + if (!this.$utilities.isNumber(amount)) { + amount = ''; + } + + this.baseCurrency = currency; + this.baseAmount = this.$utilities.stringCurrencyToNumeric(amount.toString()); + }, + getFontSizeByAmount(amount) { + if (amount >= 100000000 || amount <= -100000000) { + return 32; + } else if (amount >= 1000000 || amount <= -1000000) { + return 36; + } else { + return 40; + } } } } + +