'use client'; import React, { useState } from 'react'; import { Edit2, Trash2, Volume2, Sparkles, Globe } from 'lucide-react'; interface QuestionBankCardProps { question: any; onEdit: () => void; onDelete: () => void; } export default function QuestionBankCard({ question, onEdit, onDelete }: QuestionBankCardProps): React.JSX.Element { const [isPlaying, setIsPlaying] = useState(false); const [audio, setAudio] = useState(null); const safeQuestionText: React.ReactNode = typeof question.question_text === 'string' ? question.question_text : ''; const getQuestionTypeLabel = (type: string) => { 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 dark:bg-green-900/30 dark:text-green-400'; case 'medium': return 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-400'; case 'hard': return 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400'; default: return 'bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-400'; } }; const sourceBadge = (() => { switch (question.source) { case 'imported-mysql': case 'sam-diagnostico': return ( MySQL ); case 'imported-material': return ( Materiales ZIP ); case 'ai-generated': return ( IA ); case 'manual': return Manual; default: return question.source ? ( {question.source} ) : null; } })(); const handlePlayAudio = () => { if (!question.audio_url) return; if (audio) { audio.remove(); } const audioEl = new Audio(question.audio_url); audioEl.onended = () => setIsPlaying(false); audioEl.onerror = () => { setIsPlaying(false); alert('Error al reproducir el audio'); }; setAudio(audioEl); setIsPlaying(true); audioEl.play(); }; const handleStopAudio = () => { if (audio) { audio.pause(); audio.currentTime = 0; } setIsPlaying(false); }; return (
{/* Header */}
{getQuestionTypeLabel(question.question_type)} {question.difficulty || 'Medium'} {question.skill_assessed && ( 📊 {question.skill_assessed} )}
{question.audio_url && ( )}
{/* Question Text */}

{safeQuestionText as any}

{/* Matching Pairs Preview */} {question.question_type === 'matching' && (
{(() => { // Try to get pairs from different possible locations let pairs = question.pairs || (question.correct_answer && Array.isArray(question.correct_answer) ? question.correct_answer : null) || (question.correct_answer && question.correct_answer.pairs ? question.correct_answer.pairs : null); if (!Array.isArray(pairs) || pairs.length === 0) { return
Sin pares definidos
; } return pairs.slice(0, 3).map((pair: any, idx: number) => (
{pair.left || pair[0]} {pair.right || pair[1]}
)); })()} {(() => { let pairs = question.pairs || (question.correct_answer && Array.isArray(question.correct_answer) ? question.correct_answer : null) || (question.correct_answer && question.correct_answer.pairs ? question.correct_answer.pairs : null); return Array.isArray(pairs) && pairs.length > 3 ? (
+{pairs.length - 3} pares más
) : null; })()}
)} {/* Audio Player */} {question.audio_url && (
Audio disponible
)} {/* Options Preview */} {question.options && (
{Array.isArray(question.options) && question.options.slice(0, 3).map((opt: string, idx: number) => (
{String.fromCharCode(65 + idx)} {opt}
))} {Array.isArray(question.options) && question.options.length > 3 && (
+{question.options.length - 3} opciones más
)}
)} {/* Footer */}
{question.points} pts {sourceBadge &&
{sourceBadge}
}
{/* Usage Stats */} {question.usage_count && question.usage_count > 0 && (
Usada {question.usage_count} veces
)}
); }