diff --git a/packages/desktop-client/src/components/accounts/Balance.jsx b/packages/desktop-client/src/components/accounts/Balance.tsx similarity index 68% rename from packages/desktop-client/src/components/accounts/Balance.jsx rename to packages/desktop-client/src/components/accounts/Balance.tsx index 741a1fa96aa..aaa84aba524 100644 --- a/packages/desktop-client/src/components/accounts/Balance.jsx +++ b/packages/desktop-client/src/components/accounts/Balance.tsx @@ -5,8 +5,9 @@ import { useHover } from 'usehooks-ts'; import { isPreviewId } from 'loot-core/shared/transactions'; import { useCachedSchedules } from 'loot-core/src/client/data-hooks/schedules'; -import { q } from 'loot-core/src/shared/query'; +import { q, type Query } from 'loot-core/src/shared/query'; import { getScheduledAmount } from 'loot-core/src/shared/schedules'; +import { type AccountEntity } from 'loot-core/types/models'; import { useSelectedItems } from '../../hooks/useSelected'; import { SvgArrowButtonRight1 } from '../../icons/v2'; @@ -16,10 +17,21 @@ import { Text } from '../common/Text'; import { View } from '../common/View'; import { PrivacyFilter } from '../PrivacyFilter'; import { CellValue, CellValueText } from '../spreadsheet/CellValue'; +import { type SheetFields, type SheetNames } from '../spreadsheet/index'; import { useFormat } from '../spreadsheet/useFormat'; import { useSheetValue } from '../spreadsheet/useSheetValue'; -function DetailedBalance({ name, balance, isExactBalance = true }) { +type DetailedBalanceProps = { + name: string; + balance: number; + isExactBalance: boolean; +}; + +function DetailedBalance({ + name, + balance, + isExactBalance = true, +}: DetailedBalanceProps) { const format = useFormat(); return ( ; + account: AccountEntity; +}; + +function SelectedBalance({ selectedItems, account }: SelectedBalanceProps) { const { t } = useTranslation(); const name = `selected-balance-${[...selectedItems].join('-')}`; - const rows = useSheetValue({ - name, + const rows = useSheetValue<'balance', `selected-balance-${string}`>({ + name: name as `selected-balance-${string}`, query: q('transactions') .filter({ id: { $oneof: [...selectedItems] }, @@ -56,18 +73,18 @@ function SelectedBalance({ selectedItems, account }) { }) .select('id'), }); - const ids = new Set((rows || []).map(r => r.id)); + const ids = new Set(Array.isArray(rows) ? rows.map(r => r.id) : []); const finalIds = [...selectedItems].filter(id => !ids.has(id)); - let balance = useSheetValue({ - name: name + '-sum', + let balance = useSheetValue<'balance', `selected-balance-${string}`>({ + name: (name + '-sum') as `selected-balance-${string}`, query: q('transactions') .filter({ id: { $oneof: finalIds } }) .options({ splits: 'all' }) .calculate({ $sum: '$amount' }), }); - let scheduleBalance = null; + let scheduleBalance = 0; const { isLoading, schedules = [] } = useCachedSchedules(); @@ -96,12 +113,8 @@ function SelectedBalance({ selectedItems, account }) { } if (balance == null) { - if (scheduleBalance == null) { - return null; - } else { - balance = scheduleBalance; - } - } else if (scheduleBalance != null) { + balance = scheduleBalance; + } else { balance += scheduleBalance; } @@ -114,7 +127,11 @@ function SelectedBalance({ selectedItems, account }) { ); } -function FilteredBalance({ filteredAmount }) { +type FilteredBalanceProps = { + filteredAmount: number; +}; + +function FilteredBalance({ filteredAmount }: FilteredBalanceProps) { const { t } = useTranslation(); return ( @@ -126,26 +143,51 @@ function FilteredBalance({ filteredAmount }) { ); } -function MoreBalances({ balanceQuery }) { +type MoreBalancesProps = { + balanceQuery: { + name: `balance-query-${string}`; + query: Query; + }; +}; + +function MoreBalances({ balanceQuery }: MoreBalancesProps) { const { t } = useTranslation(); - const cleared = useSheetValue({ - name: balanceQuery.name + '-cleared', + const cleared = useSheetValue<'balance', `balance-query-${string}`>({ + name: (balanceQuery.name + '-cleared') as `balance-query-${string}`, query: balanceQuery.query.filter({ cleared: true }), }); - const uncleared = useSheetValue({ - name: balanceQuery.name + '-uncleared', + + const uncleared = useSheetValue<'balance', `balance-query-${string}`>({ + name: (balanceQuery.name + '-uncleared') as `balance-query-${string}`, query: balanceQuery.query.filter({ cleared: false }), }); return ( - - + + ); } +type BalancesProps = { + balanceQuery: { name: `balance-query-${string}`; query: Query }; + showExtraBalances: boolean; + onToggleExtraBalances: () => void; + account: AccountEntity; + isFiltered: boolean; + filteredAmount: number; +}; + export function Balances({ balanceQuery, showExtraBalances, @@ -153,7 +195,7 @@ export function Balances({ account, isFiltered, filteredAmount, -}) { +}: BalancesProps) { const selectedItems = useSelectedItems(); const buttonRef = useRef(null); const isButtonHovered = useHover(buttonRef); @@ -177,7 +219,14 @@ export function Balances({ paddingBottom: 1, }} > - + , + query: balanceQuery.query, + value: 0, + }} + type="financial" + > {props => (