/** * Composant Datasets pour AfriDataHub * Created by BlackBenAI Team - AfriDataHub Platform */ import { useState, useEffect, useCallback } from 'react' import { motion, AnimatePresence } from 'framer-motion' import { Button } from '@/components/ui/button' import DatasetCard from './DatasetCard' import { Search, Filter, Download, Upload, RefreshCw, Brain, X } from 'lucide-react' import { API_URL } from '../config' const Datasets = ({ onStartAnalysis }) => { const [datasets, setDatasets] = useState([]) const [loading, setLoading] = useState(true) const [searchTerm, setSearchTerm] = useState('') const [selectedDomain, setSelectedDomain] = useState('') const [selectedDataset, setSelectedDataset] = useState(null) const [isAnalyzing, setIsAnalyzing] = useState(false) const domains = [ { value: '', label: 'Tous les domaines' }, { value: 'agriculture', label: 'Agriculture' }, { value: 'health', label: 'Santé' }, { value: 'economy', label: 'Économie' }, { value: 'weather', label: 'Météorologie' }, { value: 'energy', label: 'Énergie' }, { value: 'education', label: 'Éducation' }, { value: 'population', label: 'Population' }, { value: 'environment', label: 'Environnement' }, { value: 'transport', label: 'Transport' }, { value: 'other', label: 'Autre' }, ] useEffect(() => { fetchDatasets() }, []) const fetchDatasets = async () => { try { setLoading(true) const response = await fetch(`${API_URL}datasets/`) const data = await response.json() setDatasets(data.results || []) } catch (error) { console.error('Erreur lors du chargement des datasets:', error) } finally { setLoading(false) } } const filteredDatasets = datasets.filter(dataset => { const matchesSearch = dataset.title.toLowerCase().includes(searchTerm.toLowerCase()) || dataset.description.toLowerCase().includes(searchTerm.toLowerCase()) || dataset.source_name.toLowerCase().includes(searchTerm.toLowerCase()) const matchesDomain = !selectedDomain || dataset.domain === selectedDomain return matchesSearch && matchesDomain }) const handleViewDetails = (dataset) => { setSelectedDataset(dataset) } const handleAnalyze = async (dataset) => { try { setIsAnalyzing(true) // Fermer le modal de détails si ouvert setSelectedDataset(null) const response = await fetch(`${API_URL}datasets/${dataset.slug}/analyze/`) const data = await response.json() if (response.ok) { if (onStartAnalysis) { onStartAnalysis(dataset, data) } } else { console.error('Erreur analyse:', data) } } catch (error) { console.error('Erreur lors de l\'analyse:', error) } finally { setIsAnalyzing(false) } } const DatasetDetails = ({ dataset, onClose }) => { const [dataPoints, setDataPoints] = useState([]) const [loadingData, setLoadingData] = useState(true) const fetchDataPoints = useCallback(async () => { try { setLoadingData(true) const response = await fetch(`${API_URL}datasets/${dataset.slug}/data/?limit=50`) const result = await response.json() setDataPoints(result.data_points || []) } catch (error) { console.error('Erreur lors du chargement des données:', error) } finally { setLoadingData(false) } }, [dataset.slug]) useEffect(() => { fetchDataPoints() }, [fetchDataPoints]) const handleDownload = () => { if (dataPoints.length === 0) return // Créer le contenu CSV const headers = ['Pays', 'Date', 'Valeur', 'Unité', 'Source'] const csvContent = [ headers.join(','), ...dataPoints.map(dp => [ dp.country_name, dp.date, dp.value, dp.unit, dataset.source_name ].join(',')) ].join('\n') // Créer un blob et télécharger const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' }) const link = document.createElement('a') const url = URL.createObjectURL(blob) link.setAttribute('href', url) link.setAttribute('download', `${dataset.title.replace(/\s+/g, '_')}_preview.csv`) link.style.visibility = 'hidden' document.body.appendChild(link) link.click() document.body.removeChild(link) } return ( e.stopPropagation()} >

{dataset.title}

Description

{dataset.description}

Informations

Domaine: {dataset.domain}
Source: {dataset.source_name}
Points de données: {dataset.data_points_count.toLocaleString()}
Mise à jour: {new Date(dataset.last_updated).toLocaleDateString('fr-FR')}

Aperçu des données (50 premières lignes)

{dataPoints.length} lignes affichées
{loadingData ? ( ) : dataPoints.length > 0 ? ( dataPoints.map((dp, idx) => ( )) ) : ( )}
Pays Date Valeur Unité
Chargement du jeu de données...
{dp.country_name} {dp.date} {dp.value} {dp.unit}
Aucune donnée expérimentale disponible pour l'aperçu.
) } return (
{/* En-tête */}

Bibliothèque de Datasets

Explorez les {datasets.length} sources de vérité disponibles sur le continent.

{/* Filtres Glassmorphism */}
{/* Recherche */}
setSearchTerm(e.target.value)} className="w-full pl-12 pr-6 py-4 bg-background/50 dark:bg-black/20 border border-border rounded-2xl focus:ring-4 focus:ring-primary/10 focus:border-primary/30 transition-all outline-none font-medium text-foreground" />
{/* Filtre par domaine */}
{/* Résultats */}

{filteredDatasets.length} résultat{filteredDatasets.length > 1 ? 's' : ''} trouvé{filteredDatasets.length > 1 ? 's' : ''}

{loading ? (
{[...Array(6)].map((_, i) => (
))}
) : ( {filteredDatasets.map((dataset, index) => ( ))} )} {!loading && filteredDatasets.length === 0 && (

Aucun dataset trouvé

Nous n'avons trouvé aucun résultat pour votre recherche. Essayez d'utiliser des termes plus larges ou un autre domaine.

)}
{/* Modal de détails Premium */} {selectedDataset && ( setSelectedDataset(null)} /> )} {/* Loader d'analyse global */} {isAnalyzing && !selectedDataset && (

Intelligence Artificielle en action

Gemini analyse actuellement des milliers de points de données pour générer votre rapport stratégique.

)}
) } export default Datasets