import { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Select } from '@/components/ui/select'; import { logger } from '@/utils/logger'; import { parseApiError } from '@/utils/apiErrorHandler'; import { Music, Play, Heart, Download, TrendingUp, BarChart3, ListMusic, Share2, } from 'lucide-react'; import { getAnalyticsData, type AnalyticsData, } from '@/features/analytics/services/analyticsService'; import { LoadingSpinner } from '@/components/ui/loading-spinner'; /** * FE-PAGE-015: Analytics page for track and playlist statistics */ export function AnalyticsPage() { const [analytics, setAnalytics] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [period, setPeriod] = useState(30); const navigate = useNavigate(); useEffect(() => { loadAnalytics(); }, [period]); const loadAnalytics = async () => { setLoading(true); setError(null); try { const data = await getAnalyticsData(period); setAnalytics(data); } catch (err: unknown) { const apiError = parseApiError(err); logger.error('Failed to load analytics', { error: apiError.message, period, }); setError(apiError.message); } finally { setLoading(false); } }; const formatNumber = (num: number): string => { if (num >= 1000000) { return `${(num / 1000000).toFixed(1)}M`; } if (num >= 1000) { return `${(num / 1000).toFixed(1)}K`; } return num.toString(); }; if (loading) { return (
); } if (error) { return (
Erreur {error}
); } if (!analytics) { return null; } return (

Analytics

Statistiques et métriques de performance pour vos pistes et playlists

{/* Period selector */}