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;