// @ts-strict-ignore import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useSelector } from 'react-redux'; import * as queries from 'loot-core/src/client/queries'; import { type State } from 'loot-core/src/client/state-types'; import { useBudgetedAccounts } from '../../hooks/useBudgetedAccounts'; import { useClosedAccounts } from '../../hooks/useClosedAccounts'; import { useFailedAccounts } from '../../hooks/useFailedAccounts'; import { useLocalPref } from '../../hooks/useLocalPref'; import { useOffBudgetAccounts } from '../../hooks/useOffBudgetAccounts'; import { useUpdatedAccounts } from '../../hooks/useUpdatedAccounts'; import { SvgAdd } from '../../icons/v1'; import { View } from '../common/View'; import { type OnDropCallback } from '../sort'; import { Account } from './Account'; import { SecondaryItem } from './SecondaryItem'; const fontWeight = 600; type AccountsProps = { onAddAccount: () => void; onToggleClosedAccounts: () => void; onReorder: OnDropCallback; }; export function Accounts({ onAddAccount, onToggleClosedAccounts, onReorder, }: AccountsProps) { const { t } = useTranslation(); const [isDragging, setIsDragging] = useState(false); const failedAccounts = useFailedAccounts(); const updatedAccounts = useUpdatedAccounts(); const offbudgetAccounts = useOffBudgetAccounts(); const budgetedAccounts = useBudgetedAccounts(); const closedAccounts = useClosedAccounts(); const syncingAccountIds = useSelector( (state: State) => state.account.accountsSyncing, ); const getAccountPath = account => `/accounts/${account.id}`; const [showClosedAccounts] = useLocalPref('ui.showClosedAccounts'); function onDragChange(drag) { setIsDragging(drag.state === 'start'); } const makeDropPadding = i => { if (i === 0) { return { paddingTop: isDragging ? 15 : 0, marginTop: isDragging ? -15 : 0, }; } return null; }; return ( <View> <Account name={t('All accounts')} to="/accounts" query={queries.allAccountBalance()} style={{ fontWeight, marginTop: 15 }} /> {budgetedAccounts.length > 0 && ( <Account name={t('For budget')} to="/accounts/budgeted" query={queries.budgetedAccountBalance()} style={{ fontWeight, marginTop: 13, marginBottom: 5, }} /> )} {budgetedAccounts.map((account, i) => ( <Account key={account.id} name={account.name} account={account} connected={!!account.bank} pending={syncingAccountIds.includes(account.id)} failed={failedAccounts && failedAccounts.has(account.id)} updated={updatedAccounts && updatedAccounts.includes(account.id)} to={getAccountPath(account)} query={queries.accountBalance(account)} onDragChange={onDragChange} onDrop={onReorder} outerStyle={makeDropPadding(i)} /> ))} {offbudgetAccounts.length > 0 && ( <Account name={t('Off budget')} to="/accounts/offbudget" query={queries.offbudgetAccountBalance()} style={{ fontWeight, marginTop: 13, marginBottom: 5, }} /> )} {offbudgetAccounts.map((account, i) => ( <Account key={account.id} name={account.name} account={account} connected={!!account.bank} pending={syncingAccountIds.includes(account.id)} failed={failedAccounts && failedAccounts.has(account.id)} updated={updatedAccounts && updatedAccounts.includes(account.id)} to={getAccountPath(account)} query={queries.accountBalance(account)} onDragChange={onDragChange} onDrop={onReorder} outerStyle={makeDropPadding(i)} /> ))} {closedAccounts.length > 0 && ( <SecondaryItem style={{ marginTop: 15 }} title={ showClosedAccounts ? t('Closed accounts') : t('Closed accounts...') } onClick={onToggleClosedAccounts} bold /> )} {showClosedAccounts && closedAccounts.map(account => ( <Account key={account.id} name={account.name} account={account} to={getAccountPath(account)} query={queries.accountBalance(account)} onDragChange={onDragChange} onDrop={onReorder} /> ))} <SecondaryItem style={{ marginTop: 15, marginBottom: 9, }} onClick={onAddAccount} Icon={SvgAdd} title={t('Add account')} /> </View> ); }