fix coin stats and add transaction note (#31)

This commit is contained in:
Doh
2025-01-09 15:45:00 -05:00
committed by GitHub
parent 8bbd684873
commit aacf75e5f6
11 changed files with 438 additions and 132 deletions

View File

@@ -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);
});