11import type { ParamListBase } from '@react-navigation/native' ;
2- import { findFocusedRoute } from '@react-navigation/native' ;
32import React , { createContext , useCallback , useEffect , useMemo , useRef } from 'react' ;
43import useOnyx from '@hooks/useOnyx' ;
54import usePrevious from '@hooks/usePrevious' ;
@@ -41,21 +40,11 @@ const defaultValue: ScrollOffsetContextValue = {
4140
4241const ScrollOffsetContext = createContext < ScrollOffsetContextValue > ( defaultValue ) ;
4342
44- /** This function is prepared to work with HOME and SEARCH screens. */
43+ /** This function is prepared to work with HOME screens. May need modification if we want to handle other types of screens. */
4544function getKey ( route : PlatformStackRouteProp < ParamListBase > | NavigationPartialRoute ) : string {
46- // Handle routes with direct policyID parameter (HOME screens)
4745 if ( route . params && 'policyID' in route . params && typeof route . params . policyID === 'string' ) {
4846 return `${ route . name } -${ route . params . policyID } ` ;
4947 }
50-
51- // Handle SEARCH screens with query parameters
52- if ( route . name === SCREENS . SEARCH . ROOT && route . params && 'q' in route . params && typeof route . params . q === 'string' ) {
53- // Encode the query to handle spaces and special characters
54- const encodedQuery = encodeURIComponent ( route . params . q ) ;
55- return `${ route . name } -${ encodedQuery } ` ;
56- }
57-
58- // For other routes, just use route name
5948 return `${ route . name } -global` ;
6049}
6150
@@ -69,9 +58,9 @@ function ScrollOffsetContextProvider({children}: ScrollOffsetContextProviderProp
6958 return ;
7059 }
7160
72- // If the priority mode changes, we need to clear the scroll offsets for the home and search screens because it affects the size of the elements and scroll positions wouldn't be correct.
61+ // If the priority mode changes, we need to clear the scroll offsets for the home screens because it affects the size of the elements and scroll positions wouldn't be correct.
7362 for ( const key of Object . keys ( scrollOffsetsRef . current ) ) {
74- if ( key . includes ( SCREENS . HOME ) || key . includes ( SCREENS . SEARCH . ROOT ) ) {
63+ if ( key . includes ( SCREENS . HOME ) ) {
7564 delete scrollOffsetsRef . current [ key ] ;
7665 }
7766 }
@@ -88,39 +77,16 @@ function ScrollOffsetContextProvider({children}: ScrollOffsetContextProviderProp
8877 return scrollOffsetsRef . current [ getKey ( route ) ] ;
8978 } , [ ] ) ;
9079
91- const cleanScrollOffsets = useCallback ( ( keys : string [ ] , shouldDelete : ( key : string ) => boolean ) => {
92- keys . forEach ( ( key ) => {
93- if ( ! shouldDelete ( key ) ) {
94- return ;
80+ const cleanStaleScrollOffsets : ScrollOffsetContextValue [ 'cleanStaleScrollOffsets' ] = useCallback ( ( state ) => {
81+ const sidebarRoutes = state . routes . filter ( ( route ) => isSidebarScreenName ( route . name ) ) ;
82+ const scrollOffsetKeysOfExistingScreens = sidebarRoutes . map ( ( route ) => getKey ( route ) ) ;
83+ for ( const key of Object . keys ( scrollOffsetsRef . current ) ) {
84+ if ( ! scrollOffsetKeysOfExistingScreens . includes ( key ) ) {
85+ delete scrollOffsetsRef . current [ key ] ;
9586 }
96-
97- delete scrollOffsetsRef . current [ key ] ;
98- } ) ;
87+ }
9988 } , [ ] ) ;
10089
101- const cleanStaleScrollOffsets : ScrollOffsetContextValue [ 'cleanStaleScrollOffsets' ] = useCallback (
102- ( state ) => {
103- const sidebarRoutes = state . routes . filter ( ( route ) => isSidebarScreenName ( route . name ) ) ;
104- const existingScreenKeys = sidebarRoutes . map ( getKey ) ;
105-
106- const focusedRoute = findFocusedRoute ( state ) ;
107- const routeName = focusedRoute ?. name ;
108-
109- const isSearchScreen = routeName === SCREENS . SEARCH . ROOT ;
110- const isSearchMoneyRequestReport = routeName === SCREENS . SEARCH . MONEY_REQUEST_REPORT || routeName === SCREENS . SEARCH . REPORT_RHP ;
111-
112- const scrollOffsetKeys = Object . keys ( scrollOffsetsRef . current ) ;
113-
114- if ( isSearchScreen || isSearchMoneyRequestReport ) {
115- const currentKey = focusedRoute ? getKey ( focusedRoute ) : null ;
116- cleanScrollOffsets ( scrollOffsetKeys , ( key ) => key . startsWith ( SCREENS . SEARCH . ROOT ) && key !== currentKey && ! isSearchMoneyRequestReport ) ;
117- return ;
118- }
119- cleanScrollOffsets ( scrollOffsetKeys , ( key ) => ! existingScreenKeys . includes ( key ) ) ;
120- } ,
121- [ cleanScrollOffsets ] ,
122- ) ;
123-
12490 const saveScrollIndex : ScrollOffsetContextValue [ 'saveScrollIndex' ] = useCallback ( ( route , scrollIndex ) => {
12591 scrollOffsetsRef . current [ getKey ( route ) ] = scrollIndex ;
12692 } , [ ] ) ;
@@ -129,7 +95,6 @@ function ScrollOffsetContextProvider({children}: ScrollOffsetContextProviderProp
12995 if ( ! scrollOffsetsRef . current ) {
13096 return ;
13197 }
132-
13398 return scrollOffsetsRef . current [ getKey ( route ) ] ;
13499 } , [ ] ) ;
135100
0 commit comments