Skip to content

Commit d7fdd97

Browse files
committed
Add SearchWithNavigationDeferredMount wrapper
Introduce SearchWithNavigationDeferredMount that wraps Search in NavigationDeferredMount with a SearchRowSkeleton placeholder. The placeholder ends the ManualNavigateToReports span with is_warm=true at first layout, so warm first mount measures to skeleton visible while the heavy list hydrates after the navigation transition completes. Refocus through react-freeze still ends the span via Search's existing useFocusEffect, so cached navigations keep measuring to list visible without showing a skeleton. Used by SearchPageWide and SearchPageNarrow (non-static branch) in place of the previous inline render so the spread-props wrapper handles narrow vs wide container styling internally via useResponsiveLayout.
1 parent d668d9d commit d7fdd97

3 files changed

Lines changed: 39 additions & 3 deletions

File tree

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import type {ComponentProps} from 'react';
2+
import React from 'react';
3+
import NavigationDeferredMount from '@components/NavigationDeferredMount';
4+
import SearchRowSkeleton from '@components/Skeletons/SearchRowSkeleton';
5+
import useResponsiveLayout from '@hooks/useResponsiveLayout';
6+
import useThemeStyles from '@hooks/useThemeStyles';
7+
import {endSpanWithAttributes} from '@libs/telemetry/activeSpans';
8+
import CONST from '@src/CONST';
9+
import Search from './index';
10+
11+
const REASON_ATTRIBUTES = {context: 'SearchPage.NavigationDeferred'} as const;
12+
13+
function SearchWithNavigationDeferredMount(props: ComponentProps<typeof Search>) {
14+
const styles = useThemeStyles();
15+
const {shouldUseNarrowLayout} = useResponsiveLayout();
16+
const containerStyle = shouldUseNarrowLayout ? styles.searchListContentContainerStyles(!!props.hasFilterBars) : styles.mt3;
17+
18+
return (
19+
<NavigationDeferredMount
20+
waitForUpcomingTransition={false}
21+
placeholder={
22+
<SearchRowSkeleton
23+
shouldAnimate
24+
onLayout={() => endSpanWithAttributes(CONST.TELEMETRY.SPAN_NAVIGATE_TO_REPORTS, {[CONST.TELEMETRY.ATTRIBUTE_IS_WARM]: true})}
25+
containerStyle={containerStyle}
26+
reasonAttributes={REASON_ATTRIBUTES}
27+
/>
28+
}
29+
>
30+
<Search {...props} />
31+
</NavigationDeferredMount>
32+
);
33+
}
34+
35+
export default SearchWithNavigationDeferredMount;

src/pages/Search/SearchPageNarrow/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {useSearchResultsContext, useSearchSelectionActions} from '@components/Se
1717
import SearchLoadingSkeleton from '@components/Search/SearchLoadingSkeleton';
1818
import SearchPageFooter from '@components/Search/SearchPageFooter';
1919
import SearchPageHeaderNarrow from '@components/Search/SearchPageHeader/SearchPageHeaderNarrow';
20+
import SearchWithNavigationDeferredMount from '@components/Search/SearchWithNavigationDeferredMount';
2021
import type {SearchParams, SearchQueryJSON} from '@components/Search/types';
2122
import useAndroidBackButtonHandler from '@hooks/useAndroidBackButtonHandler';
2223
import useEndSubmitNavigationSpans from '@hooks/useEndSubmitNavigationSpans';
@@ -398,7 +399,7 @@ function SearchPageNarrow({
398399
}}
399400
/>
400401
) : (
401-
<Search
402+
<SearchWithNavigationDeferredMount
402403
searchResults={searchResults}
403404
queryJSON={queryJSON}
404405
key={queryJSON.hash}

src/pages/Search/SearchPageWide.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView
66
import ReceiptScanDropZone from '@components/ReceiptScanDropZone';
77
import ScreenWrapper from '@components/ScreenWrapper';
88
import {ScrollOffsetContext} from '@components/ScrollOffsetContextProvider';
9-
import Search from '@components/Search';
109
import {useSearchResultsContext} from '@components/Search/SearchContext';
1110
import SearchLoadingSkeleton from '@components/Search/SearchLoadingSkeleton';
1211
import SearchPageFooter from '@components/Search/SearchPageFooter';
1312
import SearchActionsBarWide from '@components/Search/SearchPageHeader/SearchActionsBarWide';
1413
import SearchPageHeaderWide from '@components/Search/SearchPageHeader/SearchPageHeaderWide';
14+
import SearchWithNavigationDeferredMount from '@components/Search/SearchWithNavigationDeferredMount';
1515
import type {SearchParams, SearchQueryJSON} from '@components/Search/types';
1616
import useEndSubmitNavigationSpans from '@hooks/useEndSubmitNavigationSpans';
1717
import useNetwork from '@hooks/useNetwork';
@@ -131,7 +131,7 @@ function SearchPageWide({
131131
}}
132132
/>
133133
) : (
134-
<Search
134+
<SearchWithNavigationDeferredMount
135135
key={queryJSON.hash}
136136
queryJSON={queryJSON}
137137
searchResults={searchResults}

0 commit comments

Comments
 (0)