Skip to content

Commit 1408a2d

Browse files
committed
feat: native-stack (initial changes)
1 parent 19b489c commit 1408a2d

File tree

261 files changed

+1000
-1288
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

261 files changed

+1000
-1288
lines changed

src/components/ReportActionItem/MoneyRequestPreview/MoneyRequestPreviewContent.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import type {RouteProp} from '@react-navigation/native';
21
import {useRoute} from '@react-navigation/native';
32
import lodashSortBy from 'lodash/sortBy';
43
import truncate from 'lodash/truncate';
@@ -29,6 +28,7 @@ import * as CurrencyUtils from '@libs/CurrencyUtils';
2928
import * as DeviceCapabilities from '@libs/DeviceCapabilities';
3029
import * as IOUUtils from '@libs/IOUUtils';
3130
import Navigation from '@libs/Navigation/Navigation';
31+
import type {PlatformStackRouteProp} from '@libs/Navigation/PlatformStackNavigation/types';
3232
import type {TransactionDuplicateNavigatorParamList} from '@libs/Navigation/types';
3333
import * as OptionsListUtils from '@libs/OptionsListUtils';
3434
import * as ReceiptUtils from '@libs/ReceiptUtils';
@@ -70,7 +70,7 @@ function MoneyRequestPreviewContent({
7070
const StyleUtils = useStyleUtils();
7171
const {translate} = useLocalize();
7272
const {windowWidth} = useWindowDimensions();
73-
const route = useRoute<RouteProp<TransactionDuplicateNavigatorParamList, typeof SCREENS.TRANSACTION_DUPLICATE.REVIEW>>();
73+
const route = useRoute<PlatformStackRouteProp<TransactionDuplicateNavigatorParamList, typeof SCREENS.TRANSACTION_DUPLICATE.REVIEW>>();
7474
const {shouldUseNarrowLayout} = useResponsiveLayout();
7575
const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST);
7676
const [chatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${chatReportID || '-1'}`);

src/components/ScreenWrapper.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import {useIsFocused, useNavigation} from '@react-navigation/native';
2-
import type {StackNavigationProp} from '@react-navigation/stack';
32
import type {ForwardedRef, ReactNode} from 'react';
43
import React, {createContext, forwardRef, useEffect, useMemo, useRef, useState} from 'react';
54
import type {StyleProp, ViewStyle} from 'react-native';
@@ -15,6 +14,7 @@ import useTackInputFocus from '@hooks/useTackInputFocus';
1514
import useThemeStyles from '@hooks/useThemeStyles';
1615
import useWindowDimensions from '@hooks/useWindowDimensions';
1716
import * as Browser from '@libs/Browser';
17+
import type {PlatformStackNavigationProp} from '@libs/Navigation/PlatformStackNavigation/types';
1818
import type {AuthScreensParamList, RootStackParamList} from '@libs/Navigation/types';
1919
import toggleTestToolsModal from '@userActions/TestTool';
2020
import CONST from '@src/CONST';
@@ -97,7 +97,7 @@ type ScreenWrapperProps = {
9797
*
9898
* This is required because transitionEnd event doesn't trigger in the testing environment.
9999
*/
100-
navigation?: StackNavigationProp<RootStackParamList> | StackNavigationProp<AuthScreensParamList>;
100+
navigation?: PlatformStackNavigationProp<RootStackParamList> | PlatformStackNavigationProp<AuthScreensParamList>;
101101

102102
/** Whether to show offline indicator on wide screens */
103103
shouldShowOfflineIndicatorInWideScreen?: boolean;
@@ -142,7 +142,7 @@ function ScreenWrapper(
142142
* so in other places where ScreenWrapper is used, we need to
143143
* fallback to useNavigation.
144144
*/
145-
const navigationFallback = useNavigation<StackNavigationProp<RootStackParamList>>();
145+
const navigationFallback = useNavigation<PlatformStackNavigationProp<RootStackParamList>>();
146146
const navigation = navigationProp ?? navigationFallback;
147147
const isFocused = useIsFocused();
148148
const {windowHeight} = useWindowDimensions(shouldUseCachedViewportHeight);

src/components/ScrollOffsetContextProvider.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import type {ParamListBase, RouteProp} from '@react-navigation/native';
1+
import type {ParamListBase} from '@react-navigation/native';
22
import React, {createContext, useCallback, useEffect, useMemo, useRef} from 'react';
33
import {withOnyx} from 'react-native-onyx';
44
import usePrevious from '@hooks/usePrevious';
5+
import type {PlatformStackRouteProp} from '@libs/Navigation/PlatformStackNavigation/types';
56
import type {NavigationPartialRoute, State} from '@libs/Navigation/types';
67
import NAVIGATORS from '@src/NAVIGATORS';
78
import ONYXKEYS from '@src/ONYXKEYS';
@@ -10,10 +11,10 @@ import type {PriorityMode} from '@src/types/onyx';
1011

1112
type ScrollOffsetContextValue = {
1213
/** Save scroll offset of flashlist on given screen */
13-
saveScrollOffset: (route: RouteProp<ParamListBase>, scrollOffset: number) => void;
14+
saveScrollOffset: (route: PlatformStackRouteProp<ParamListBase>, scrollOffset: number) => void;
1415

1516
/** Get scroll offset value for given screen */
16-
getScrollOffset: (route: RouteProp<ParamListBase>) => number | undefined;
17+
getScrollOffset: (route: PlatformStackRouteProp<ParamListBase>) => number | undefined;
1718

1819
/** Clean scroll offsets of screen that aren't anymore in the state */
1920
cleanStaleScrollOffsets: (state: State) => void;
@@ -38,7 +39,7 @@ const defaultValue: ScrollOffsetContextValue = {
3839
const ScrollOffsetContext = createContext<ScrollOffsetContextValue>(defaultValue);
3940

4041
/** This function is prepared to work with HOME screens. May need modification if we want to handle other types of screens. */
41-
function getKey(route: RouteProp<ParamListBase> | NavigationPartialRoute): string {
42+
function getKey(route: PlatformStackRouteProp<ParamListBase> | NavigationPartialRoute): string {
4243
if (route.params && 'policyID' in route.params && typeof route.params.policyID === 'string') {
4344
return `${route.name}-${route.params.policyID}`;
4445
}

src/components/Search/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import {useNavigation} from '@react-navigation/native';
2-
import type {StackNavigationProp} from '@react-navigation/stack';
32
import React, {useCallback, useEffect, useRef, useState} from 'react';
43
import {View} from 'react-native';
54
import type {NativeScrollEvent, NativeSyntheticEvent, StyleProp, ViewStyle} from 'react-native';
@@ -21,6 +20,7 @@ import * as SearchActions from '@libs/actions/Search';
2120
import * as DeviceCapabilities from '@libs/DeviceCapabilities';
2221
import Log from '@libs/Log';
2322
import memoize from '@libs/memoize';
23+
import type {PlatformStackNavigationProp} from '@libs/Navigation/PlatformStackNavigation/types';
2424
import * as ReportUtils from '@libs/ReportUtils';
2525
import * as SearchUtils from '@libs/SearchUtils';
2626
import Navigation from '@navigation/Navigation';
@@ -89,7 +89,7 @@ function Search({queryJSON, onSearchListScroll, contentContainerStyle}: SearchPr
8989
const {shouldUseNarrowLayout} = useResponsiveLayout();
9090
const styles = useThemeStyles();
9191
const {isSmallScreenWidth, isLargeScreenWidth} = useResponsiveLayout();
92-
const navigation = useNavigation<StackNavigationProp<AuthScreensParamList>>();
92+
const navigation = useNavigation<PlatformStackNavigationProp<AuthScreensParamList>>();
9393
const lastSearchResultsRef = useRef<OnyxEntry<SearchResults>>();
9494
const {setCurrentSearchHash, setSelectedTransactions, selectedTransactions, clearSelectedTransactions, setShouldShowStatusBarLoading, lastSearchType, setLastSearchType} =
9595
useSearchContext();

src/components/withNavigationTransitionEnd.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
import {useNavigation} from '@react-navigation/native';
2-
import type {StackNavigationProp} from '@react-navigation/stack';
32
import type {ComponentType, ForwardedRef, RefAttributes} from 'react';
43
import React, {useEffect, useState} from 'react';
54
import getComponentDisplayName from '@libs/getComponentDisplayName';
5+
import type {PlatformStackNavigationProp} from '@libs/Navigation/PlatformStackNavigation/types';
66
import type {RootStackParamList} from '@libs/Navigation/types';
77

88
type WithNavigationTransitionEndProps = {didScreenTransitionEnd: boolean};
99

1010
export default function <TProps, TRef>(WrappedComponent: ComponentType<TProps & RefAttributes<TRef>>): React.ComponentType<TProps & RefAttributes<TRef>> {
1111
function WithNavigationTransitionEnd(props: TProps, ref: ForwardedRef<TRef>) {
1212
const [didScreenTransitionEnd, setDidScreenTransitionEnd] = useState(false);
13-
const navigation = useNavigation<StackNavigationProp<RootStackParamList>>();
13+
const navigation = useNavigation<PlatformStackNavigationProp<RootStackParamList>>();
1414

1515
useEffect(() => {
1616
const unsubscribeTransitionEnd = navigation.addListener('transitionEnd', () => {

src/libs/Navigation/AppNavigator/AuthScreens.tsx

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, {memo, useEffect, useMemo, useRef, useState} from 'react';
1+
import React, {memo, useEffect, useRef, useState} from 'react';
22
import {View} from 'react-native';
33
import type {OnyxEntry} from 'react-native-onyx';
44
import Onyx, {withOnyx} from 'react-native-onyx';
@@ -13,14 +13,13 @@ import useActiveWorkspace from '@hooks/useActiveWorkspace';
1313
import useOnboardingFlowRouter from '@hooks/useOnboardingFlow';
1414
import usePermissions from '@hooks/usePermissions';
1515
import useResponsiveLayout from '@hooks/useResponsiveLayout';
16-
import useStyleUtils from '@hooks/useStyleUtils';
1716
import useThemeStyles from '@hooks/useThemeStyles';
17+
import * as Welcome from '@libs/actions/Welcome';
1818
import {READ_COMMANDS} from '@libs/API/types';
1919
import HttpUtils from '@libs/HttpUtils';
2020
import KeyboardShortcut from '@libs/KeyboardShortcut';
2121
import Log from '@libs/Log';
2222
import getCurrentUrl from '@libs/Navigation/currentUrl';
23-
import getOnboardingModalScreenOptions from '@libs/Navigation/getOnboardingModalScreenOptions';
2423
import Navigation from '@libs/Navigation/Navigation';
2524
import shouldOpenOnAdminRoom from '@libs/Navigation/shouldOpenOnAdminRoom';
2625
import type {AuthScreensParamList, CentralPaneName, CentralPaneScreensParamList} from '@libs/Navigation/types';
@@ -56,9 +55,8 @@ import {isEmptyObject} from '@src/types/utils/EmptyObject';
5655
import type ReactComponentModule from '@src/types/utils/ReactComponentModule';
5756
import beforeRemoveReportOpenedFromSearchRHP from './beforeRemoveReportOpenedFromSearchRHP';
5857
import CENTRAL_PANE_SCREENS from './CENTRAL_PANE_SCREENS';
59-
import createCustomStackNavigator from './createCustomStackNavigator';
58+
import createResponsiveStackNavigator from './createResponsiveStackNavigator';
6059
import defaultScreenOptions from './defaultScreenOptions';
61-
import getRootNavigatorScreenOptions from './getRootNavigatorScreenOptions';
6260
import BottomTabNavigator from './Navigators/BottomTabNavigator';
6361
import ExplanationModalNavigator from './Navigators/ExplanationModalNavigator';
6462
import FeatureTrainingModalNavigator from './Navigators/FeatureTrainingModalNavigator';
@@ -67,6 +65,7 @@ import LeftModalNavigator from './Navigators/LeftModalNavigator';
6765
import OnboardingModalNavigator from './Navigators/OnboardingModalNavigator';
6866
import RightModalNavigator from './Navigators/RightModalNavigator';
6967
import WelcomeVideoModalNavigator from './Navigators/WelcomeVideoModalNavigator';
68+
import useRootNavigatorOptions from './useRootNavigatorOptions';
7069

7170
type AuthScreensProps = {
7271
/** Session of currently logged in user */
@@ -194,7 +193,7 @@ function handleNetworkReconnect() {
194193
}
195194
}
196195

197-
const RootStack = createCustomStackNavigator<AuthScreensParamList>();
196+
const RootStack = createResponsiveStackNavigator<AuthScreensParamList>();
198197
// We want to delay the re-rendering for components(e.g. ReportActionCompose)
199198
// that depends on modal visibility until Modal is completely closed and its focused
200199
// When modal screen is focused, update modal visibility in Onyx
@@ -224,18 +223,12 @@ const modalScreenListenersWithCancelSearch = {
224223

225224
function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDAppliedToClient}: AuthScreensProps) {
226225
const styles = useThemeStyles();
227-
const StyleUtils = useStyleUtils();
228-
const {shouldUseNarrowLayout, onboardingIsMediumOrLargerScreenWidth, isSmallScreenWidth} = useResponsiveLayout();
229-
const screenOptions = getRootNavigatorScreenOptions(shouldUseNarrowLayout, styles, StyleUtils);
226+
const {shouldUseNarrowLayout} = useResponsiveLayout();
227+
const rootNavigatorOptions = useRootNavigatorOptions();
230228
const {canUseDefaultRooms} = usePermissions();
231229
const {activeWorkspaceID} = useActiveWorkspace();
232230
const {toggleSearchRouter} = useSearchRouterContext();
233231

234-
const onboardingModalScreenOptions = useMemo(() => screenOptions.onboardingModalNavigator(onboardingIsMediumOrLargerScreenWidth), [screenOptions, onboardingIsMediumOrLargerScreenWidth]);
235-
const onboardingScreenOptions = useMemo(
236-
() => getOnboardingModalScreenOptions(shouldUseNarrowLayout, styles, StyleUtils, onboardingIsMediumOrLargerScreenWidth),
237-
[StyleUtils, shouldUseNarrowLayout, onboardingIsMediumOrLargerScreenWidth, styles],
238-
);
239232
const modal = useRef<OnyxTypes.Modal>({});
240233
const [didPusherInit, setDidPusherInit] = useState(false);
241234
const {isOnboardingCompleted} = useOnboardingFlowRouter();
@@ -409,19 +402,16 @@ function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDApplie
409402
return (
410403
<ComposeProviders components={[OptionsListContextProvider, SearchContextProvider]}>
411404
<View style={styles.rootNavigatorContainerStyles(shouldUseNarrowLayout)}>
412-
<RootStack.Navigator
413-
screenOptions={screenOptions.centralPaneNavigator}
414-
isSmallScreenWidth={isSmallScreenWidth}
415-
>
405+
<RootStack.Navigator screenOptions={rootNavigatorOptions.centralPaneNavigator}>
416406
<RootStack.Screen
417407
name={NAVIGATORS.BOTTOM_TAB_NAVIGATOR}
418-
options={screenOptions.bottomTab}
408+
options={rootNavigatorOptions.bottomTab}
419409
component={BottomTabNavigator}
420410
/>
421411
<RootStack.Screen
422412
name={SCREENS.VALIDATE_LOGIN}
423413
options={{
424-
...screenOptions.fullScreen,
414+
...rootNavigatorOptions.fullScreen,
425415
headerShown: false,
426416
title: 'New Expensify',
427417
}}
@@ -461,6 +451,7 @@ function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDApplie
461451
options={{
462452
headerShown: false,
463453
presentation: 'transparentModal',
454+
animation: 'none',
464455
}}
465456
getComponent={loadProfileAvatar}
466457
listeners={modalScreenListeners}
@@ -485,51 +476,51 @@ function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDApplie
485476
/>
486477
<RootStack.Screen
487478
name={SCREENS.NOT_FOUND}
488-
options={screenOptions.fullScreen}
479+
options={rootNavigatorOptions.fullScreen}
489480
component={NotFoundPage}
490481
/>
491482
<RootStack.Screen
492483
name={NAVIGATORS.RIGHT_MODAL_NAVIGATOR}
493-
options={screenOptions.rightModalNavigator}
484+
options={rootNavigatorOptions.rightModalNavigator}
494485
component={RightModalNavigator}
495486
listeners={modalScreenListenersWithCancelSearch}
496487
/>
497488
<RootStack.Screen
498489
name={NAVIGATORS.FULL_SCREEN_NAVIGATOR}
499-
options={screenOptions.fullScreen}
490+
options={rootNavigatorOptions.fullScreen}
500491
component={FullScreenNavigator}
501492
/>
502493
<RootStack.Screen
503494
name={NAVIGATORS.LEFT_MODAL_NAVIGATOR}
504-
options={screenOptions.leftModalNavigator}
495+
options={rootNavigatorOptions.leftModalNavigator}
505496
component={LeftModalNavigator}
506497
listeners={modalScreenListeners}
507498
/>
508499
<RootStack.Screen
509500
name={SCREENS.DESKTOP_SIGN_IN_REDIRECT}
510-
options={screenOptions.fullScreen}
501+
options={rootNavigatorOptions.fullScreen}
511502
component={DesktopSignInRedirectPage}
512503
/>
513504
<RootStack.Screen
514505
name={NAVIGATORS.EXPLANATION_MODAL_NAVIGATOR}
515-
options={onboardingModalScreenOptions}
506+
options={rootNavigatorOptions.onboardingModalNavigator}
516507
component={ExplanationModalNavigator}
517508
/>
518509
<RootStack.Screen
519510
name={NAVIGATORS.FEATURE_TRANING_MODAL_NAVIGATOR}
520-
options={onboardingModalScreenOptions}
511+
options={rootNavigatorOptions.onboardingModalNavigator}
521512
component={FeatureTrainingModalNavigator}
522513
listeners={modalScreenListeners}
523514
/>
524515
<RootStack.Screen
525516
name={NAVIGATORS.WELCOME_VIDEO_MODAL_NAVIGATOR}
526-
options={onboardingModalScreenOptions}
517+
options={rootNavigatorOptions.onboardingModalNavigator}
527518
component={WelcomeVideoModalNavigator}
528519
/>
529520
{isOnboardingCompleted === false && (
530521
<RootStack.Screen
531522
name={NAVIGATORS.ONBOARDING_MODAL_NAVIGATOR}
532-
options={onboardingScreenOptions}
523+
options={rootNavigatorOptions.onboardingModalNavigator}
533524
component={OnboardingModalNavigator}
534525
listeners={{
535526
focus: () => {
@@ -559,7 +550,7 @@ function AuthScreens({session, lastOpenedPublicRoomID, initialLastUpdateIDApplie
559550
/>
560551
<RootStack.Screen
561552
name={SCREENS.CONNECTION_COMPLETE}
562-
options={screenOptions.fullScreen}
553+
options={defaultScreenOptions}
563554
component={ConnectionCompletePage}
564555
/>
565556
{Object.entries(CENTRAL_PANE_SCREENS).map(([screenName, componentGetter]) => {

src/libs/Navigation/AppNavigator/ModalNavigatorScreenOptions.ts

Lines changed: 0 additions & 19 deletions
This file was deleted.

0 commit comments

Comments
 (0)