Files
WalletTracker/src/navigation/AppNavigator.tsx
Arthur Lempereur 8bde3d4f21 Initial commit: WalletTracker app with Firebase integration
- Setup Expo project with TypeScript
- Implement authentication (Login/Signup/Logout)
- Create Dashboard, Transactions, Subscriptions, and Analysis screens
- Add Firebase services (Auth, Firestore, Storage)
- Implement real-time synchronization
- Add charts and analytics
- Create reusable components (Button, InputText, TransactionCard, SubscriptionCard)
- Configure React Navigation with bottom tabs
- Add Firestore security rules
- Create comprehensive documentation (README, FIREBASE_SETUP, TESTING)
2025-10-23 14:36:36 +02:00

118 lines
3.3 KiB
TypeScript

import React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import { ActivityIndicator, View, StyleSheet } from 'react-native';
import { useAuth } from '../hooks/useAuth';
import { LoginScreen } from '../screens/LoginScreen';
import { SignupScreen } from '../screens/SignupScreen';
import { DashboardScreen } from '../screens/DashboardScreen';
import { TransactionScreen } from '../screens/TransactionScreen';
import { SubscriptionScreen } from '../screens/SubscriptionScreen';
import { AnalysisScreen } from '../screens/AnalysisScreen';
import { RootStackParamList, MainTabParamList } from '../types';
const Stack = createStackNavigator<RootStackParamList>();
const Tab = createBottomTabNavigator<MainTabParamList>();
const MainTabs = () => {
return (
<Tab.Navigator
screenOptions={{
headerShown: false,
tabBarActiveTintColor: '#4A90E2',
tabBarInactiveTintColor: '#999',
tabBarStyle: {
backgroundColor: '#FFF',
borderTopWidth: 1,
borderTopColor: '#E0E0E0',
paddingBottom: 8,
paddingTop: 8,
height: 60
},
tabBarLabelStyle: {
fontSize: 12,
fontWeight: '600'
}
}}
>
<Tab.Screen
name="Dashboard"
component={DashboardScreen}
options={{
tabBarLabel: 'Tableau de bord',
tabBarIcon: ({ color }) => <TabIcon icon="📊" color={color} />
}}
/>
<Tab.Screen
name="Transactions"
component={TransactionScreen}
options={{
tabBarLabel: 'Transactions',
tabBarIcon: ({ color }) => <TabIcon icon="💸" color={color} />
}}
/>
<Tab.Screen
name="Subscriptions"
component={SubscriptionScreen}
options={{
tabBarLabel: 'Abonnements',
tabBarIcon: ({ color }) => <TabIcon icon="📱" color={color} />
}}
/>
<Tab.Screen
name="Analysis"
component={AnalysisScreen}
options={{
tabBarLabel: 'Analyses',
tabBarIcon: ({ color }) => <TabIcon icon="📈" color={color} />
}}
/>
</Tab.Navigator>
);
};
const TabIcon = ({ icon, color }: { icon: string; color: string }) => (
<View style={{ opacity: color === '#4A90E2' ? 1 : 0.5 }}>
<View>{icon}</View>
</View>
);
export const AppNavigator = () => {
const { user, initializing } = useAuth();
if (initializing) {
return (
<View style={styles.loadingContainer}>
<ActivityIndicator size="large" color="#4A90E2" />
</View>
);
}
return (
<NavigationContainer>
<Stack.Navigator screenOptions={{ headerShown: false }}>
{user ? (
<Stack.Screen name="Main" component={MainTabs} />
) : (
<>
<Stack.Screen name="Login" component={LoginScreen} />
<Stack.Screen name="Signup" component={SignupScreen} />
</>
)}
</Stack.Navigator>
</NavigationContainer>
);
};
const styles = StyleSheet.create({
loadingContainer: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F8F9FA'
}
});