- 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)
118 lines
3.3 KiB
TypeScript
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'
|
|
}
|
|
});
|