| import React from 'react'; |
| import { NavigationContainer } from '@react-navigation/native'; |
| import { createNativeStackNavigator } from '@react-navigation/native-stack'; |
| import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'; |
| import { View, Text, StyleSheet, ActivityIndicator } from 'react-native'; |
| import { Ionicons } from '@expo/vector-icons'; |
|
|
| import { useAuth } from '../context/AuthContext'; |
| import { colors, borderRadius } from '../theme'; |
|
|
| import { LoginScreen } from '../screens/auth/LoginScreen'; |
| import { HomeScreen } from '../screens/home/HomeScreen'; |
| import { CaptureScreen } from '../screens/capture/CaptureScreen'; |
| import { ProcessingScreen } from '../screens/capture/ProcessingScreen'; |
| import { MyIssuesScreen } from '../screens/issues/MyIssuesScreen'; |
| import { IssueDetailScreen } from '../screens/issues/IssueDetailScreen'; |
| import { ProfileScreen } from '../screens/profile/ProfileScreen'; |
|
|
| const Stack = createNativeStackNavigator(); |
| const Tab = createBottomTabNavigator(); |
|
|
| function MainTabs() { |
| return ( |
| <Tab.Navigator |
| screenOptions={{ |
| headerShown: false, |
| tabBarStyle: styles.tabBar, |
| tabBarActiveTintColor: colors.primary.main, |
| tabBarInactiveTintColor: colors.text.tertiary, |
| tabBarLabelStyle: styles.tabBarLabel, |
| }} |
| > |
| <Tab.Screen |
| name="Home" |
| component={HomeScreen} |
| options={{ |
| tabBarIcon: ({ focused, color }) => ( |
| <Ionicons |
| name={focused ? 'home' : 'home-outline'} |
| size={24} |
| color={color} |
| /> |
| ), |
| }} |
| /> |
| <Tab.Screen |
| name="MyIssues" |
| component={MyIssuesScreen} |
| options={{ |
| title: 'Reports', |
| tabBarIcon: ({ focused, color }) => ( |
| <Ionicons |
| name={focused ? 'documents' : 'documents-outline'} |
| size={24} |
| color={color} |
| /> |
| ), |
| }} |
| /> |
| <Tab.Screen |
| name="Profile" |
| component={ProfileScreen} |
| options={{ |
| tabBarIcon: ({ focused, color }) => ( |
| <Ionicons |
| name={focused ? 'person' : 'person-outline'} |
| size={24} |
| color={color} |
| /> |
| ), |
| }} |
| /> |
| </Tab.Navigator> |
| ); |
| } |
|
|
| function AuthStack() { |
| return ( |
| <Stack.Navigator screenOptions={{ headerShown: false }}> |
| <Stack.Screen name="Login" component={LoginScreen} /> |
| </Stack.Navigator> |
| ); |
| } |
|
|
| function AppStack() { |
| return ( |
| <Stack.Navigator screenOptions={{ headerShown: false }}> |
| <Stack.Screen name="MainTabs" component={MainTabs} /> |
| <Stack.Screen |
| name="Capture" |
| component={CaptureScreen} |
| options={{ animation: 'slide_from_bottom' }} |
| /> |
| <Stack.Screen |
| name="Processing" |
| component={ProcessingScreen} |
| options={{ animation: 'fade' }} |
| /> |
| <Stack.Screen |
| name="IssueDetail" |
| component={IssueDetailScreen} |
| options={{ animation: 'slide_from_right' }} |
| /> |
| </Stack.Navigator> |
| ); |
| } |
|
|
| export function AppNavigator() { |
| const { user, loading } = useAuth(); |
|
|
| if (loading) { |
| return ( |
| <View style={styles.loadingContainer}> |
| <Ionicons name="business" size={64} color={colors.primary.main} /> |
| <ActivityIndicator size="large" color={colors.primary.main} style={styles.spinner} /> |
| <Text style={styles.loadingText}>Loading...</Text> |
| </View> |
| ); |
| } |
|
|
| return ( |
| <NavigationContainer> |
| {user ? <AppStack /> : <AuthStack />} |
| </NavigationContainer> |
| ); |
| } |
|
|
| const styles = StyleSheet.create({ |
| loadingContainer: { |
| flex: 1, |
| backgroundColor: colors.background.primary, |
| justifyContent: 'center', |
| alignItems: 'center', |
| }, |
| spinner: { |
| marginTop: 24, |
| }, |
| loadingText: { |
| color: colors.text.secondary, |
| fontSize: 16, |
| marginTop: 16, |
| }, |
| tabBar: { |
| backgroundColor: colors.background.secondary, |
| borderTopWidth: 1, |
| borderTopColor: colors.border.light, |
| height: 80, |
| paddingTop: 8, |
| paddingBottom: 20, |
| }, |
| tabBarLabel: { |
| fontSize: 12, |
| fontWeight: '500', |
| marginTop: 4, |
| }, |
| }); |
|
|