import React, { useState, useEffect, useRef } from "react"; import { Box, Typography, CircularProgress, Alert, Paper } from "@mui/material"; import { useNavigate } from "react-router-dom"; // Starting messages with their timing const STARTING_MESSAGES = [ { message: "Initializing evaluation environment...", progress: 22 }, { message: "Starting evaluation process...", progress: 54 }, { message: "Evaluating models...", progress: 71 }, { message: "Storing evaluation results...", progress: 100 }, ]; const BenchmarkEvaluation = ({ sessionId, onComplete }) => { const [evaluationComplete, setEvaluationComplete] = useState(false); const [error, setError] = useState(null); const [elapsedTime, setElapsedTime] = useState(0); const [startingMessageIndex, setStartingMessageIndex] = useState(0); const timerIntervalRef = useRef(null); const startTimeRef = useRef(null); const startingMessageIntervalRef = useRef(null); const pollingIntervalRef = useRef(null); const navigate = useNavigate(); // Add effect to handle automatic redirection when evaluation is complete useEffect(() => { if (evaluationComplete) { navigate(`/evaluation-display?session=${sessionId}`); } }, [evaluationComplete, sessionId, navigate]); // Add effect to handle starting messages useEffect(() => { startingMessageIntervalRef.current = setInterval(() => { setStartingMessageIndex((prev) => { if (prev < STARTING_MESSAGES.length - 1) { return prev + 1; } return prev; }); }, 20000); // Change message every 20 seconds return () => { if (startingMessageIntervalRef.current) { clearInterval(startingMessageIntervalRef.current); } }; }, []); // Start evaluation when component mounts useEffect(() => { // Set start time startTimeRef.current = Date.now(); // Start timer timerIntervalRef.current = setInterval(() => { const timeElapsed = Math.floor( (Date.now() - startTimeRef.current) / 1000 ); setElapsedTime(timeElapsed); }, 1000); startEvaluation(); // Clean up intervals on unmount return () => { if (pollingIntervalRef.current) { clearInterval(pollingIntervalRef.current); } if (timerIntervalRef.current) { clearInterval(timerIntervalRef.current); } }; }, []); // Format elapsed time as HH:MM:SS const formatElapsedTime = () => { const hours = Math.floor(elapsedTime / 3600); const minutes = Math.floor((elapsedTime % 3600) / 60); const seconds = elapsedTime % 60; return [ hours.toString().padStart(2, "0"), minutes.toString().padStart(2, "0"), seconds.toString().padStart(2, "0"), ].join(":"); }; // Start benchmark evaluation const startEvaluation = async () => { if (!sessionId) { setError("Missing session ID"); return; } try { // Call API to start evaluation const response = await fetch("http://localhost:3001/evaluate-benchmark", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ session_id: sessionId, }), }); const result = await response.json(); if (response.ok) { // Set up polling to check completion pollingIntervalRef.current = setInterval(async () => { try { const logsResponse = await fetch( `http://localhost:3001/evaluation-logs/${sessionId}` ); if (logsResponse.ok) { const logsResult = await logsResponse.json(); if (logsResult.is_completed) { setEvaluationComplete(true); clearInterval(pollingIntervalRef.current); } } } catch (error) { console.log("Error polling logs:", error); } }, 2000); } else { setError(result.error || "Benchmark evaluation failed"); } } catch (error) { console.error("Error starting evaluation:", error); setError("Error connecting to server"); } }; return ( {error ? ( {error} ) : ( <> {evaluationComplete ? ( Evaluation completed successfully! ) : ( <> Benchmark evaluation... {/* Step progress indicator */} {`${STARTING_MESSAGES[startingMessageIndex].message} (${STARTING_MESSAGES[startingMessageIndex].progress}%)`} {/* Timer display */} {formatElapsedTime()} )} )} ); }; export default BenchmarkEvaluation;