import { useState, useEffect, useCallback } from 'react' import { Trash2, FileText, Clock, Loader2, XCircle, AlertCircle } from 'lucide-react' import { reportsApi, type Report } from '@/api/reports' import { Card, CardContent } from '@/components/ui/card' import { Markdown } from '@/components/ui/markdown' import { Button } from '@/components/ui/button' import { Spinner } from '@/components/ui/spinner' import { Badge } from '@/components/ui/badge' function StatusBadge({ status }: { status: Report['status'] }) { if (status === 'generating') return ( En cours ) if (status === 'error') return ( Erreur ) return null } export function Reports() { const [reports, setReports] = useState([]) const [loading, setLoading] = useState(true) const load = useCallback(async () => { try { setReports((await reportsApi.list()) ?? []) } finally { setLoading(false) } }, []) useEffect(() => { load() }, [load]) // Poll toutes les 3s tant qu'il y a des rapports en cours useEffect(() => { const hasGenerating = reports.some(r => r.status === 'generating') if (!hasGenerating) return const interval = setInterval(load, 3000) return () => clearInterval(interval) }, [reports, load]) async function remove(id: string) { await reportsApi.delete(id) setReports(prev => prev.filter(r => r.id !== id)) } if (loading) return
return (

Rapports IA

Vos questions posées sur des extraits de résumés, avec les réponses de l'IA.

{reports.length === 0 ? (

Aucun rapport enregistré

Sélectionnez du texte dans un résumé et posez une question à l'IA.

) : (
{reports.map(r => ( {/* Meta */}
{new Date(r.created_at).toLocaleString('fr-FR')}
{/* Extraits de contexte */} {r.context_excerpt.split('\n\n---\n\n').map((excerpt, i) => (
« {excerpt} »
))} {/* Question */}

{r.question}

{/* Réponse */} {r.status === 'generating' && (
L'IA génère la réponse…
)} {r.status === 'done' && (
)} {r.status === 'error' && (
Erreur : {r.error_msg || 'Une erreur est survenue lors de la génération.'}
)}
))}
)}
) }