Skip to content

Commit d5e24b3

Browse files
maximcodingclaude
andcommitted
refactor(nav): migrate to static config (React Navigation 7)
Replace JSX-based dynamic config with static config objects: - Inline all thin stack wrappers (auth, onboarding, settings, home-tabs) into a single root-navigator.tsx using createNativeStackNavigator({screens}) - Replace NavigationContainer + AppLayout with createStaticNavigation(RootStack) - Add useT() to AnimatedTabBar for label derivation — no more tabBarLabel prop needed in tab screen options - Remove dead routes: HOME_STACK, HOME_TABS, SETTINGS_ROOT/LANGUAGE/THEME - Delete 6 files: auth-stack, onboarding-stack, settings-stack, home-stack, home-tabs, AppLayout - Delete 3 dead feature param-list directories (types now inferred by RN) Zero type errors, 41 tests pass. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent b798a5e commit d5e24b3

File tree

15 files changed

+52
-264
lines changed

15 files changed

+52
-264
lines changed

App.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ export default function App() {
3737
// Android: exit app from root-level leaves (main tabs, login, onboarding).
3838
useBackButtonHandler(
3939
routeName =>
40-
routeName === ROUTES.HOME_TABS ||
4140
routeName === ROUTES.TAB_HOME ||
4241
routeName === ROUTES.TAB_SETTINGS ||
4342
routeName === ROUTES.AUTH_LOGIN ||

src/features/auth/navigation/param-list.ts

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

src/features/home/navigation/param-list.ts

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

src/features/settings/navigation/param-list.ts

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

src/navigation/AppLayout.tsx

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

src/navigation/NavigationRoot.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
import type { NavigationState, PartialState } from '@react-navigation/native'
22
import {
3+
createStaticNavigation,
34
DarkTheme,
45
DefaultTheme,
5-
NavigationContainer,
66
} from '@react-navigation/native'
77
import React, { useCallback, useEffect, useMemo, useState } from 'react'
88
import { Linking, Platform, useColorScheme } from 'react-native'
99
import BootSplash from 'react-native-bootsplash'
1010

11-
import AppLayout from '@/navigation/AppLayout'
1211
import { navigationRef } from '@/navigation/helpers/navigation-helpers'
12+
import { RootStack } from '@/navigation/root/root-navigator'
1313
import {
1414
loadPersistedNavigationState,
1515
persistNavigationState,
1616
} from '@/navigation/persistence/navigation-persistence'
1717
import { ThemedStatusBar } from '@/shared/components/ui/ThemedStatusBar'
1818
import { useTheme } from '@/shared/theme'
1919

20+
const Navigation = createStaticNavigation(RootStack)
21+
2022
/**
2123
* Navigation + StatusBar wired to app theme (inside ThemeProvider).
2224
* Persists root navigation state to MMKV unless a cold-start deep link is present.
@@ -92,15 +94,13 @@ export function NavigationRoot() {
9294
return (
9395
<>
9496
<ThemedStatusBar />
95-
<NavigationContainer
97+
<Navigation
9698
ref={navigationRef}
9799
theme={navigationTheme}
98100
initialState={initialState}
99101
onStateChange={onStateChange}
100102
onReady={() => BootSplash.hide({ fade: true })}
101-
>
102-
<AppLayout />
103-
</NavigationContainer>
103+
/>
104104
</>
105105
)
106106
}

src/navigation/index.ts

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,5 @@
1-
export type { AuthStackParamList } from '@/features/auth/navigation/param-list'
2-
export type {
3-
HomeStackParamList,
4-
HomeTabsParamList,
5-
} from '@/features/home/navigation/param-list'
6-
export type {
7-
OnboardingStackParamList,
8-
SettingsStackParamList,
9-
} from '@/features/settings/navigation/param-list'
10-
export type { RootStackParamList } from '@/navigation/root-param-list'
1+
export type { RootStackParamList, StoryScreenParams } from '@/navigation/root-param-list'
112
export * from './helpers/navigation-helpers'
123
export * from './modals/global-modal'
134
export * from './modals/half-sheet'
145
export * from './root/root-navigator'
15-
export * from './stacks/auth-stack'
16-
export * from './stacks/home-stack'
17-
export * from './stacks/onboarding-stack'
18-
export * from './tabs/home-tabs'
Lines changed: 34 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,49 @@
1-
/**
2-
* FILE: root-navigator.tsx
3-
* LAYER: navigation/root
4-
*/
1+
// src/navigation/root/root-navigator.tsx
52

3+
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'
64
import { createNativeStackNavigator } from '@react-navigation/native-stack'
75
import React from 'react'
6+
import AuthScreen from '@/features/auth/screens/AuthScreen'
7+
import HomeScreen from '@/features/home/screens/HomeScreen'
88
import StoryScreen from '@/features/home/screens/StoryScreen'
99
import LanguagePickerModal from '@/features/settings/screens/LanguagePickerModal'
10+
import OnboardingScreen from '@/features/settings/screens/OnboardingScreen'
11+
import SettingsScreen from '@/features/settings/screens/SettingsScreen'
1012
import ThemePickerModal from '@/features/settings/screens/ThemePickerModal'
11-
import { RootStackParamList } from '@/navigation'
1213
import { ROUTES } from '@/navigation/routes'
13-
import AuthStack from '@/navigation/stacks/auth-stack'
14-
import OnboardingStack from '@/navigation/stacks/onboarding-stack'
15-
import HomeTabs from '@/navigation/tabs/home-tabs'
16-
17-
import { useBootstrapRoute } from '@/session/useBootstrapRoute'
18-
19-
const Stack = createNativeStackNavigator<RootStackParamList>()
14+
import { AnimatedTabBar } from '@/navigation/tabs/AnimatedTabBar'
15+
import { getBootstrapRoute } from '@/session/bootstrap'
2016

2117
const HALF_SHEET_OPTIONS = {
2218
presentation: 'transparentModal',
2319
animation: 'none',
2420
gestureEnabled: false,
2521
} as const
2622

27-
export default function RootNavigator() {
28-
const boot = useBootstrapRoute()
23+
const HomeTabs = createBottomTabNavigator({
24+
tabBar: (props) => <AnimatedTabBar {...props} />,
25+
screenOptions: { headerShown: false },
26+
screens: {
27+
[ROUTES.TAB_HOME]: HomeScreen,
28+
[ROUTES.TAB_SETTINGS]: SettingsScreen,
29+
},
30+
})
2931

30-
return (
31-
<Stack.Navigator
32-
initialRouteName={boot}
33-
screenOptions={{ headerShown: false }}
34-
>
35-
<Stack.Screen name={ROUTES.ROOT_ONBOARDING} component={OnboardingStack} />
36-
<Stack.Screen name={ROUTES.ROOT_AUTH} component={AuthStack} />
37-
<Stack.Screen name={ROUTES.ROOT_APP} component={HomeTabs} />
38-
<Stack.Screen
39-
name={ROUTES.HOME_STORY}
40-
component={StoryScreen}
41-
options={{ headerShown: false }}
42-
/>
43-
<Stack.Screen
44-
name={ROUTES.MODAL_THEME_PICKER}
45-
component={ThemePickerModal}
46-
options={HALF_SHEET_OPTIONS}
47-
/>
48-
<Stack.Screen
49-
name={ROUTES.MODAL_LANGUAGE_PICKER}
50-
component={LanguagePickerModal}
51-
options={HALF_SHEET_OPTIONS}
52-
/>
53-
</Stack.Navigator>
54-
)
55-
}
32+
export const RootStack = createNativeStackNavigator({
33+
initialRouteName: getBootstrapRoute(),
34+
screenOptions: { headerShown: false },
35+
screens: {
36+
[ROUTES.ROOT_ONBOARDING]: OnboardingScreen,
37+
[ROUTES.ROOT_AUTH]: AuthScreen,
38+
[ROUTES.ROOT_APP]: HomeTabs,
39+
[ROUTES.HOME_STORY]: StoryScreen,
40+
[ROUTES.MODAL_THEME_PICKER]: {
41+
screen: ThemePickerModal,
42+
options: HALF_SHEET_OPTIONS,
43+
},
44+
[ROUTES.MODAL_LANGUAGE_PICKER]: {
45+
screen: LanguagePickerModal,
46+
options: HALF_SHEET_OPTIONS,
47+
},
48+
},
49+
})

src/navigation/routes.ts

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,25 +28,12 @@ export const ROUTES = {
2828
//
2929
AUTH_LOGIN: 'AUTH_LOGIN',
3030

31-
//
32-
// HOME FLOW
33-
//
34-
HOME_STACK: 'HOME_STACK', // parent stack
35-
HOME_TABS: 'HOME_TABS', // bottom tabs container
36-
3731
//
3832
// HOME → TABS
3933
//
4034
TAB_HOME: 'TAB_HOME',
4135
TAB_SETTINGS: 'TAB_SETTINGS',
4236

43-
//
44-
// SETTINGS STACK
45-
//
46-
SETTINGS_ROOT: 'SETTINGS_ROOT',
47-
SETTINGS_LANGUAGE: 'SETTINGS_LANGUAGE',
48-
SETTINGS_THEME: 'SETTINGS_THEME',
49-
5037
//
5138
// HOME SCREENS (pushed over tabs)
5239
//

src/navigation/stacks/auth-stack.tsx

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

0 commit comments

Comments
 (0)