From 96c233d5c51ed1bb24996953b20b9da5dd789afc Mon Sep 17 00:00:00 2001
From: MaysWind
Date: Sat, 1 Jul 2023 01:58:31 +0800
Subject: [PATCH] code refactor
---
src/stores/overview.js | 201 +++++++++++++++++++++++----------
src/views/desktop/HomePage.vue | 107 ++++--------------
src/views/mobile/HomePage.vue | 126 +++++----------------
3 files changed, 192 insertions(+), 242 deletions(-)
diff --git a/src/stores/overview.js b/src/stores/overview.js
index 5878865f..f2737065 100644
--- a/src/stores/overview.js
+++ b/src/stores/overview.js
@@ -1,40 +1,167 @@
import { defineStore } from 'pinia';
+import { useUserStore } from './user.js';
import { useExchangeRatesStore } from './exchangeRates.js';
import { isNumber, isEquals } from '@/lib/common.js';
+import {
+ getTodayFirstUnixTime,
+ getTodayLastUnixTime,
+ getThisWeekFirstUnixTime,
+ getThisWeekLastUnixTime,
+ getThisMonthFirstUnixTime,
+ getThisMonthLastUnixTime,
+ getThisYearFirstUnixTime,
+ getThisYearLastUnixTime
+} from '@/lib/datetime.js';
import services from '@/lib/services.js';
import logger from '@/lib/logger.js';
+function updateTransactionDateRange(state) {
+ const userStore = useUserStore();
+
+ state.transactionDataRange.today.startTime = getTodayFirstUnixTime();
+ state.transactionDataRange.today.endTime = getTodayLastUnixTime();
+
+ state.transactionDataRange.thisWeek.startTime = getThisWeekFirstUnixTime(userStore.currentUserFirstDayOfWeek);
+ state.transactionDataRange.thisWeek.endTime = getThisWeekLastUnixTime(userStore.currentUserFirstDayOfWeek);
+
+ state.transactionDataRange.thisMonth.startTime = getThisMonthFirstUnixTime();
+ state.transactionDataRange.thisMonth.endTime = getThisMonthLastUnixTime();
+
+ state.transactionDataRange.thisYear.startTime = getThisYearFirstUnixTime();
+ state.transactionDataRange.thisYear.endTime = getThisYearLastUnixTime();
+}
+
export const useOverviewStore = defineStore('overview', {
state: () => ({
- transactionOverview: {},
+ transactionDataRange: {
+ today: {
+ startTime: getTodayFirstUnixTime(),
+ endTime: getTodayLastUnixTime()
+ },
+ thisWeek: {
+ startTime: getThisWeekFirstUnixTime(useUserStore().currentUserFirstDayOfWeek),
+ endTime: getThisWeekLastUnixTime(useUserStore().currentUserFirstDayOfWeek)
+ },
+ thisMonth: {
+ startTime: getThisMonthFirstUnixTime(),
+ endTime: getThisMonthLastUnixTime()
+ },
+ thisYear: {
+ startTime: getThisYearFirstUnixTime(),
+ endTime: getThisYearLastUnixTime()
+ }
+ },
+ transactionOverviewData: {},
transactionOverviewStateInvalid: true
}),
+ getters: {
+ transactionOverview(state) {
+ const userStore = useUserStore();
+ const exchangeRatesStore = useExchangeRatesStore();
+
+ const overviewData = state.transactionOverviewData;
+
+ if (!overviewData || !overviewData.thisMonth) {
+ return {
+ thisMonth: {
+ valid: false,
+ incomeAmount: 0,
+ expenseAmount: 0,
+ incompleteIncomeAmount: false,
+ incompleteExpenseAmount: false
+ }
+ };
+ }
+
+ const finalOverviewData = {};
+ const defaultCurrency = userStore.currentUserDefaultCurrency;
+
+ [ 'today', 'thisWeek', 'thisMonth', 'thisYear' ].forEach(field => {
+ if (!Object.prototype.hasOwnProperty.call(overviewData, field)) {
+ return;
+ }
+
+ const item = overviewData[field];
+
+ if (!item) {
+ return;
+ }
+
+ let totalIncomeAmount = 0;
+ let totalExpenseAmount = 0;
+ let hasUnCalculatedTotalIncome = false;
+ let hasUnCalculatedTotalExpense = false;
+
+ if (item.amounts) {
+ for (let i = 0; i < item.amounts.length; i++) {
+ const amount = item.amounts[i];
+
+ if (amount.currency !== defaultCurrency) {
+ const incomeAmount = exchangeRatesStore.getExchangedAmount(amount.incomeAmount, amount.currency, defaultCurrency);
+ const expenseAmount = exchangeRatesStore.getExchangedAmount(amount.expenseAmount, amount.currency, defaultCurrency);
+
+ if (isNumber(incomeAmount)) {
+ totalIncomeAmount += Math.floor(incomeAmount);
+ } else {
+ hasUnCalculatedTotalIncome = true;
+ }
+
+ if (isNumber(expenseAmount)) {
+ totalExpenseAmount += Math.floor(expenseAmount);
+ } else {
+ hasUnCalculatedTotalExpense = true;
+ }
+ } else {
+ totalIncomeAmount += amount.incomeAmount;
+ totalExpenseAmount += amount.expenseAmount;
+ }
+ }
+ }
+
+ finalOverviewData[field] = {
+ valid: true,
+ incomeAmount: totalIncomeAmount,
+ expenseAmount: totalExpenseAmount,
+ incompleteIncomeAmount: hasUnCalculatedTotalIncome,
+ incompleteExpenseAmount: hasUnCalculatedTotalExpense,
+ amounts: item.amounts || []
+ };
+ });
+
+ return finalOverviewData;
+ }
+ },
actions: {
updateTransactionOverviewInvalidState(invalidState) {
this.transactionOverviewStateInvalid = invalidState;
},
resetTransactionOverview() {
- this.transactionOverview = {};
+ this.transactionOverviewData = {};
this.transactionOverviewStateInvalid = true;
},
- loadTransactionOverview({ defaultCurrency, dateRange, force }) {
+ loadTransactionOverview({ force }) {
const self = this;
- const exchangeRatesStore = useExchangeRatesStore();
+ let dateChanged = false;
- if (!force && !self.transactionOverviewStateInvalid) {
+ if (self.transactionDataRange.today.startTime !== getTodayFirstUnixTime()) {
+ dateChanged = true;
+ updateTransactionDateRange(self);
+ }
+
+ if (!dateChanged && !force && !self.transactionOverviewStateInvalid) {
return new Promise((resolve) => {
- resolve(self.transactionOverview);
+ resolve(self.transactionOverviewData);
});
}
return new Promise((resolve, reject) => {
services.getTransactionAmounts({
- today: dateRange.today,
- thisWeek: dateRange.thisWeek,
- thisMonth: dateRange.thisMonth,
- thisYear: dateRange.thisYear
+ today: self.transactionDataRange.today,
+ thisWeek: self.transactionDataRange.thisWeek,
+ thisMonth: self.transactionDataRange.thisMonth,
+ thisYear: self.transactionDataRange.thisYear
}).then(response => {
const data = response.data;
@@ -43,66 +170,18 @@ export const useOverviewStore = defineStore('overview', {
return;
}
- const overview = data.result;
-
- for (let field in overview) {
- if (!Object.prototype.hasOwnProperty.call(overview, field)) {
- continue;
- }
-
- const item = overview[field];
-
- if (!item.amounts || !item.amounts.length) {
- item.amounts = [];
- }
-
- let totalIncomeAmount = 0;
- let totalExpenseAmount = 0;
- let hasUnCalculatedTotalIncome = false;
- let hasUnCalculatedTotalExpense = false;
-
- for (let i = 0; i < item.amounts.length; i++) {
- const amount = item.amounts[i];
-
- if (amount.currency !== defaultCurrency) {
- const incomeAmount = exchangeRatesStore.getExchangedAmount(amount.incomeAmount, amount.currency, defaultCurrency);
- const expenseAmount = exchangeRatesStore.getExchangedAmount(amount.expenseAmount, amount.currency, defaultCurrency);
-
- if (isNumber(incomeAmount)) {
- totalIncomeAmount += Math.floor(incomeAmount);
- } else {
- hasUnCalculatedTotalIncome = true;
- }
-
- if (isNumber(expenseAmount)) {
- totalExpenseAmount += Math.floor(expenseAmount);
- } else {
- hasUnCalculatedTotalExpense = true;
- }
- } else {
- totalIncomeAmount += amount.incomeAmount;
- totalExpenseAmount += amount.expenseAmount;
- }
- }
-
- item.incomeAmount = totalIncomeAmount;
- item.expenseAmount = totalExpenseAmount;
- item.incompleteIncomeAmount = hasUnCalculatedTotalIncome;
- item.incompleteExpenseAmount = hasUnCalculatedTotalExpense;
- }
-
if (self.transactionOverviewStateInvalid) {
self.updateTransactionOverviewInvalidState(false);
}
- if (force && overview && isEquals(self.transactionOverview, overview)) {
+ if (force && data.result && isEquals(self.transactionOverviewData, data.result)) {
reject({ message: 'Data is up to date' });
return;
}
- self.transactionOverview = overview;
+ self.transactionOverviewData = data.result;
- resolve(overview);
+ resolve(data.result);
}).catch(error => {
if (force) {
logger.error('failed to force load transaction overview', error);
diff --git a/src/views/desktop/HomePage.vue b/src/views/desktop/HomePage.vue
index d5829346..1ea4f047 100644
--- a/src/views/desktop/HomePage.vue
+++ b/src/views/desktop/HomePage.vue
@@ -17,7 +17,7 @@
{{ $t('Monthly income') }}
- {{ transactionOverview && transactionOverview.thisMonth ? transactionOverview.thisMonth.incomeAmount : '-' }}
+ {{ transactionOverview && transactionOverview.thisMonth ? getDisplayIncomeAmount(transactionOverview.thisMonth) : '-' }}
- {{ transactionOverview && transactionOverview.thisMonth ? transactionOverview.thisMonth.expenseAmount : '-' }}
+ {{ transactionOverview && transactionOverview.thisMonth ? getDisplayExpenseAmount(transactionOverview.thisMonth) : '-' }}
0.00 USD
- {{ transactionOverview.thisMonth.expenseAmount }}
+ {{ getDisplayExpenseAmount(transactionOverview.thisMonth) }}