import React, { useState, useEffect } from 'react'; import axios from 'axios'; import { toast } from 'sonner'; import { Loader2, Play, Clock, CheckCircle2, XCircle, AlertCircle } from 'lucide-react'; const API_BASE = '/api/catalogues/admin'; export default function CatalogueAdmin() { const [loading, setLoading] = useState(false); const [scraping, setScraping] = useState(false); const [logs, setLogs] = useState([]); const [stats, setStats] = useState(null); const [enseignes, setEnseignes] = useState([]); useEffect(() => { loadEnseignes(); loadStats(); loadLogs(); }, []); const loadEnseignes = async () => { try { const response = await axios.get('/api/catalogues/enseignes'); setEnseignes(response.data); } catch (error) { console.error('Error loading enseignes:', error); } }; const loadStats = async () => { try { const response = await axios.get(`${API_BASE}/stats`); setStats(response.data); } catch (error) { console.error('Error loading stats:', error); } }; const loadLogs = async () => { setLoading(true); try { const response = await axios.get(`${API_BASE}/scraping/logs?limit=20`); setLogs(response.data); } catch (error) { console.error('Error loading logs:', error); toast.error('Erreur lors du chargement des logs'); } finally { setLoading(false); } }; const triggerScraping = async (enseigneId = null) => { setScraping(true); try { const params = enseigneId ? { enseigne_id: enseigneId } : {}; const response = await axios.post(`${API_BASE}/scraping/trigger`, null, { params }); toast.success(response.data.message); toast.info(`${response.data.catalogues_nouveaux} nouveaux catalogues trouvés`); // Reload data await Promise.all([loadStats(), loadLogs()]); } catch (error) { console.error('Error triggering scraping:', error); toast.error('Erreur lors du déclenchement du scraping'); } finally { setScraping(false); } }; const getStatusIcon = (status) => { switch (status) { case 'success': return ; case 'error': return ; case 'partial': return ; default: return ; } }; const formatDate = (dateString) => { const date = new Date(dateString); return date.toLocaleString('fr-FR'); }; return (

Administration Catalogues

Gérer le scraping des catalogues Bonial

{/* Stats Cards */} {stats && (

Total Catalogues

{stats.total_catalogues}

Dernière Mise à Jour

{stats.derniere_mise_a_jour ? formatDate(stats.derniere_mise_a_jour) : 'Jamais'}

Prochaine Exécution

{stats.prochaine_execution}

)} {/* Manual Scraping */}

Scraping Manuel

Ou scraper une enseigne spécifique:

{enseignes.map(enseigne => ( ))}
{/* Catalogues par Enseigne */} {stats && stats.catalogues_par_enseigne && (

Catalogues par Enseigne

{Object.entries(stats.catalogues_par_enseigne).map(([nom, count]) => (
{nom} {count}
))}
)} {/* Scraping Logs */}

Historique des Scraping

{loading ? (
) : logs.length === 0 ? (

Aucun log disponible

) : (
{logs.map(log => (
{getStatusIcon(log.statut)}
{log.enseigne_nom || 'Toutes'} {formatDate(log.date_execution)}
{log.catalogues_trouves} trouvé(s) • {log.catalogues_nouveaux} nouveau(x) {log.duree_secondes && ` • ${log.duree_secondes.toFixed(1)}s`}
{log.message_erreur && (
{log.message_erreur}
)}
))}
)}
); }