/**
* 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 (
{dataset.description}{dataset.title}
Description
Informations
Aperçu des données (50 premières lignes)
{dataPoints.length} lignes affichées
{loadingData ? (
Pays
Date
Valeur
Unité
) : dataPoints.length > 0 ? (
dataPoints.map((dp, idx) => (
))
) : (
{dp.country_name}
{dp.date}
{dp.value}
{dp.unit}
)}
Aucune donnée expérimentale disponible pour l'aperçu.
Explorez les {datasets.length} sources de vérité disponibles sur le continent.
{filteredDatasets.length} résultat{filteredDatasets.length > 1 ? 's' : ''} trouvé{filteredDatasets.length > 1 ? 's' : ''}
Nous n'avons trouvé aucun résultat pour votre recherche. Essayez d'utiliser des termes plus larges ou un autre domaine.
Gemini analyse actuellement des milliers de points de données pour générer votre rapport stratégique.