fix infinite render

This commit is contained in:
dohsimpson
2025-05-28 17:43:28 -04:00
parent 6ef4aacfb8
commit 5ae659469b

View File

@@ -1,5 +1,5 @@
import { useAtom } from 'jotai'; import { useAtom } from 'jotai';
import { useState, useEffect } from 'react'; import { useState, useEffect, useMemo } from 'react';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import { calculateCoinsEarnedToday, calculateCoinsSpentToday, calculateTotalEarned, calculateTotalSpent, calculateTransactionsToday, checkPermission } from '@/lib/utils' import { calculateCoinsEarnedToday, calculateCoinsSpentToday, calculateTotalEarned, calculateTotalSpent, calculateTransactionsToday, checkPermission } from '@/lib/utils'
import { import {
@@ -61,8 +61,11 @@ export function useCoins(options?: { selectedUser?: string }) {
const [atomCoinsSpentToday] = useAtom(coinsSpentTodayAtom); const [atomCoinsSpentToday] = useAtom(coinsSpentTodayAtom);
const [atomTransactionsToday] = useAtom(transactionsTodayAtom); const [atomTransactionsToday] = useAtom(transactionsTodayAtom);
const targetUser = options?.selectedUser ? users.users.find(u => u.id === options.selectedUser) : currentUser const targetUser = options?.selectedUser ? users.users.find(u => u.id === options.selectedUser) : currentUser
// Filter transactions for the targetUser
const transactions = allCoinsData.transactions.filter(t => t.userId === targetUser?.id) const transactions = useMemo(() => {
return allCoinsData.transactions.filter(t => t.userId === targetUser?.id);
}, [allCoinsData, targetUser?.id]);
const timezone = settings.system.timezone; const timezone = settings.system.timezone;
const [coinsEarnedToday, setCoinsEarnedToday] = useState(0); const [coinsEarnedToday, setCoinsEarnedToday] = useState(0);
const [totalEarned, setTotalEarned] = useState(0); const [totalEarned, setTotalEarned] = useState(0);
@@ -88,16 +91,14 @@ export function useCoins(options?: { selectedUser?: string }) {
setTotalSpent(calculateTotalSpent(transactions)); setTotalSpent(calculateTotalSpent(transactions));
setCoinsSpentToday(calculateCoinsSpentToday(transactions, timezone)); setCoinsSpentToday(calculateCoinsSpentToday(transactions, timezone));
setTransactionsToday(calculateTransactionsToday(transactions, timezone)); setTransactionsToday(calculateTransactionsToday(transactions, timezone));
const userTransactions = allCoinsData.transactions.filter(t => t.userId === targetUser!.id); setBalance(transactions.reduce((acc, t) => acc + t.amount, 0));
setBalance(userTransactions.reduce((acc, t) => acc + t.amount, 0));
} }
}, [ }, [
targetUser, targetUser?.id,
currentUser, currentUser?.id,
transactions, // Derived from allCoinsData and targetUser transactions, // Memoized: depends on allCoinsData and targetUser?.id
allCoinsData, // Added for balance calculation when targetUser is not currentUser
timezone, timezone,
loggedInUserBalance, // Added for balance calculation when targetUser is currentUser loggedInUserBalance,
atomCoinsEarnedToday, atomCoinsEarnedToday,
atomTotalEarned, atomTotalEarned,
atomTotalSpent, atomTotalSpent,