Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
ff711a8
split SearchContext into Query, Results, Selection providers
TMisiukiewicz May 21, 2026
2ebc706
migrate selection-only consumers to narrow Search hooks
TMisiukiewicz May 21, 2026
2eb1df1
migrate results-only consumers to narrow Search hooks
TMisiukiewicz May 21, 2026
c7389cd
migrate query-only consumers to narrow Search hooks
TMisiukiewicz May 21, 2026
041ec65
migrate cross-bucket consumers and remove SearchContext shim
TMisiukiewicz May 21, 2026
573d420
extract SearchContext definitions to break circular import
TMisiukiewicz May 21, 2026
6cea370
Merge remote-tracking branch 'origin/main' into refactor/split-search…
TMisiukiewicz May 21, 2026
59c4702
Merge remote-tracking branch 'origin/main' into refactor/split-search…
TMisiukiewicz May 21, 2026
b02c823
Merge remote-tracking branch 'origin/main' into refactor/split-search…
TMisiukiewicz May 22, 2026
4c14dd4
propagate PR #91188 changes to split search context
TMisiukiewicz May 22, 2026
fcc556a
fix prettier
TMisiukiewicz May 22, 2026
ec6e2e3
Merge remote-tracking branch 'origin/main' into refactor/split-search…
TMisiukiewicz May 22, 2026
14e3e22
Merge remote-tracking branch 'origin/main' into refactor/split-search…
TMisiukiewicz May 22, 2026
c7a5691
fix test imports for split selection context
TMisiukiewicz May 22, 2026
a6d3fa1
route useOnyx context import via SearchContext shim
TMisiukiewicz May 22, 2026
f929dd5
make SearchContext lightweight to break useOnyx circular dep
TMisiukiewicz May 22, 2026
7ffafeb
Merge remote-tracking branch 'origin/main' into refactor/split-search…
TMisiukiewicz May 25, 2026
cee5933
clarify why SearchResultsProvider uses react-native-onyx directly
TMisiukiewicz May 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .storybook/preview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import type {Parameters} from 'storybook/internal/types';
import EnvironmentProvider from '@components/EnvironmentContextProvider';
import OnyxListItemProvider from '@components/OnyxListItemProvider';
import ScreenWrapperStatusContext from '@components/ScreenWrapper/ScreenWrapperStatusContext';
import {SearchContextProvider} from '@components/Search/SearchContext';
import {SearchContextProvider} from '@components/Search/SearchContextProvider';
import colors from '@styles/theme/colors';
import ComposeProviders from '@src/components/ComposeProviders';
import HTMLEngineProvider from '@src/components/HTMLEngineProvider';
Expand Down
4 changes: 2 additions & 2 deletions src/components/MoneyReportHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import MoneyReportHeaderActions from './MoneyReportHeaderActions';
import MoneyReportHeaderModals from './MoneyReportHeaderModals';
import MoneyReportHeaderMoreContent from './MoneyReportHeaderMoreContent';
import {PaymentAnimationsProvider} from './PaymentAnimationsContext';
import {useSearchActionsContext} from './Search/SearchContext';
import {useSearchSelectionActions} from './Search/SearchContext';

