From c51caf8ecf0b9221463eed00deb3372e4689b574 Mon Sep 17 00:00:00 2001 From: truph01 Date: Tue, 20 Jan 2026 11:18:07 +0700 Subject: [PATCH 1/7] fix: Dropdown shows 2 selected after merging expenses --- .../MoneyRequestReportActionsList.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx index 6c03be04eef0..d6f96680d431 100644 --- a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx +++ b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx @@ -183,6 +183,13 @@ function MoneyRequestReportActionsList({ const [lastActionEventId, setLastActionEventId] = useState(''); const {selectedTransactionIDs, setSelectedTransactions, clearSelectedTransactions} = useSearchContext(); + useEffect(() => { + const transactionIDs = transactions.map((transaction) => transaction.transactionID); + const filteredSelectedTransactionIDs = selectedTransactionIDs.filter((id) => transactionIDs.includes(id)); + if (filteredSelectedTransactionIDs.length !== selectedTransactionIDs.length) { + setSelectedTransactions(filteredSelectedTransactionIDs); + } + }, [transactions]); const isMobileSelectionModeEnabled = useMobileSelectionMode(); const [isExportWithTemplateModalVisible, setIsExportWithTemplateModalVisible] = useState(false); From b0d7a91a676916b2bdf6d04bb88ec4a82ee6f7ed Mon Sep 17 00:00:00 2001 From: truph01 Date: Tue, 20 Jan 2026 11:58:54 +0700 Subject: [PATCH 2/7] fix: lint --- .../MoneyRequestReportView/MoneyRequestReportActionsList.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx index d6f96680d431..2994fc68b5b2 100644 --- a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx +++ b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx @@ -184,8 +184,8 @@ function MoneyRequestReportActionsList({ const {selectedTransactionIDs, setSelectedTransactions, clearSelectedTransactions} = useSearchContext(); useEffect(() => { - const transactionIDs = transactions.map((transaction) => transaction.transactionID); - const filteredSelectedTransactionIDs = selectedTransactionIDs.filter((id) => transactionIDs.includes(id)); + const transactionIDs = new Set(transactions.map((transaction) => transaction.transactionID)); + const filteredSelectedTransactionIDs = selectedTransactionIDs.filter((id) => transactionIDs.has(id)); if (filteredSelectedTransactionIDs.length !== selectedTransactionIDs.length) { setSelectedTransactions(filteredSelectedTransactionIDs); } From 6c72c41c9c0fc5585ff229bd90bdf1eb8558b4d9 Mon Sep 17 00:00:00 2001 From: truph01 Date: Tue, 20 Jan 2026 15:04:30 +0700 Subject: [PATCH 3/7] fix: lint --- .../MoneyRequestReportView/MoneyRequestReportActionsList.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx index 2994fc68b5b2..8a870f9f2458 100644 --- a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx +++ b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx @@ -189,6 +189,7 @@ function MoneyRequestReportActionsList({ if (filteredSelectedTransactionIDs.length !== selectedTransactionIDs.length) { setSelectedTransactions(filteredSelectedTransactionIDs); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [transactions]); const isMobileSelectionModeEnabled = useMobileSelectionMode(); From 17035cf790b8dac1c8d4aeedb5ac2a798d5e7ad6 Mon Sep 17 00:00:00 2001 From: truph01 Date: Mon, 26 Jan 2026 14:36:42 +0700 Subject: [PATCH 4/7] fix: apply suggestion --- .../MoneyRequestReportActionsList.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx index 8a870f9f2458..b1a7efde947a 100644 --- a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx +++ b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx @@ -183,14 +183,13 @@ function MoneyRequestReportActionsList({ const [lastActionEventId, setLastActionEventId] = useState(''); const {selectedTransactionIDs, setSelectedTransactions, clearSelectedTransactions} = useSearchContext(); + const transactionIDs = useMemo(() => transactions.map((transaction) => transaction.transactionID), [transactions]); + const filteredSelectedTransactionIDs = useMemo(() => selectedTransactionIDs.filter((id) => transactionIDs.includes(id)), [selectedTransactionIDs, transactionIDs]); useEffect(() => { - const transactionIDs = new Set(transactions.map((transaction) => transaction.transactionID)); - const filteredSelectedTransactionIDs = selectedTransactionIDs.filter((id) => transactionIDs.has(id)); if (filteredSelectedTransactionIDs.length !== selectedTransactionIDs.length) { setSelectedTransactions(filteredSelectedTransactionIDs); } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [transactions]); + }, [filteredSelectedTransactionIDs]); const isMobileSelectionModeEnabled = useMobileSelectionMode(); const [isExportWithTemplateModalVisible, setIsExportWithTemplateModalVisible] = useState(false); From ed15bc0ac9177d92aacb8ef36e6a635be65eabad Mon Sep 17 00:00:00 2001 From: truph01 Date: Sun, 1 Feb 2026 16:17:21 +0700 Subject: [PATCH 5/7] fix: add test for new hooks --- .../MoneyRequestReportActionsList.tsx | 10 +- src/hooks/useFilterSelectedTransactions.ts | 23 ++++ .../useFilterSelectedTransactionsTest.ts | 129 ++++++++++++++++++ 3 files changed, 155 insertions(+), 7 deletions(-) create mode 100644 src/hooks/useFilterSelectedTransactions.ts create mode 100644 tests/unit/hooks/useFilterSelectedTransactionsTest.ts diff --git a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx index d92bbc54af75..e73e9af0b74d 100644 --- a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx +++ b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx @@ -20,6 +20,7 @@ import ScrollView from '@components/ScrollView'; import {useSearchContext} from '@components/Search/SearchContext'; import Text from '@components/Text'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; +import useFilterSelectedTransactions from '@hooks/useFilterSelectedTransactions'; import {AUTOSCROLL_TO_TOP_THRESHOLD} from '@hooks/useFlatListScrollKey'; import useLoadReportActions from '@hooks/useLoadReportActions'; import useLocalize from '@hooks/useLocalize'; @@ -184,13 +185,8 @@ function MoneyRequestReportActionsList({ const [lastActionEventId, setLastActionEventId] = useState(''); const {selectedTransactionIDs, setSelectedTransactions, clearSelectedTransactions} = useSearchContext(); - const transactionIDs = useMemo(() => transactions.map((transaction) => transaction.transactionID), [transactions]); - const filteredSelectedTransactionIDs = useMemo(() => selectedTransactionIDs.filter((id) => transactionIDs.includes(id)), [selectedTransactionIDs, transactionIDs]); - useEffect(() => { - if (filteredSelectedTransactionIDs.length !== selectedTransactionIDs.length) { - setSelectedTransactions(filteredSelectedTransactionIDs); - } - }, [filteredSelectedTransactionIDs]); + + useFilterSelectedTransactions(transactions); const isMobileSelectionModeEnabled = useMobileSelectionMode(); const [isExportWithTemplateModalVisible, setIsExportWithTemplateModalVisible] = useState(false); diff --git a/src/hooks/useFilterSelectedTransactions.ts b/src/hooks/useFilterSelectedTransactions.ts new file mode 100644 index 000000000000..1f28061c74ee --- /dev/null +++ b/src/hooks/useFilterSelectedTransactions.ts @@ -0,0 +1,23 @@ +import {useEffect, useMemo} from 'react'; +import {useSearchContext} from '@components/Search/SearchContext'; +import type {Transaction} from '@src/types/onyx'; + +/** + * Hook that filters selected transaction IDs to only include transactions that exist in the provided list. + * This is useful when transactions are deleted and we need to clean up the selection state. + * + * @param transactions - The current list of transactions + */ +function useFilterSelectedTransactions(transactions: Transaction[]) { + const {selectedTransactionIDs, setSelectedTransactions} = useSearchContext(); + + const transactionIDs = useMemo(() => transactions.map((transaction) => transaction.transactionID), [transactions]); + const filteredSelectedTransactionIDs = useMemo(() => selectedTransactionIDs.filter((id) => transactionIDs.includes(id)), [selectedTransactionIDs, transactionIDs]); + useEffect(() => { + if (filteredSelectedTransactionIDs.length !== selectedTransactionIDs.length) { + setSelectedTransactions(filteredSelectedTransactionIDs); + } + }, [filteredSelectedTransactionIDs]); +} + +export default useFilterSelectedTransactions; diff --git a/tests/unit/hooks/useFilterSelectedTransactionsTest.ts b/tests/unit/hooks/useFilterSelectedTransactionsTest.ts new file mode 100644 index 000000000000..55b9334a0106 --- /dev/null +++ b/tests/unit/hooks/useFilterSelectedTransactionsTest.ts @@ -0,0 +1,129 @@ +import {act, renderHook} from '@testing-library/react-native'; +import type {Transaction} from '@src/types/onyx'; +import createRandomTransaction from '../../utils/collections/transaction'; + +// Mock variables that can be modified in tests +let mockSelectedTransactionIDs: string[] = []; +const mockSetSelectedTransactions = jest.fn(); + +jest.mock('@components/Search/SearchContext', () => ({ + useSearchContext: () => ({ + selectedTransactionIDs: mockSelectedTransactionIDs, + setSelectedTransactions: mockSetSelectedTransactions, + clearSelectedTransactions: jest.fn(), + selectedTransactions: {}, + currentSearchHash: 12345, + }), +})); + +// Import the actual hook after setting up the mock +// eslint-disable-next-line @typescript-eslint/no-require-imports +const useFilterSelectedTransactions = require('@hooks/useFilterSelectedTransactions').default; + +describe('useFilterSelectedTransactions', () => { + beforeEach(() => { + jest.clearAllMocks(); + mockSelectedTransactionIDs = []; + }); + + it('should not call setSelectedTransactions when no transactions are selected', () => { + const transactions = [createRandomTransaction(1), createRandomTransaction(2)]; + transactions[0].transactionID = 'trans1'; + transactions[1].transactionID = 'trans2'; + + mockSelectedTransactionIDs = []; + + renderHook(() => useFilterSelectedTransactions(transactions)); + + expect(mockSetSelectedTransactions).not.toHaveBeenCalled(); + }); + + it('should not call setSelectedTransactions when all selected transactions exist in the list', () => { + const transactions = [createRandomTransaction(1), createRandomTransaction(2)]; + transactions[0].transactionID = 'trans1'; + transactions[1].transactionID = 'trans2'; + + mockSelectedTransactionIDs = ['trans1', 'trans2']; + + renderHook(() => useFilterSelectedTransactions(transactions)); + + expect(mockSetSelectedTransactions).not.toHaveBeenCalled(); + }); + + it('should filter out selected transactions that no longer exist in the transactions list', () => { + const transactions = [createRandomTransaction(1)]; + transactions[0].transactionID = 'trans1'; + + // trans2 and trans3 are selected but don't exist in transactions + mockSelectedTransactionIDs = ['trans1', 'trans2', 'trans3']; + + renderHook(() => useFilterSelectedTransactions(transactions)); + + expect(mockSetSelectedTransactions).toHaveBeenCalledWith(['trans1']); + }); + + it('should clear all selections when all selected transactions are removed', () => { + const transactions = [createRandomTransaction(1)]; + transactions[0].transactionID = 'trans1'; + + // All selected transactions don't exist in the current list + mockSelectedTransactionIDs = ['trans2', 'trans3']; + + renderHook(() => useFilterSelectedTransactions(transactions)); + + expect(mockSetSelectedTransactions).toHaveBeenCalledWith([]); + }); + + it('should update filtered transactions when transactions list changes', () => { + // Initial state: 3 transactions, 3 selected + const initialTransactions = [createRandomTransaction(1), createRandomTransaction(2), createRandomTransaction(3)]; + initialTransactions[0].transactionID = 'trans1'; + initialTransactions[1].transactionID = 'trans2'; + initialTransactions[2].transactionID = 'trans3'; + + mockSelectedTransactionIDs = ['trans1', 'trans2', 'trans3']; + + const {rerender} = renderHook(({transactions}) => useFilterSelectedTransactions(transactions), { + initialProps: {transactions: initialTransactions}, + }); + + // No filtering needed initially + expect(mockSetSelectedTransactions).not.toHaveBeenCalled(); + + // Now remove trans2 from the list (simulating deletion) + const updatedTransactions = [initialTransactions[0], initialTransactions[2]]; + + act(() => { + rerender({transactions: updatedTransactions}); + }); + + // Should filter out trans2 from selection + expect(mockSetSelectedTransactions).toHaveBeenCalledWith(['trans1', 'trans3']); + }); + + it('should handle empty transactions list', () => { + const transactions: Transaction[] = []; + + mockSelectedTransactionIDs = ['trans1', 'trans2']; + + renderHook(() => useFilterSelectedTransactions(transactions)); + + // All selections should be cleared since no transactions exist + expect(mockSetSelectedTransactions).toHaveBeenCalledWith([]); + }); + + it('should preserve order of selected transactions after filtering', () => { + const transactions = [createRandomTransaction(1), createRandomTransaction(2), createRandomTransaction(3)]; + transactions[0].transactionID = 'trans1'; + transactions[1].transactionID = 'trans2'; + transactions[2].transactionID = 'trans3'; + + // Selected in specific order, with some non-existent IDs interspersed + mockSelectedTransactionIDs = ['trans3', 'nonexistent1', 'trans1', 'nonexistent2', 'trans2']; + + renderHook(() => useFilterSelectedTransactions(transactions)); + + // Should maintain the original order of valid selections + expect(mockSetSelectedTransactions).toHaveBeenCalledWith(['trans3', 'trans1', 'trans2']); + }); +}); From a88b5936e14172f5230d534388e5a6378629045a Mon Sep 17 00:00:00 2001 From: truph01 Date: Sun, 1 Feb 2026 16:42:59 +0700 Subject: [PATCH 6/7] fix: lint --- src/hooks/useFilterSelectedTransactions.ts | 7 +- .../useFilterSelectedTransactionsTest.ts | 73 +++++++++++++------ 2 files changed, 57 insertions(+), 23 deletions(-) diff --git a/src/hooks/useFilterSelectedTransactions.ts b/src/hooks/useFilterSelectedTransactions.ts index 1f28061c74ee..ada8e78c0f43 100644 --- a/src/hooks/useFilterSelectedTransactions.ts +++ b/src/hooks/useFilterSelectedTransactions.ts @@ -14,10 +14,13 @@ function useFilterSelectedTransactions(transactions: Transaction[]) { const transactionIDs = useMemo(() => transactions.map((transaction) => transaction.transactionID), [transactions]); const filteredSelectedTransactionIDs = useMemo(() => selectedTransactionIDs.filter((id) => transactionIDs.includes(id)), [selectedTransactionIDs, transactionIDs]); useEffect(() => { - if (filteredSelectedTransactionIDs.length !== selectedTransactionIDs.length) { - setSelectedTransactions(filteredSelectedTransactionIDs); + if (filteredSelectedTransactionIDs.length === selectedTransactionIDs.length) { + return; } + setSelectedTransactions(filteredSelectedTransactionIDs); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [filteredSelectedTransactionIDs]); } + export default useFilterSelectedTransactions; diff --git a/tests/unit/hooks/useFilterSelectedTransactionsTest.ts b/tests/unit/hooks/useFilterSelectedTransactionsTest.ts index 55b9334a0106..f14cc79ca28a 100644 --- a/tests/unit/hooks/useFilterSelectedTransactionsTest.ts +++ b/tests/unit/hooks/useFilterSelectedTransactionsTest.ts @@ -1,4 +1,5 @@ -import {act, renderHook} from '@testing-library/react-native'; +import {renderHook} from '@testing-library/react-native'; +import useFilterSelectedTransactions from '@hooks/useFilterSelectedTransactions'; import type {Transaction} from '@src/types/onyx'; import createRandomTransaction from '../../utils/collections/transaction'; @@ -16,10 +17,6 @@ jest.mock('@components/Search/SearchContext', () => ({ }), })); -// Import the actual hook after setting up the mock -// eslint-disable-next-line @typescript-eslint/no-require-imports -const useFilterSelectedTransactions = require('@hooks/useFilterSelectedTransactions').default; - describe('useFilterSelectedTransactions', () => { beforeEach(() => { jest.clearAllMocks(); @@ -28,8 +25,14 @@ describe('useFilterSelectedTransactions', () => { it('should not call setSelectedTransactions when no transactions are selected', () => { const transactions = [createRandomTransaction(1), createRandomTransaction(2)]; - transactions[0].transactionID = 'trans1'; - transactions[1].transactionID = 'trans2'; + const trans0 = transactions.at(0); + const trans1 = transactions.at(1); + if (trans0) { + trans0.transactionID = 'trans1'; + } + if (trans1) { + trans1.transactionID = 'trans2'; + } mockSelectedTransactionIDs = []; @@ -40,8 +43,14 @@ describe('useFilterSelectedTransactions', () => { it('should not call setSelectedTransactions when all selected transactions exist in the list', () => { const transactions = [createRandomTransaction(1), createRandomTransaction(2)]; - transactions[0].transactionID = 'trans1'; - transactions[1].transactionID = 'trans2'; + const trans0 = transactions.at(0); + const trans1 = transactions.at(1); + if (trans0) { + trans0.transactionID = 'trans1'; + } + if (trans1) { + trans1.transactionID = 'trans2'; + } mockSelectedTransactionIDs = ['trans1', 'trans2']; @@ -52,7 +61,10 @@ describe('useFilterSelectedTransactions', () => { it('should filter out selected transactions that no longer exist in the transactions list', () => { const transactions = [createRandomTransaction(1)]; - transactions[0].transactionID = 'trans1'; + const trans0 = transactions.at(0); + if (trans0) { + trans0.transactionID = 'trans1'; + } // trans2 and trans3 are selected but don't exist in transactions mockSelectedTransactionIDs = ['trans1', 'trans2', 'trans3']; @@ -64,7 +76,10 @@ describe('useFilterSelectedTransactions', () => { it('should clear all selections when all selected transactions are removed', () => { const transactions = [createRandomTransaction(1)]; - transactions[0].transactionID = 'trans1'; + const trans0 = transactions.at(0); + if (trans0) { + trans0.transactionID = 'trans1'; + } // All selected transactions don't exist in the current list mockSelectedTransactionIDs = ['trans2', 'trans3']; @@ -77,9 +92,18 @@ describe('useFilterSelectedTransactions', () => { it('should update filtered transactions when transactions list changes', () => { // Initial state: 3 transactions, 3 selected const initialTransactions = [createRandomTransaction(1), createRandomTransaction(2), createRandomTransaction(3)]; - initialTransactions[0].transactionID = 'trans1'; - initialTransactions[1].transactionID = 'trans2'; - initialTransactions[2].transactionID = 'trans3'; + const initTrans0 = initialTransactions.at(0); + const initTrans1 = initialTransactions.at(1); + const initTrans2 = initialTransactions.at(2); + if (initTrans0) { + initTrans0.transactionID = 'trans1'; + } + if (initTrans1) { + initTrans1.transactionID = 'trans2'; + } + if (initTrans2) { + initTrans2.transactionID = 'trans3'; + } mockSelectedTransactionIDs = ['trans1', 'trans2', 'trans3']; @@ -91,11 +115,9 @@ describe('useFilterSelectedTransactions', () => { expect(mockSetSelectedTransactions).not.toHaveBeenCalled(); // Now remove trans2 from the list (simulating deletion) - const updatedTransactions = [initialTransactions[0], initialTransactions[2]]; + const updatedTransactions = [initialTransactions.at(0), initialTransactions.at(2)].filter((t): t is Transaction => !!t); - act(() => { - rerender({transactions: updatedTransactions}); - }); + rerender({transactions: updatedTransactions}); // Should filter out trans2 from selection expect(mockSetSelectedTransactions).toHaveBeenCalledWith(['trans1', 'trans3']); @@ -114,9 +136,18 @@ describe('useFilterSelectedTransactions', () => { it('should preserve order of selected transactions after filtering', () => { const transactions = [createRandomTransaction(1), createRandomTransaction(2), createRandomTransaction(3)]; - transactions[0].transactionID = 'trans1'; - transactions[1].transactionID = 'trans2'; - transactions[2].transactionID = 'trans3'; + const trans0 = transactions.at(0); + const trans1 = transactions.at(1); + const trans2 = transactions.at(2); + if (trans0) { + trans0.transactionID = 'trans1'; + } + if (trans1) { + trans1.transactionID = 'trans2'; + } + if (trans2) { + trans2.transactionID = 'trans3'; + } // Selected in specific order, with some non-existent IDs interspersed mockSelectedTransactionIDs = ['trans3', 'nonexistent1', 'trans1', 'nonexistent2', 'trans2']; From b8f5111d9c199b96c9d2d5dab9c7870b8f9a3042 Mon Sep 17 00:00:00 2001 From: truph01 Date: Sun, 1 Feb 2026 16:55:10 +0700 Subject: [PATCH 7/7] fix: lint --- src/CONST/index.ts | 1 + .../MoneyRequestReportView/MoneyRequestReportActionsList.tsx | 1 + src/hooks/useFilterSelectedTransactions.ts | 1 - 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 08b1b94e0da6..377dce31ca49 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -8103,6 +8103,7 @@ const CONST = { THREAD_DIVIDER: 'Report-ThreadDivider', PURE_REPORT_ACTION_ITEM: 'Report-PureReportActionItem', MODERATION_BUTTON: 'Report-ModerationButton', + MONEY_REQUEST_REPORT_ACTIONS_LIST_SELECT_ALL: 'MoneyRequestReportActionsList-SelectAll', }, SIDEBAR: { SIGN_IN_BUTTON: 'Sidebar-SignInButton', diff --git a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx index e73e9af0b74d..adefb065220b 100644 --- a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx +++ b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx @@ -732,6 +732,7 @@ function MoneyRequestReportActionsList({ role="button" accessibilityState={{checked: isSelectAllChecked}} dataSet={{[CONST.SELECTION_SCRAPER_HIDDEN_ELEMENT]: true}} + sentryLabel={CONST.SENTRY_LABEL.REPORT.MONEY_REQUEST_REPORT_ACTIONS_LIST_SELECT_ALL} > {translate('workspace.people.selectAll')} diff --git a/src/hooks/useFilterSelectedTransactions.ts b/src/hooks/useFilterSelectedTransactions.ts index ada8e78c0f43..b180dcfd5e71 100644 --- a/src/hooks/useFilterSelectedTransactions.ts +++ b/src/hooks/useFilterSelectedTransactions.ts @@ -22,5 +22,4 @@ function useFilterSelectedTransactions(transactions: Transaction[]) { }, [filteredSelectedTransactionIDs]); } - export default useFilterSelectedTransactions;