'use client'; import React, { useState, useEffect } from 'react'; import { questionBankApi, QuestionBank, QuestionBankFilters, QuestionBankType } from '@/lib/api'; import { Plus, Search, Filter, Edit2, Trash2, Volume2, VolumeX, Download, Upload, Sparkles, ChevronDown, ChevronUp, X, Check, AlertCircle, Headphones, BookOpen, Tag, Hash, Globe } from 'lucide-react'; import QuestionBankEditor from '@/components/QuestionBank/QuestionBankEditor'; import QuestionBankCard from '@/components/QuestionBank/QuestionBankCard'; import MySQLImportModal from '@/components/QuestionBank/MySQLImportModal'; import AudioGeneratorModal from '@/components/QuestionBank/AudioGeneratorModal'; export default function QuestionBankPage() { const [questions, setQuestions] = useState([]); const [loading, setLoading] = useState(true); const [filters, setFilters] = useState({}); const [searchTerm, setSearchTerm] = useState(''); const [showFilters, setShowFilters] = useState(false); const [showEditor, setShowEditor] = useState(false); const [editingQuestion, setEditingQuestion] = useState(null); const [showImportModal, setShowImportModal] = useState(false); const [showAudioModal, setShowAudioModal] = useState(false); const [selectedForAudio, setSelectedForAudio] = useState(null); const loadQuestions = async () => { try { setLoading(true); const data = await questionBankApi.list(filters); setQuestions(data); } catch (error) { console.error('Failed to load questions:', error); } finally { setLoading(false); } }; useEffect(() => { loadQuestions(); }, [filters]); const handleCreate = () => { setEditingQuestion(null); setShowEditor(true); }; const handleEdit = (question: QuestionBank) => { setEditingQuestion(question); setShowEditor(true); }; const handleDelete = async (id: string) => { if (!confirm('¿Estás seguro de que deseas eliminar esta pregunta?')) return; try { await questionBankApi.delete(id); await loadQuestions(); } catch (error) { console.error('Failed to delete question:', error); alert('Error al eliminar la pregunta'); } }; const handleImportSuccess = async () => { setShowImportModal(false); await loadQuestions(); }; const handleAudioGenerate = (questionId: string) => { setSelectedForAudio(questionId); setShowAudioModal(true); }; const handleAudioSuccess = async () => { setShowAudioModal(false); setSelectedForAudio(null); await loadQuestions(); }; const getQuestionTypeLabel = (type: QuestionBankType) => { const labels: Record = { 'multiple-choice': 'Opción Múltiple', 'true-false': 'Verdadero/Falso', 'short-answer': 'Respuesta Corta', 'essay': 'Ensayo', 'matching': 'Emparejamiento', 'ordering': 'Ordenar', 'fill-in-the-blanks': 'Completar', 'audio-response': 'Respuesta Audio', 'hotspot': 'Hotspot', 'code-lab': 'Código', }; return labels[type] || type; }; const getDifficultyColor = (difficulty?: string) => { switch (difficulty) { case 'easy': return 'bg-green-100 text-green-800'; case 'medium': return 'bg-yellow-100 text-yellow-800'; case 'hard': return 'bg-red-100 text-red-800'; default: return 'bg-gray-100 text-gray-800'; } }; const getSourceBadge = (source?: string) => { switch (source) { case 'imported-mysql': return MySQL; case 'ai-generated': return IA; case 'manual': return Manual; default: return null; } }; return (
{/* Header */}

Banco de Preguntas

Gestiona preguntas reutilizables con audio para tus evaluaciones

{/* Stats */}
{questions.length}
Total Preguntas
{questions.filter(q => q.source === 'imported-mysql').length}
Importadas MySQL
{questions.filter(q => q.audio_status === 'ready').length}
Con Audio
{questions.filter(q => q.source === 'ai-generated').length}
Generadas IA
{/* Search and Filters */}
setSearchTerm(e.target.value)} onKeyPress={(e) => e.key === 'Enter' && loadQuestions()} className="w-full pl-10 pr-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-white" />
{/* Filter Panel */} {showFilters && (
)} {/* Questions Grid */} {loading ? (

Cargando preguntas...

) : questions.length === 0 ? (

No hay preguntas

Crea preguntas manualmente o impórtalas desde MySQL

) : (
{questions.map((question) => ( handleEdit(question)} onDelete={() => handleDelete(question.id)} onGenerateAudio={() => handleAudioGenerate(question.id)} /> ))}
)}
{/* Editor Modal */} {showEditor && ( { setShowEditor(false); loadQuestions(); }} onCancel={() => setShowEditor(false)} /> )} {/* Import Modal */} {showImportModal && ( setShowImportModal(false)} /> )} {/* Audio Generator Modal */} {showAudioModal && selectedForAudio && ( { setShowAudioModal(false); setSelectedForAudio(null); }} /> )}
); }