"use client"; import { useState, useEffect } from "react"; import { useRouter } from "next/navigation"; import { Mic, Play, Pause, CheckCircle, AlertCircle, BrainCircuit, User, Calendar, BookOpen, Filter, Download, RefreshCcw } from "lucide-react"; import { lmsApi, type AudioResponse, type AudioResponseFilters } from "@/lib/api"; import PageLayout from "@/components/PageLayout"; import AuthGuard from "@/components/AuthGuard"; export default function AudioEvaluationsPage() { const router = useRouter(); const [loading, setLoading] = useState(true); const [evaluations, setEvaluations] = useState([]); const [selectedEvaluation, setSelectedEvaluation] = useState(null); const [teacherScore, setTeacherScore] = useState(50); const [teacherFeedback, setTeacherFeedback] = useState(""); const [filters, setFilters] = useState({}); const [playingId, setPlayingId] = useState(null); const [audioUrl, setAudioUrl] = useState(null); const fetchEvaluations = async () => { setLoading(true); try { const data = await lmsApi.getAudioResponses(filters); setEvaluations(data); } catch (error) { console.error("Error fetching audio evaluations:", error); } finally { setLoading(false); } }; useEffect(() => { fetchEvaluations(); }, [filters]); const handlePlayAudio = async (id: string) => { if (playingId === id) { // Stop playing if (audioUrl) { URL.revokeObjectURL(audioUrl); } setPlayingId(null); setAudioUrl(null); } else { try { const audioBlob = await lmsApi.getAudioResponseAudio(id); const url = URL.createObjectURL(audioBlob); if (audioUrl) { URL.revokeObjectURL(audioUrl); } setAudioUrl(url); setPlayingId(id); const audio = new Audio(url); audio.onended = () => { setPlayingId(null); setAudioUrl(null); }; audio.play(); } catch (error) { console.error("Error playing audio:", error); alert("Error al reproducir el audio"); } } }; const handleSubmitEvaluation = async () => { if (!selectedEvaluation) return; try { await lmsApi.evaluateAudioResponse( selectedEvaluation.id, teacherScore, teacherFeedback ); alert("Evaluación guardada exitosamente"); setSelectedEvaluation(null); fetchEvaluations(); } catch (error) { console.error("Error submitting evaluation:", error); alert("Error al guardar la evaluación"); } }; const getStatusBadge = (status: string) => { switch (status) { case 'pending': return Pendiente; case 'ai_evaluated': return IA Evaluada; case 'teacher_evaluated': return Profesor Evaluó; case 'both_evaluated': return Completa; default: return null; } }; const getScoreColor = (score: number | null) => { if (score === null) return 'text-gray-400'; if (score >= 70) return 'text-green-600 dark:text-green-400'; if (score >= 40) return 'text-yellow-600 dark:text-yellow-400'; return 'text-red-600 dark:text-red-400'; }; return (
{/* Filters */}

Filtros

setFilters({ ...filters, course_id: e.target.value || undefined })} placeholder="UUID del curso" className="w-full mt-1 px-4 py-2 bg-white dark:bg-black/40 border border-gray-200 dark:border-white/10 rounded-xl text-sm font-medium outline-none focus:ring-2 focus:ring-purple-500/20" />
setFilters({ ...filters, lesson_id: e.target.value || undefined })} placeholder="UUID de la lección" className="w-full mt-1 px-4 py-2 bg-white dark:bg-black/40 border border-gray-200 dark:border-white/10 rounded-xl text-sm font-medium outline-none focus:ring-2 focus:ring-purple-500/20" />
{/* Evaluations Table */}
{loading ? ( ) : evaluations.length === 0 ? ( ) : ( evaluations.map((eval_) => ( )) )}
Estudiante Curso / Lección Prompt Transcripción IA Profesor Estado Fecha Acciones
Cargando evaluaciones...

No hay evaluaciones de audio

{eval_.student_name.charAt(0).toUpperCase()}

{eval_.student_name}

{eval_.student_email}

{eval_.course_title}

{eval_.lesson_title}

{eval_.prompt}

{eval_.transcript || Sin transcripción}

{eval_.ai_score !== null ? (

{eval_.ai_score}%

{eval_.ai_found_keywords && eval_.ai_found_keywords.length > 0 && (

Keywords: {eval_.ai_found_keywords.join(', ')}

)}
) : ( - )}
{eval_.teacher_score !== null ? (

{eval_.teacher_score}%

) : ( - )}
{getStatusBadge(eval_.status)}
{new Date(eval_.created_at).toLocaleDateString()}
{/* Evaluation Modal */} {selectedEvaluation && (

Evaluar Respuesta de Audio

{/* Student Info */}

{selectedEvaluation.student_name}

{selectedEvaluation.course_title} → {selectedEvaluation.lesson_title}

{/* Prompt */}

{selectedEvaluation.prompt}

{/* Transcript */}

{selectedEvaluation.transcript || Sin transcripción disponible}

{/* AI Evaluation */} {selectedEvaluation.ai_score !== null && (

{selectedEvaluation.ai_score}%

{selectedEvaluation.ai_feedback && (

"{selectedEvaluation.ai_feedback}"

)}
)} {/* Teacher Evaluation */}
setTeacherScore(parseInt(e.target.value))} className="w-full mt-1 px-4 py-3 bg-white dark:bg-black/40 border border-gray-200 dark:border-white/10 rounded-xl text-lg font-bold outline-none focus:ring-2 focus:ring-purple-500/20" />