mirror of
https://github.com/ManInDark/HabitTrove.git
synced 2026-01-21 06:34:30 +01:00
fix coin stats and add transaction note (#31)
This commit is contained in:
62
lib/atoms.ts
62
lib/atoms.ts
@@ -5,7 +5,16 @@ import {
|
||||
getDefaultCoinsData,
|
||||
getDefaultWishlistData
|
||||
} from "./types";
|
||||
import { getTodayInTimezone, isSameDate, t2d } from "@/lib/utils";
|
||||
import {
|
||||
getTodayInTimezone,
|
||||
isSameDate,
|
||||
t2d,
|
||||
calculateCoinsEarnedToday,
|
||||
calculateTotalEarned,
|
||||
calculateTotalSpent,
|
||||
calculateCoinsSpentToday,
|
||||
calculateTransactionsToday
|
||||
} from "@/lib/utils";
|
||||
|
||||
export const settingsAtom = atom(getDefaultSettings());
|
||||
export const habitsAtom = atom(getDefaultHabitsData());
|
||||
@@ -16,72 +25,31 @@ export const wishlistAtom = atom(getDefaultWishlistData());
|
||||
export const coinsEarnedTodayAtom = atom((get) => {
|
||||
const coins = get(coinsAtom);
|
||||
const settings = get(settingsAtom);
|
||||
const today = getTodayInTimezone(settings.system.timezone);
|
||||
return coins.transactions
|
||||
.filter(transaction =>
|
||||
isSameDate(t2d({ timestamp: transaction.timestamp, timezone: settings.system.timezone }),
|
||||
t2d({ timestamp: today, timezone: settings.system.timezone }))
|
||||
)
|
||||
.reduce((sum, transaction) => {
|
||||
if (transaction.type !== 'HABIT_UNDO' && transaction.amount > 0) {
|
||||
return sum + transaction.amount;
|
||||
}
|
||||
if (transaction.type === 'HABIT_UNDO') {
|
||||
return sum - Math.abs(transaction.amount);
|
||||
}
|
||||
return sum;
|
||||
}, 0);
|
||||
return calculateCoinsEarnedToday(coins.transactions, settings.system.timezone);
|
||||
});
|
||||
|
||||
// Derived atom for total earned
|
||||
export const totalEarnedAtom = atom((get) => {
|
||||
const coins = get(coinsAtom);
|
||||
return coins.transactions
|
||||
.filter(t => {
|
||||
if (t.type === 'HABIT_COMPLETION' && t.relatedItemId) {
|
||||
return !coins.transactions.some(undoT =>
|
||||
undoT.type === 'HABIT_UNDO' &&
|
||||
undoT.relatedItemId === t.relatedItemId
|
||||
);
|
||||
}
|
||||
return t.amount > 0 && t.type !== 'HABIT_UNDO';
|
||||
})
|
||||
.reduce((sum, t) => sum + t.amount, 0);
|
||||
return calculateTotalEarned(coins.transactions);
|
||||
});
|
||||
|
||||
// Derived atom for total spent
|
||||
export const totalSpentAtom = atom((get) => {
|
||||
const coins = get(coinsAtom);
|
||||
return Math.abs(
|
||||
coins.transactions
|
||||
.filter(t => t.type === 'WISH_REDEMPTION' || t.type === 'MANUAL_ADJUSTMENT')
|
||||
.reduce((sum, t) => sum + (t.amount < 0 ? t.amount : 0), 0)
|
||||
);
|
||||
return calculateTotalSpent(coins.transactions);
|
||||
});
|
||||
|
||||
// Derived atom for coins spent today
|
||||
export const coinsSpentTodayAtom = atom((get) => {
|
||||
const coins = get(coinsAtom);
|
||||
const settings = get(settingsAtom);
|
||||
const today = getTodayInTimezone(settings.system.timezone);
|
||||
return Math.abs(
|
||||
coins.transactions
|
||||
.filter(t =>
|
||||
isSameDate(t2d({ timestamp: t.timestamp, timezone: settings.system.timezone }),
|
||||
t2d({ timestamp: today, timezone: settings.system.timezone })) &&
|
||||
t.amount < 0
|
||||
)
|
||||
.reduce((sum, t) => sum + t.amount, 0)
|
||||
);
|
||||
return calculateCoinsSpentToday(coins.transactions, settings.system.timezone);
|
||||
});
|
||||
|
||||
// Derived atom for transactions today
|
||||
export const transactionsTodayAtom = atom((get) => {
|
||||
const coins = get(coinsAtom);
|
||||
const settings = get(settingsAtom);
|
||||
const today = getTodayInTimezone(settings.system.timezone);
|
||||
return coins.transactions.filter(t =>
|
||||
isSameDate(t2d({ timestamp: t.timestamp, timezone: settings.system.timezone }),
|
||||
t2d({ timestamp: today, timezone: settings.system.timezone }))
|
||||
).length;
|
||||
return calculateTransactionsToday(coins.transactions, settings.system.timezone);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user