From 1db3a43c5680a6efc924872025defe015e5a0fe0 Mon Sep 17 00:00:00 2001 From: Joel Jeremy Marquez Date: Fri, 24 Oct 2025 14:14:05 -0700 Subject: [PATCH] Reuse BalanceMovementMenu --- .../components/budget/CategoryBalanceCell.tsx | 64 ++++--------------- .../budget/envelope/BalanceMovementMenu.tsx | 12 ++-- .../components/budget/envelope/CoverMenu.tsx | 3 - .../envelope/EnvelopeBudgetComponents.tsx | 2 +- .../budget/envelope/TransferMenu.tsx | 3 - 5 files changed, 21 insertions(+), 63 deletions(-) diff --git a/packages/desktop-client/src/components/budget/CategoryBalanceCell.tsx b/packages/desktop-client/src/components/budget/CategoryBalanceCell.tsx index c8c676861e..dada0729c8 100644 --- a/packages/desktop-client/src/components/budget/CategoryBalanceCell.tsx +++ b/packages/desktop-client/src/components/budget/CategoryBalanceCell.tsx @@ -18,6 +18,7 @@ import { type CategoryEntity } from 'loot-core/types/models'; import { balanceColumnPaddingStyle } from './BudgetCategoriesV2'; import { BalanceMenu as EnvelopeBalanceMenu } from './envelope/BalanceMenu'; +import { BalanceMovementMenu as EnvelopeBalanceMovementMenu } from './envelope/BalanceMovementMenu'; import { CoverMenu } from './envelope/CoverMenu'; import { TransferMenu } from './envelope/TransferMenu'; import { BalanceMenu as TrackingBalanceMenu } from './tracking/BalanceMenu'; @@ -103,19 +104,21 @@ export function CategoryBalanceCell({ typeof categoryLongGoalBinding >(categoryLongGoalBinding); + const [isBalanceMenuOpen, setIsBalanceMenuOpen] = useState(false); + const [activeBalanceMenu, setActiveBalanceMenu] = useState< 'balance' | 'transfer' | 'cover' | null >(null); const { pressProps } = usePress({ - onPress: () => setActiveBalanceMenu('balance'), + onPress: () => setIsBalanceMenuOpen(true), }); const { focusableProps } = useFocusable( { onKeyUp: e => { if (e.key === 'Enter') { - setActiveBalanceMenu('balance'); + setIsBalanceMenuOpen(true); } }, }, @@ -183,58 +186,19 @@ export function CategoryBalanceCell({ { - if (activeBalanceMenu !== 'balance') { - setActiveBalanceMenu(null); - } + setIsBalanceMenuOpen(false); }} isNonModal > {budgetType === 'rollover' ? ( - <> - {activeBalanceMenu === 'balance' && ( - { - onBudgetAction(month, 'carryover', { - category: category.id, - flag: carryover, - }); - setActiveBalanceMenu(null); - }} - onTransfer={() => setActiveBalanceMenu('transfer')} - onCover={() => setActiveBalanceMenu('cover')} - /> - )} - {activeBalanceMenu === 'transfer' && ( - { - onBudgetAction(month, 'transfer-category', { - amount, - from: category.id, - to: toCategoryId, - }); - }} - onClose={() => setActiveBalanceMenu(null)} - /> - )} - {activeBalanceMenu === 'cover' && ( - { - onBudgetAction(month, 'cover-overspending', { - to: category.id, - from: fromCategoryId, - }); - }} - onClose={() => setActiveBalanceMenu(null)} - /> - )} - + setIsBalanceMenuOpen(false)} + /> ) : ( )} diff --git a/packages/desktop-client/src/components/budget/envelope/BalanceMovementMenu.tsx b/packages/desktop-client/src/components/budget/envelope/BalanceMovementMenu.tsx index 1c6470eafe..15699d8897 100644 --- a/packages/desktop-client/src/components/budget/envelope/BalanceMovementMenu.tsx +++ b/packages/desktop-client/src/components/budget/envelope/BalanceMovementMenu.tsx @@ -12,14 +12,14 @@ type BalanceMovementMenuProps = { categoryId: string; month: string; onBudgetAction: (month: string, action: string, arg?: unknown) => void; - onClose?: () => void; + onSelect?: () => void; }; export function BalanceMovementMenu({ categoryId, month, onBudgetAction, - onClose = () => {}, + onSelect = () => {}, }: BalanceMovementMenuProps) { const format = useFormat(); @@ -48,7 +48,7 @@ export function BalanceMovementMenu({ category: categoryId, flag: carryover, }); - onClose(); + onSelect(); }} onTransfer={() => setMenu('transfer')} onCover={() => setMenu('cover')} @@ -59,8 +59,7 @@ export function BalanceMovementMenu({ { onBudgetAction(month, 'transfer-category', { amount, @@ -68,6 +67,7 @@ export function BalanceMovementMenu({ to: toCategoryId, currencyCode: format.currency.code, }); + onSelect(); }} /> )} @@ -76,7 +76,6 @@ export function BalanceMovementMenu({ { onBudgetAction(month, 'cover-overspending', { to: categoryId, @@ -84,6 +83,7 @@ export function BalanceMovementMenu({ amount, currencyCode: format.currency.code, }); + onSelect(); }} /> )} diff --git a/packages/desktop-client/src/components/budget/envelope/CoverMenu.tsx b/packages/desktop-client/src/components/budget/envelope/CoverMenu.tsx index b93e432d1a..b19129d86c 100644 --- a/packages/desktop-client/src/components/budget/envelope/CoverMenu.tsx +++ b/packages/desktop-client/src/components/budget/envelope/CoverMenu.tsx @@ -27,7 +27,6 @@ type CoverMenuProps = { initialAmount?: IntegerAmount | null; categoryId?: CategoryEntity['id']; onSubmit: (amount: IntegerAmount, categoryId: CategoryEntity['id']) => void; - onClose: () => void; }; export function CoverMenu({ @@ -35,7 +34,6 @@ export function CoverMenu({ initialAmount = 0, categoryId, onSubmit, - onClose, }: CoverMenuProps) { const { t } = useTranslation(); @@ -61,7 +59,6 @@ export function CoverMenu({ if (parsedAmount && fromCategoryId) { onSubmit(amountToInteger(parsedAmount), fromCategoryId); } - onClose(); } return ( diff --git a/packages/desktop-client/src/components/budget/envelope/EnvelopeBudgetComponents.tsx b/packages/desktop-client/src/components/budget/envelope/EnvelopeBudgetComponents.tsx index d98088046c..57a0cd90bf 100644 --- a/packages/desktop-client/src/components/budget/envelope/EnvelopeBudgetComponents.tsx +++ b/packages/desktop-client/src/components/budget/envelope/EnvelopeBudgetComponents.tsx @@ -508,7 +508,7 @@ export const ExpenseCategoryMonth = memo(function ExpenseCategoryMonth({ categoryId={category.id} month={month} onBudgetAction={onBudgetAction} - onClose={() => setBalanceMenuOpen(false)} + onSelect={() => setBalanceMenuOpen(false)} /> diff --git a/packages/desktop-client/src/components/budget/envelope/TransferMenu.tsx b/packages/desktop-client/src/components/budget/envelope/TransferMenu.tsx index 1ecfbb5fd3..effa955234 100644 --- a/packages/desktop-client/src/components/budget/envelope/TransferMenu.tsx +++ b/packages/desktop-client/src/components/budget/envelope/TransferMenu.tsx @@ -22,7 +22,6 @@ type TransferMenuProps = { initialAmount?: IntegerAmount | null; showToBeBudgeted?: boolean; onSubmit: (amount: IntegerAmount, categoryId: CategoryEntity['id']) => void; - onClose: () => void; }; export function TransferMenu({ @@ -30,7 +29,6 @@ export function TransferMenu({ initialAmount = 0, showToBeBudgeted, onSubmit, - onClose, }: TransferMenuProps) { const { grouped: originalCategoryGroups } = useCategories(); const filteredCategoryGroups = useMemo(() => { @@ -54,7 +52,6 @@ export function TransferMenu({ if (amount != null && amount > 0 && toCategoryId) { onSubmit(amount, toCategoryId); } - onClose(); }; return (