CityTrack / User /src /navigation /AppNavigator.tsx
0xarchit's picture
User app beta v1 complete
71638d4
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,
},
});