import { useEffect, useState } from 'react'; import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, Cell } from 'recharts'; import { TrendingUp, Users, CheckCircle2, Eye, AlertCircle } from 'lucide-react'; import { useAuth } from '../lib/auth'; import { useTenant } from '../lib/tenant'; import { api } from '../lib/api'; import { logError } from '../lib/logger'; interface AnalyticsData { summary: { total: number; sent: number; delivered: number; read: number; failed: number; deliveryRate: number; readRate: number; }; funnel: Array<{ name: string; value: number; fill: string }>; } export const CRMAnalytics = () => { const { token } = useAuth(); const { selectedOrgId } = useTenant(); const [data, setData] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { const fetchAnalytics = async () => { if (!token || !selectedOrgId) return; try { const result = await api.get('/v1/analytics/campaigns', token, selectedOrgId); setData(result); } catch (err) { logError("Failed to fetch analytics:", err); } finally { setLoading(false); } }; fetchAnalytics(); }, [token, selectedOrgId]); if (loading) return (
Chargement des données...
); if (!data) return null; return (
{/* KPI Cards */}

Total

{data.summary.total}

Délivré

{data.summary.deliveryRate.toFixed(1)}%

Lecture

{data.summary.readRate.toFixed(1)}%

Engagement

Elevé

{/* Funnel Chart */}

Entonnoir de Campagne

Répartition des statuts de distribution

{data.summary.failed > 0 && (
{data.summary.failed} ÉCHECS
)}
{ if (active && payload && payload.length) { return (

{payload[0].payload.name}

{payload[0].value} Messages

); } return null; }} /> {data.funnel.map((entry, index) => ( ))}
); };