import React, { useState, useEffect, useRef } from "react"; import { Box, Typography, CircularProgress, Alert, Paper } from "@mui/material"; import { useNavigate, useSearchParams } from "react-router-dom"; import ErrorOutlineIcon from "@mui/icons-material/ErrorOutline"; import { useTimer } from "./hooks/useTimer"; import { useEvaluation } from "./hooks/useEvaluation"; import ErrorDisplay from "../common/ErrorDisplay"; // Messages de simulation pour les documents par défaut avec timing personnalisé const SIMULATION_MESSAGES = [ { message: "Initializing evaluation environment", step: 1, totalSteps: 5, timing: 0, }, // Immédiat { message: "Finding available model providers", step: 2, totalSteps: 5, timing: 1500, }, // Après 1.5s { message: "Starting evaluation process", step: 3, totalSteps: 5, timing: 3000, }, // Après 3s { message: "Evaluating models", step: 4, totalSteps: 5, timing: 5000 }, // Après 5s { message: "Storing evaluation results", step: 5, totalSteps: 5, timing: 7000, }, // Après 7s ]; // Durée totale pour rediriger à la fin de la simulation const TOTAL_SIMULATION_DURATION = 8000; // 8 secondes const BenchmarkEvaluation = ({ sessionId, isDefaultDocument, onComplete }) => { const [searchParams] = useSearchParams(); const isDefault = isDefaultDocument || ["the-bitter-lesson", "hurricane-faq", "pokemon-guide"].includes(sessionId); const navigate = useNavigate(); const simulationTimeoutsRef = useRef([]); // États pour la simulation const [simulationStep, setSimulationStep] = useState(0); const [simulationComplete, setSimulationComplete] = useState(false); // Use our custom hooks const { formatElapsedTime, stopTimer } = useTimer(); const { error, evaluationComplete: realComplete, currentStep, evaluationStarted, startEvaluation, currentStepLabel, totalSteps, } = useEvaluation(sessionId, () => { if (onComplete) { onComplete(); } }); // Gérer la simulation pour les documents par défaut useEffect(() => { // Seulement exécuter pour les documents par défaut et seulement une fois if (!isDefault || simulationTimeoutsRef.current.length > 0) return; console.log("Starting simulation for default document:", sessionId); // Créer des timeouts pour chaque étape avec les timings personnalisés for (let i = 1; i < SIMULATION_MESSAGES.length; i++) { const messageData = SIMULATION_MESSAGES[i]; const timeout = setTimeout(() => { console.log(`Simulation step ${i + 1}: ${messageData.message}`); setSimulationStep(i); }, messageData.timing); simulationTimeoutsRef.current.push(timeout); } // Timeout final pour terminer la simulation const finalTimeout = setTimeout(() => { console.log("Simulation complete, redirecting"); setSimulationComplete(true); if (onComplete) { onComplete(); } }, TOTAL_SIMULATION_DURATION); simulationTimeoutsRef.current.push(finalTimeout); // Nettoyage au démontage return () => { simulationTimeoutsRef.current.forEach(clearTimeout); }; }, [isDefault, sessionId, onComplete]); // Handle automatic redirection when evaluation is complete useEffect(() => { if (realComplete || simulationComplete) { navigate(`/evaluation-display?session=${sessionId}`); } }, [realComplete, simulationComplete, sessionId, navigate]); // Start evaluation if not default and not started useEffect(() => { if (!isDefault && !evaluationStarted) { startEvaluation(); } }, [isDefault, evaluationStarted, startEvaluation]); // Stop timer when complete useEffect(() => { if (realComplete || simulationComplete) { stopTimer(); } }, [realComplete, simulationComplete, stopTimer]); const isComplete = realComplete || simulationComplete; const currentStepInfo = isDefault ? `${SIMULATION_MESSAGES[simulationStep].message} (${SIMULATION_MESSAGES[simulationStep].step}/${SIMULATION_MESSAGES[simulationStep].totalSteps})` : `${currentStepLabel} (${currentStep + 1}/${totalSteps})`; return ( {/* Temps estimé */} Estimated time ~ 1m30s {error ? ( ) : ( <> {isComplete ? ( Evaluation completed successfully! ) : ( <> Benchmark evaluation... {/* Step progress indicator */} {currentStepInfo} {/* Timer display */} {formatElapsedTime()} )} )} ); }; export default BenchmarkEvaluation;