veza/veza-mobile/App.tsx

154 lines
No EOL
4.3 KiB
TypeScript

import React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import { createStackNavigator } from '@react-navigation/stack';
import { Provider } from 'react-redux';
import { store } from './src/store/store';
import { StatusBar } from 'expo-status-bar';
import { Ionicons } from '@expo/vector-icons';
// Screens
import DashboardScreen from './src/screens/DashboardScreen';
import FeaturesScreen from './src/screens/FeaturesScreen';
import AnalyticsScreen from './src/screens/AnalyticsScreen';
import MediaScreen from './src/screens/MediaScreen';
import ChatScreen from './src/screens/ChatScreen';
import SettingsScreen from './src/screens/SettingsScreen';
import LoginScreen from './src/screens/auth/LoginScreen';
import RegisterScreen from './src/screens/auth/RegisterScreen';
// Navigation types
type RootStackParamList = {
Auth: undefined;
Main: undefined;
};
type AuthStackParamList = {
Login: undefined;
Register: undefined;
};
type MainTabParamList = {
Dashboard: undefined;
Features: undefined;
Analytics: undefined;
Media: undefined;
Chat: undefined;
Settings: undefined;
};
const Stack = createStackNavigator<RootStackParamList>();
const AuthStack = createStackNavigator<AuthStackParamList>();
const Tab = createBottomTabNavigator<MainTabParamList>();
// Auth Navigator
const AuthNavigator = () => (
<AuthStack.Navigator screenOptions={{ headerShown: false }}>
<AuthStack.Screen name="Login" component={LoginScreen} />
<AuthStack.Screen name="Register" component={RegisterScreen} />
</AuthStack.Navigator>
);
// Main Tab Navigator
const MainTabNavigator = () => (
<Tab.Navigator
screenOptions={({ route }) => ({
tabBarIcon: ({ focused, color, size }) => {
let iconName: keyof typeof Ionicons.glyphMap;
switch (route.name) {
case 'Dashboard':
iconName = focused ? 'home' : 'home-outline';
break;
case 'Features':
iconName = focused ? 'apps' : 'apps-outline';
break;
case 'Analytics':
iconName = focused ? 'analytics' : 'analytics-outline';
break;
case 'Media':
iconName = focused ? 'musical-notes' : 'musical-notes-outline';
break;
case 'Chat':
iconName = focused ? 'chatbubbles' : 'chatbubbles-outline';
break;
case 'Settings':
iconName = focused ? 'settings' : 'settings-outline';
break;
default:
iconName = 'help-outline';
}
return <Ionicons name={iconName} size={size} color={color} />;
},
tabBarActiveTintColor: '#3B82F6',
tabBarInactiveTintColor: '#6B7280',
tabBarStyle: {
backgroundColor: '#1F2937',
borderTopColor: '#374151',
},
headerStyle: {
backgroundColor: '#1F2937',
},
headerTintColor: '#FFFFFF',
})}
>
<Tab.Screen
name="Dashboard"
component={DashboardScreen}
options={{ title: 'Tableau de bord' }}
/>
<Tab.Screen
name="Features"
component={FeaturesScreen}
options={{ title: 'Fonctionnalités' }}
/>
<Tab.Screen
name="Analytics"
component={AnalyticsScreen}
options={{ title: 'Analytics' }}
/>
<Tab.Screen
name="Media"
component={MediaScreen}
options={{ title: 'Média' }}
/>
<Tab.Screen
name="Chat"
component={ChatScreen}
options={{ title: 'Chat' }}
/>
<Tab.Screen
name="Settings"
component={SettingsScreen}
options={{ title: 'Paramètres' }}
/>
</Tab.Navigator>
);
// Root Navigator
const RootNavigator = () => {
// TODO: Check authentication state
const isAuthenticated = false; // This should come from auth state
return (
<Stack.Navigator screenOptions={{ headerShown: false }}>
{isAuthenticated ? (
<Stack.Screen name="Main" component={MainTabNavigator} />
) : (
<Stack.Screen name="Auth" component={AuthNavigator} />
)}
</Stack.Navigator>
);
};
export default function App() {
return (
<Provider store={store}>
<NavigationContainer>
<StatusBar style="light" />
<RootNavigator />
</NavigationContainer>
</Provider>
);
}