From cc32e64dcd6f3d25fb45ef05dcd2812e627da504 Mon Sep 17 00:00:00 2001 From: Adam Horodyski Date: Tue, 3 Mar 2026 17:20:37 +0100 Subject: [PATCH] fix: move useSearchFilterSync back to SearchPage to prevent race condition The filter sync hook was moved to useSearchFiltersBar in #83602, which introduced a race condition where inline filter changes get wiped by the sync hook before Navigation.setParams fires (deferred by Modal.close()). Co-Authored-By: Claude Opus 4.6 (1M context) --- .../Search/SearchPageHeader/useSearchFiltersBar.tsx | 2 -- src/pages/Search/SearchPage.tsx | 4 ++++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/Search/SearchPageHeader/useSearchFiltersBar.tsx b/src/components/Search/SearchPageHeader/useSearchFiltersBar.tsx index 7c8861ca9f862..90ad43e4ad793 100644 --- a/src/components/Search/SearchPageHeader/useSearchFiltersBar.tsx +++ b/src/components/Search/SearchPageHeader/useSearchFiltersBar.tsx @@ -19,7 +19,6 @@ import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useOnyx from '@hooks/useOnyx'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; -import useSearchFilterSync from '@hooks/useSearchFilterSync'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import {close} from '@libs/actions/Modal'; @@ -88,7 +87,6 @@ function useSearchFiltersBar(queryJSON: SearchQueryJSON, isMobileSelectionModeEn const {isOffline} = useNetwork(); const personalDetails = usePersonalDetails(); const filterFormValues = useFilterFormValues(queryJSON); - useSearchFilterSync(filterFormValues); const {shouldUseNarrowLayout, isLargeScreenWidth} = useResponsiveLayout(); const {selectedTransactions, shouldShowFiltersBarLoading, currentSearchResults} = useSearchStateContext(); const {currencyList} = useCurrencyListState(); diff --git a/src/pages/Search/SearchPage.tsx b/src/pages/Search/SearchPage.tsx index 7f2d165f80b01..c35effc9d720f 100644 --- a/src/pages/Search/SearchPage.tsx +++ b/src/pages/Search/SearchPage.tsx @@ -7,12 +7,14 @@ import {useSearchActionsContext, useSearchStateContext} from '@components/Search import type {SearchParams} from '@components/Search/types'; import {usePlaybackActionsContext} from '@components/VideoPlayerContexts/PlaybackContext'; import useConfirmReadyToOpenApp from '@hooks/useConfirmReadyToOpenApp'; +import useFilterFormValues from '@hooks/useFilterFormValues'; import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset'; import useLocalize from '@hooks/useLocalize'; import useMobileSelectionMode from '@hooks/useMobileSelectionMode'; import usePrevious from '@hooks/usePrevious'; import useReceiptScanDrop from '@hooks/useReceiptScanDrop'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; +import useSearchFilterSync from '@hooks/useSearchFilterSync'; import useSearchShouldCalculateTotals from '@hooks/useSearchShouldCalculateTotals'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; @@ -40,6 +42,8 @@ function SearchPage({route}: SearchPageProps) { const isMobileSelectionModeEnabled = useMobileSelectionMode(clearSelectedTransactions); const queryJSON = useMemo(() => buildSearchQueryJSON(route.params.q, route.params.rawQuery), [route.params.q, route.params.rawQuery]); + const filterFormValues = useFilterFormValues(queryJSON); + useSearchFilterSync(filterFormValues); const expensifyIcons = useMemoizedLazyExpensifyIcons(['SmartScan'] as const); const lastNonEmptySearchResults = useRef(undefined);