Files
RN_Template/RN_TEMPLATE/app/navigators/AppNavigator.tsx

104 lines
4.0 KiB
TypeScript
Raw Normal View History

2026-02-05 13:16:05 +08:00
/**
* The app navigator (formerly "AppNavigator" and "MainNavigator") is used for the primary
* navigation flows of your app.
* Generally speaking, it will contain an auth flow (registration, login, forgot password)
* and a "main" flow which the user will use once logged in.
*/
import { NavigationContainer } from "@react-navigation/native"
import { createNativeStackNavigator } from "@react-navigation/native-stack"
import Config from "@/config"
import { useAuth } from "@/context/AuthContext"
import { AboutScreen } from "@/screens/AboutScreen"
import { AuthWelcomeScreen } from "@/screens/AuthWelcomeScreen"
import { ChangeEmailScreen } from "@/screens/ChangeEmailScreen"
import { ChangePasswordScreen } from "@/screens/ChangePasswordScreen"
import { ErrorBoundary } from "@/screens/ErrorScreen/ErrorBoundary"
import { ForgotPasswordScreen } from "@/screens/ForgotPasswordScreen"
import { LanguageScreen } from "@/screens/LanguageScreen"
import { LoginScreen } from "@/screens/LoginScreen"
import { ProfileScreen } from "@/screens/ProfileScreen"
import { RegisterScreen } from "@/screens/RegisterScreen"
import { SecurityScreen } from "@/screens/SecurityScreen"
import { SessionManagementScreen } from "@/screens/SessionManagementScreen"
import { SettingsScreen } from "@/screens/SettingsScreen"
import { ThemeScreen } from "@/screens/ThemeScreen"
import { WelcomeScreen } from "@/screens/WelcomeScreen"
import { useAppTheme } from "@/theme/context"
import { MainNavigator } from "./MainNavigator"
import type { AppStackParamList, NavigationProps } from "./navigationTypes"
import { navigationRef, useBackButtonHandler } from "./navigationUtilities"
/**
* This is a list of all the route names that will exit the app if the back button
* is pressed while in that screen. Only affects Android.
*/
const exitRoutes = Config.exitRoutes
// Documentation: https://reactnavigation.org/docs/stack-navigator/
const Stack = createNativeStackNavigator<AppStackParamList>()
const AppStack = () => {
const { isAuthenticated } = useAuth()
const {
theme: { colors },
} = useAppTheme()
return (
<Stack.Navigator
screenOptions={{
headerShown: false,
navigationBarColor: colors.background,
contentStyle: {
backgroundColor: colors.background,
},
}}
initialRouteName={isAuthenticated ? "Welcome" : "AuthWelcome"}
>
{isAuthenticated ? (
<>
<Stack.Screen name="Welcome" component={WelcomeScreen} />
<Stack.Screen name="Main" component={MainNavigator} />
<Stack.Screen name="Profile" component={ProfileScreen} />
<Stack.Screen name="Settings" component={SettingsScreen} />
<Stack.Screen name="Security" component={SecurityScreen} />
<Stack.Screen name="SessionManagement" component={SessionManagementScreen} />
<Stack.Screen name="ChangePassword" component={ChangePasswordScreen} />
<Stack.Screen name="ChangeEmail" component={ChangeEmailScreen} />
<Stack.Screen name="About" component={AboutScreen} />
<Stack.Screen name="Language" component={LanguageScreen} />
<Stack.Screen name="Theme" component={ThemeScreen} />
</>
) : (
<>
<Stack.Screen name="AuthWelcome" component={AuthWelcomeScreen} />
<Stack.Screen name="Login" component={LoginScreen} />
<Stack.Screen name="Register" component={RegisterScreen} />
<Stack.Screen name="ForgotPassword" component={ForgotPasswordScreen} />
</>
)}
{/** 🔥 Your screens go here */}
{/* IGNITE_GENERATOR_ANCHOR_APP_STACK_SCREENS */}
</Stack.Navigator>
)
}
export const AppNavigator = (props: NavigationProps) => {
const { navigationTheme } = useAppTheme()
useBackButtonHandler((routeName) => exitRoutes.includes(routeName))
return (
<NavigationContainer ref={navigationRef} theme={navigationTheme} {...props}>
<ErrorBoundary catchErrors={Config.catchErrors}>
<AppStack />
</ErrorBoundary>
</NavigationContainer>
)
}