'use client'; import { useState, useEffect, useTransition } from 'react'; import { ProductivityMetrics } from '@/services/analytics'; import { getProductivityMetrics } from '@/actions/analytics'; import { CompletionTrendChart } from '@/components/charts/CompletionTrendChart'; import { VelocityChart } from '@/components/charts/VelocityChart'; import { PriorityDistributionChart } from '@/components/charts/PriorityDistributionChart'; import { WeeklyStatsCard } from '@/components/charts/WeeklyStatsCard'; import { Card } from '@/components/ui/Card'; export function ProductivityAnalytics() { const [metrics, setMetrics] = useState(null); const [error, setError] = useState(null); const [isPending, startTransition] = useTransition(); useEffect(() => { const loadMetrics = () => { startTransition(async () => { try { setError(null); const response = await getProductivityMetrics(); if (response.success && response.data) { setMetrics(response.data); } else { setError(response.error || 'Erreur lors du chargement des métriques'); } } catch (err) { setError(err instanceof Error ? err.message : 'Erreur lors du chargement des métriques'); console.error('Erreur analytics:', err); } }); }; loadMetrics(); }, []); if (isPending) { return (
{Array.from({ length: 4 }).map((_, i) => (
))}
); } if (error) { return (
⚠️

Erreur de chargement

{error}

); } if (!metrics) { return null; } return (
{/* Titre de section */}

📊 Analytics & Métriques

Derniers 30 jours
{/* Performance hebdomadaire */} {/* Graphiques principaux */}
{/* Distributions */}
{/* Status Flow - Graphique simple en barres horizontales */}

Répartition par Statut

{metrics.statusFlow.map((item, index) => (
{item.status}
{item.count}
{item.percentage}%
))}
{/* Insights automatiques */}

💡 Insights

Vélocité Moyenne
{metrics.velocityData.length > 0 ? Math.round(metrics.velocityData.reduce((acc, item) => acc + item.completed, 0) / metrics.velocityData.length) : 0 } tâches/sem
Priorité Principale
{metrics.priorityDistribution.reduce((max, item) => item.count > max.count ? item : max, metrics.priorityDistribution[0] )?.priority || 'N/A'}
Taux de Completion
{(() => { const completed = metrics.statusFlow.find(s => s.status === 'Terminé')?.count || 0; const total = metrics.statusFlow.reduce((acc, s) => acc + s.count, 0); return total > 0 ? Math.round((completed / total) * 100) : 0; })()}%
); }