type MoneyReportHeaderProps = {
/** The reportID of the report currently being looked at */
Expand Down Expand Up @@ -52,7 +52,7 @@ function MoneyReportHeader({reportID, shouldDisplayBackButton = false, onBackBut
}

function MoneyReportHeaderContent({reportID: reportIDProp, shouldDisplayBackButton = false, onBackButtonPress}: MoneyReportHeaderProps) {
const {clearSelectedTransactions} = useSearchActionsContext();
const {clearSelectedTransactions} = useSearchSelectionActions();
const [moneyRequestReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${reportIDProp}`);
const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${getNonEmptyStringOnyxID(moneyRequestReport?.policyID)}`);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {useMoneyReportHeaderModals} from '@components/MoneyReportHeaderModalsCon
import NavigationDeferredMount from '@components/NavigationDeferredMount';
import {usePaymentAnimationsContext} from '@components/PaymentAnimationsContext';
import type {PopoverMenuItem} from '@components/PopoverMenu';
import {useSearchStateContext} from '@components/Search/SearchContext';
import {useSearchQueryContext, useSearchResultsContext} from '@components/Search/SearchContext';
import type {PaymentActionParams} from '@components/SettlementButton/types';
import useActiveAdminPolicies from '@hooks/useActiveAdminPolicies';
import {useCurrencyListActions} from '@hooks/useCurrencyList';
Expand Down Expand Up @@ -132,7 +132,8 @@ function MoneyReportHeaderSecondaryActionsInner({reportID, primaryAction, isRepo

const {isDelegateAccessRestricted} = useDelegateNoAccessState();
const {showDelegateNoAccessModal} = useDelegateNoAccessActions();
const {currentSearchQueryJSON, currentSearchKey, currentSearchResults} = useSearchStateContext();
const {currentSearchQueryJSON, currentSearchKey} = useSearchQueryContext();
const {currentSearchResults} = useSearchResultsContext();
const shouldCalculateTotals = useSearchShouldCalculateTotals(currentSearchKey, currentSearchQueryJSON?.hash, true);

const isInvoiceReport = isInvoiceReportUtil(moneyRequestReport);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import {useMoneyReportHeaderModals} from '@components/MoneyReportHeaderModalsCon
import {usePaymentAnimationsContext} from '@components/PaymentAnimationsContext';
import type {PopoverMenuItem} from '@components/PopoverMenu';
import BulkDuplicateHandler from '@components/Search/BulkDuplicateHandler';
import {useSearchActionsContext, useSearchStateContext} from '@components/Search/SearchContext';
import {useSearchQueryContext, useSearchResultsContext, useSearchSelectionActions, useSearchSelectionContext} from '@components/Search/SearchContext';
import type {PaymentActionParams} from '@components/SettlementButton/types';
import useActiveAdminPolicies from '@hooks/useActiveAdminPolicies';
import useConfirmModal from '@hooks/useConfirmModal';
Expand Down Expand Up @@ -88,8 +88,10 @@ function MoneyReportHeaderSelectionDropdown({reportID, primaryAction, isReportIn
const lastWorkspaceNumber = useLastWorkspaceNumber();
const {convertToDisplayString} = useCurrencyListActions();

const {selectedTransactionIDs, currentSearchQueryJSON, currentSearchKey, currentSearchResults} = useSearchStateContext();
const {clearSelectedTransactions} = useSearchActionsContext();
const {selectedTransactionIDs} = useSearchSelectionContext();
const {currentSearchQueryJSON, currentSearchKey} = useSearchQueryContext();
const {currentSearchResults} = useSearchResultsContext();
const {clearSelectedTransactions} = useSearchSelectionActions();
const shouldCalculateTotals = useSearchShouldCalculateTotals(currentSearchKey, currentSearchQueryJSON?.hash, true);

const [moneyRequestReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getNonEmptyStringOnyxID(reportID)}`);
Expand Down
6 changes: 3 additions & 3 deletions src/components/MoneyReportHeaderActions/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import {View} from 'react-native';
import type {ValueOf} from 'type-fest';
import type {ButtonWithDropdownMenuRef} from '@components/ButtonWithDropdownMenu/types';
import MoneyReportHeaderPrimaryAction from '@components/MoneyReportHeaderPrimaryAction';
import {useSearchActionsContext, useSearchStateContext} from '@components/Search/SearchContext';
import {useSearchSelectionActions, useSearchSelectionContext} from '@components/Search/SearchContext';
import useExportAgainModal from '@hooks/useExportAgainModal';
import useOnyx from '@hooks/useOnyx';
import useResponsiveLayout from '@hooks/useResponsiveLayout';
Expand Down Expand Up @@ -44,8 +44,8 @@ function MoneyReportHeaderActions({reportID, primaryAction, isReportInSearch, ba

const {triggerExportOrConfirm} = useExportAgainModal(moneyRequestReport?.reportID, moneyRequestReport?.policyID);

const {selectedTransactionIDs} = useSearchStateContext();
const {clearSelectedTransactions} = useSearchActionsContext();
const {selectedTransactionIDs} = useSearchSelectionContext();
const {clearSelectedTransactions} = useSearchSelectionActions();
const hasSelectedTransactions = !!selectedTransactionIDs.length;
const isTransactionThread = !!transactionThreadReportID;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import React from 'react';
import {useDelegateNoAccessActions, useDelegateNoAccessState} from '@components/DelegateNoAccessModalProvider';
import {useMoneyReportHeaderModals} from '@components/MoneyReportHeaderModalsContext';
import {usePaymentAnimationsContext} from '@components/PaymentAnimationsContext';
import {useSearchStateContext} from '@components/Search/SearchContext';
import {useSearchQueryContext, useSearchResultsContext} from '@components/Search/SearchContext';
import AnimatedSettlementButton from '@components/SettlementButton/AnimatedSettlementButton';
import type {PaymentActionParams} from '@components/SettlementButton/types';
import {useCurrencyListActions} from '@hooks/useCurrencyList';
Expand Down Expand Up @@ -107,7 +107,8 @@ function PayPrimaryAction({reportID, chatReportID}: PayPrimaryActionProps) {
const totalAmount = getTotalAmountForIOUReportPreviewButton(moneyRequestReport, policy, CONST.REPORT.PRIMARY_ACTIONS.PAY, nonPendingDeleteTransactions, convertToDisplayString);
const isAnyTransactionOnHold = hasHeldExpensesReportUtils(transactions);

const {currentSearchQueryJSON, currentSearchKey, currentSearchResults} = useSearchStateContext();
const {currentSearchQueryJSON, currentSearchKey} = useSearchQueryContext();
const {currentSearchResults} = useSearchResultsContext();
const shouldCalculateTotals = useSearchShouldCalculateTotals(currentSearchKey, currentSearchQueryJSON?.hash, true);

const {openHoldMenu} = useMoneyReportHeaderModals();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import {delegateEmailSelector} from '@selectors/Account';
import React from 'react';
import AnimatedSubmitButton from '@components/AnimatedSubmitButton';
import {usePaymentAnimationsContext} from '@components/PaymentAnimationsContext';
import {useSearchStateContext} from '@components/Search/SearchContext';
import {useSearchQueryContext, useSearchResultsContext} from '@components/Search/SearchContext';
import useConfirmModal from '@hooks/useConfirmModal';
import useConfirmPendingRTERAndProceed from '@hooks/useConfirmPendingRTERAndProceed';
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
Expand Down Expand Up @@ -71,7 +71,8 @@ function SubmitPrimaryAction({reportID}: SubmitPrimaryActionProps) {
);
const shouldBlockSubmit = isBlockSubmitDueToStrictPolicyRules || isBlockSubmitDueToPreventSelfApproval;

const {currentSearchQueryJSON, currentSearchKey, currentSearchResults} = useSearchStateContext();
const {currentSearchQueryJSON, currentSearchKey} = useSearchQueryContext();
const {currentSearchResults} = useSearchResultsContext();
const shouldCalculateTotals = useSearchShouldCalculateTotals(currentSearchKey, currentSearchQueryJSON?.hash, true);

const handleSubmit = () => {
Expand Down
6 changes: 3 additions & 3 deletions src/components/MoneyRequestHeaderSecondaryActions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ import HoldOrRejectEducationalModal from './HoldOrRejectEducationalModal';
import HoldSubmitterEducationalModal from './HoldSubmitterEducationalModal';
import {ModalActions} from './Modal/Global/ModalContext';
import {usePersonalDetails} from './OnyxListItemProvider';
import {useSearchActionsContext, useSearchStateContext} from './Search/SearchContext';
import {useSearchQueryContext, useSearchSelectionActions} from './Search/SearchContext';
import {useWideRHPState} from './WideRHPContextProvider';

type MoneyRequestHeaderSecondaryActionsProps = {
Expand Down Expand Up @@ -162,8 +162,8 @@ function MoneyRequestHeaderSecondaryActions({reportID, onBackButtonPress}: Money
const {showConfirmModal} = useConfirmModal();
const {isDelegateAccessRestricted} = useDelegateNoAccessState();
const {showDelegateNoAccessModal} = useDelegateNoAccessActions();
const {currentSearchHash} = useSearchStateContext();
const {removeTransaction} = useSearchActionsContext();
const {currentSearchHash} = useSearchQueryContext();
const {removeTransaction} = useSearchSelectionActions();
const {duplicateTransactions, duplicateTransactionViolations} = useDuplicateTransactionsAndViolations(transaction?.transactionID ? [transaction.transactionID] : []);
const isReportInSearch = route.name === SCREENS.RIGHT_MODAL.SEARCH_REPORT || route.name === SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT;
const {getCurrencyDecimals} = useCurrencyListActions();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React, {useEffect, useState} from 'react';
import {View} from 'react-native';
import type {OnyxEntry} from 'react-native-onyx';
import PrevNextButtons from '@components/PrevNextButtons';
import {useSearchStateContext} from '@components/Search/SearchContext';
import {useSearchResultsContext} from '@components/Search/SearchContext';
import Text from '@components/Text';
import useFilterPendingDeleteReports from '@hooks/useFilterPendingDeleteReports';
import useOnyx from '@hooks/useOnyx';
Expand Down Expand Up @@ -222,7 +222,7 @@ function MoneyRequestReportNavigation({reportID, shouldDisplayNarrowVersion}: Mo
const [snapshotGuard = EMPTY_GUARD] = useOnyx(`${ONYXKEYS.COLLECTION.SNAPSHOT}${hash}`, {selector: snapshotGuardSelector});

// Fast-path hooks (always called to satisfy rules of hooks)
const {sortedReportIDs} = useSearchStateContext();
const {sortedReportIDs} = useSearchResultsContext();
const [lastSearchQuery] = useOnyx(ONYXKEYS.REPORT_NAVIGATION_LAST_SEARCH_QUERY);
const searchLoadingSelector = (data: OnyxEntry<SearchResults>) => !!data?.search?.isLoading;
const [isSearchLoading = false] = useOnyx(`${ONYXKEYS.COLLECTION.SNAPSHOT}${lastSearchQuery?.queryJSON?.hash}`, {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import Modal from '@components/Modal';
import OfflineWithFeedback from '@components/OfflineWithFeedback';
import ScrollView from '@components/ScrollView';
import DropdownButton from '@components/Search/FilterDropdowns/DropdownButton';
import {useSearchActionsContext, useSearchStateContext} from '@components/Search/SearchContext';
import {useSearchSelectionActions, useSearchSelectionContext} from '@components/Search/SearchContext';
import type {SearchCustomColumnIds, SortOrder} from '@components/Search/types';
import SelectionList from '@components/SelectionList';
import SingleSelectListItem from '@components/SelectionList/ListItem/SingleSelectListItem';
Expand Down Expand Up @@ -206,8 +206,8 @@ function MoneyRequestReportTransactionList({
return hasPendingDeletionTransaction || transactions.some(getTransactionPendingAction);
}, [hasPendingDeletionTransaction, transactions]);

const {selectedTransactionIDs} = useSearchStateContext();
const {setSelectedTransactions, clearSelectedTransactions} = useSearchActionsContext();
const {selectedTransactionIDs} = useSearchSelectionContext();
const {setSelectedTransactions, clearSelectedTransactions} = useSearchSelectionActions();
useHandleSelectionMode(selectedTransactionIDs);
const isMobileSelectionModeEnabled = useMobileSelectionMode();

Expand Down
10 changes: 5 additions & 5 deletions src/components/MoneyRequestReportView/SelectionToolbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import OfflineWithFeedback from '@components/OfflineWithFeedback';
import {PressableWithFeedback} from '@components/Pressable';
import ProcessMoneyReportHoldMenu from '@components/ProcessMoneyReportHoldMenu';
import BulkDuplicateHandler from '@components/Search/BulkDuplicateHandler';
import {useSearchActionsContext, useSearchStateContext} from '@components/Search/SearchContext';
import {useSearchSelectionActions, useSearchSelectionContext} from '@components/Search/SearchContext';
import Text from '@components/Text';
import useConfirmModal from '@hooks/useConfirmModal';
import useFilterSelectedTransactions from '@hooks/useFilterSelectedTransactions';
Expand Down Expand Up @@ -70,8 +70,8 @@ function SelectionToolbar({reportID, transactions, reportActions}: SelectionTool
const {isDelegateAccessRestricted} = useDelegateNoAccessState();
const {showDelegateNoAccessModal} = useDelegateNoAccessActions();

const {selectedTransactionIDs} = useSearchStateContext();
const {setSelectedTransactions, clearSelectedTransactions} = useSearchActionsContext();
const {selectedTransactionIDs} = useSearchSelectionContext();
const {setSelectedTransactions, clearSelectedTransactions} = useSearchSelectionActions();

useFilterSelectedTransactions(transactions, reportID);

Expand Down Expand Up @@ -355,8 +355,8 @@ function SelectionToolbar({reportID, transactions, reportActions}: SelectionTool
}

function SelectionToolbarGate({reportID, transactions, reportActions}: SelectionToolbarProps) {
const {selectedTransactionIDs, currentSelectedTransactionReportID} = useSearchStateContext();
const {clearSelectedTransactions, setCurrentSelectedTransactionReportID} = useSearchActionsContext();
const {selectedTransactionIDs, currentSelectedTransactionReportID} = useSearchSelectionContext();
const {clearSelectedTransactions, setCurrentSelectedTransactionReportID} = useSearchSelectionActions();
const isMobileSelectionModeEnabled = useMobileSelectionMode();

useFocusEffect(() => {
Expand Down
7 changes: 4 additions & 3 deletions src/components/Navigation/SearchSidebar.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type {ParamListBase} from '@react-navigation/native';
import React, {useEffect} from 'react';
import {View} from 'react-native';
import {useSearchActionsContext, useSearchStateContext} from '@components/Search/SearchContext';
import {useSearchQueryContext, useSearchResultsActions, useSearchResultsContext} from '@components/Search/SearchContext';
import useLoadingBarVisibility from '@hooks/useLoadingBarVisibility';
import useLocalize from '@hooks/useLocalize';
import useNetwork from '@hooks/useNetwork';
Expand All @@ -24,8 +24,9 @@ function SearchSidebar({state}: SearchSidebarProps) {
const {shouldUseNarrowLayout} = useResponsiveLayout();

const route = state.routes.at(-1);
const {lastSearchType, currentSearchResults, currentSearchQueryJSON} = useSearchStateContext();
const {setLastSearchType} = useSearchActionsContext();
const {lastSearchType, currentSearchResults} = useSearchResultsContext();
const {currentSearchQueryJSON} = useSearchQueryContext();
const {setLastSearchType} = useSearchResultsActions();

const searchType = currentSearchResults?.search?.type;
const isSearchLoading = currentSearchResults?.search?.isLoading;
Expand Down
4 changes: 2 additions & 2 deletions src/components/ReportActionItem/MoneyRequestView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import {ModalActions} from '@components/Modal/Global/ModalContext';
import OfflineWithFeedback from '@components/OfflineWithFeedback';
import {usePersonalDetails, usePolicyCategories, usePolicyTags} from '@components/OnyxListItemProvider';
import ReportActionsSkeletonView from '@components/ReportActionsSkeletonView';
import {useSearchStateContext} from '@components/Search/SearchContext';
import {useSearchResultsContext} from '@components/Search/SearchContext';
import Switch from '@components/Switch';
import Text from '@components/Text';
import UserPills from '@components/UserPills';
Expand Down Expand Up @@ -188,7 +188,7 @@ function MoneyRequestView({
const {showConfirmModal} = useConfirmModal();
const [lastVisitedPath] = useOnyx(ONYXKEYS.LAST_VISITED_PATH);

const {currentSearchResults} = useSearchStateContext();
const {currentSearchResults} = useSearchResultsContext();
const reportAttributes = useReportAttributes();

// When this component is used when merging from the search page, we might not have the parent report stored in the main collection
Expand Down
6 changes: 3 additions & 3 deletions src/components/Search/FilterDropdowns/SortByPopup.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import type {OnyxEntry} from 'react-native-onyx';
import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
import ListFilterWrapper from '@components/Search/FilterComponents/ListFilterViewWrapper';
import type {SingleSelectItem} from '@components/Search/FilterComponents/SingleSelect';
import {useSearchActionsContext, useSearchStateContext} from '@components/Search/SearchContext';
import {useSearchResultsContext, useSearchSelectionActions} from '@components/Search/SearchContext';
import type {SearchColumnType, SearchGroupBy, SearchQueryJSON} from '@components/Search/types';
import SelectionList from '@components/SelectionList';
import SingleSelectListItem from '@components/SelectionList/ListItem/SingleSelectListItem';
Expand Down Expand Up @@ -40,8 +40,8 @@ function SortByPopup({searchResults, queryJSON, groupBy, onSort, onSortOrderPres
const {translate} = useLocalize();
const styles = useThemeStyles();
const {accountID} = useCurrentUserPersonalDetails();
const {shouldUseLiveData} = useSearchStateContext();
const {clearSelectedTransactions} = useSearchActionsContext();
const {shouldUseLiveData} = useSearchResultsContext();
const {clearSelectedTransactions} = useSearchSelectionActions();

const [visibleColumns] = useOnyx(ONYXKEYS.FORMS.SEARCH_ADVANCED_FILTERS_FORM, {selector: columnsSelector});

Expand Down
4 changes: 2 additions & 2 deletions src/components/Search/FilterDropdowns/SortOrderPopup.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React from 'react';
import {useSearchActionsContext} from '@components/Search/SearchContext';
import {useSearchSelectionActions} from '@components/Search/SearchContext';
import type {SearchQueryJSON, SortOrder} from '@components/Search/types';
import useLocalize from '@hooks/useLocalize';
import {close} from '@libs/actions/Modal';
Expand All @@ -17,7 +17,7 @@ type SortOrderPopupProps = {

function SortOrderPopup({queryJSON, onSort, onBackButtonPress, closeOverlay}: SortOrderPopupProps) {
const {translate} = useLocalize();
const {clearSelectedTransactions} = useSearchActionsContext();
const {clearSelectedTransactions} = useSearchSelectionActions();

const onSortChange = (sortOrder: SortOrder) => {
clearSelectedTransactions();
Expand Down
Loading
Loading