import React, { useEffect } from 'react'; import { View, Text, ScrollView, StyleSheet, RefreshControl, TouchableOpacity, } from 'react-native'; import { useSelector, useDispatch } from 'react-redux'; import { Ionicons } from '@expo/vector-icons'; import { RootState } from '../store/store'; import { fetchFeatures } from '../store/slices/featuresSlice'; import { fetchAnalytics } from '../store/slices/analyticsSlice'; const DashboardScreen: React.FC = () => { const dispatch = useDispatch(); const { features, loading: featuresLoading } = useSelector((state: RootState) => state.features); const { realtimeData, loading: analyticsLoading } = useSelector((state: RootState) => state.analytics); const [refreshing, setRefreshing] = React.useState(false); useEffect(() => { loadData(); }, []); const loadData = () => { dispatch(fetchFeatures()); dispatch(fetchAnalytics()); }; const onRefresh = async () => { setRefreshing(true); await Promise.all([ dispatch(fetchFeatures()), dispatch(fetchAnalytics()), ]); setRefreshing(false); }; const getStatusColor = (status: string) => { switch (status) { case 'running': return '#10B981'; case 'error': return '#EF4444'; case 'stopped': return '#6B7280'; default: return '#F59E0B'; } }; const getStatusIcon = (status: string) => { switch (status) { case 'running': return 'checkmark-circle'; case 'error': return 'close-circle'; case 'stopped': return 'stop-circle'; default: return 'help-circle'; } }; return ( } > {/* Header */} Tableau de bord Vue d'ensemble de la plateforme Veza {/* Quick Stats */} {features.length} Features Actives {realtimeData.length} Métriques Temps Réel 12 Médias 5 Chats Actifs {/* Feature Status */} Statut des Features {features.slice(0, 5).map((feature) => ( {feature.name} {feature.domain} {feature.status} CPU {feature.metrics.cpu}% RAM {(feature.metrics.memory / 1024 / 1024).toFixed(0)}MB DISK {(feature.metrics.disk / 1024 / 1024).toFixed(0)}MB ))} {/* Recent Activity */} Activité Récente Feature "Smart Recommendations" démarrée Il y a 2 min Nouveau média uploadé Il y a 5 min Rapport analytics généré Il y a 10 min {/* Quick Actions */} Actions Rapides Nouveau Feature Actualiser ); }; const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#111827', }, header: { padding: 20, paddingTop: 40, }, title: { fontSize: 28, fontWeight: 'bold', color: '#FFFFFF', marginBottom: 8, }, subtitle: { fontSize: 16, color: '#9CA3AF', }, statsContainer: { flexDirection: 'row', flexWrap: 'wrap', paddingHorizontal: 20, marginBottom: 20, }, statCard: { backgroundColor: '#1F2937', borderRadius: 12, padding: 16, marginBottom: 12, width: '48%', marginRight: '2%', alignItems: 'center', }, statNumber: { fontSize: 24, fontWeight: 'bold', color: '#FFFFFF', marginTop: 8, }, statLabel: { fontSize: 12, color: '#9CA3AF', marginTop: 4, textAlign: 'center', }, section: { paddingHorizontal: 20, marginBottom: 20, }, sectionTitle: { fontSize: 18, fontWeight: 'bold', color: '#FFFFFF', marginBottom: 12, }, featureCard: { backgroundColor: '#1F2937', borderRadius: 12, padding: 16, marginBottom: 12, }, featureHeader: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginBottom: 12, }, featureInfo: { flex: 1, }, featureName: { fontSize: 16, fontWeight: '600', color: '#FFFFFF', }, featureDomain: { fontSize: 12, color: '#9CA3AF', marginTop: 2, }, statusContainer: { flexDirection: 'row', alignItems: 'center', }, statusText: { fontSize: 12, fontWeight: '500', marginLeft: 4, }, metricsRow: { flexDirection: 'row', justifyContent: 'space-between', }, metric: { alignItems: 'center', }, metricLabel: { fontSize: 10, color: '#9CA3AF', }, metricValue: { fontSize: 12, fontWeight: '600', color: '#FFFFFF', marginTop: 2, }, activityCard: { backgroundColor: '#1F2937', borderRadius: 12, padding: 16, }, activityItem: { flexDirection: 'row', alignItems: 'center', marginBottom: 12, }, activityText: { flex: 1, fontSize: 14, color: '#FFFFFF', marginLeft: 8, }, activityTime: { fontSize: 12, color: '#9CA3AF', }, actionsContainer: { flexDirection: 'row', justifyContent: 'space-between', }, actionButton: { backgroundColor: '#3B82F6', borderRadius: 12, padding: 16, flexDirection: 'row', alignItems: 'center', flex: 1, marginRight: 8, }, actionText: { color: '#FFFFFF', fontWeight: '600', marginLeft: 8, }, }); export default DashboardScreen;