Files
econ/frontend/src/components/exercises/modulo1/AgentesEconomicosQuiz.tsx
Renato aec6aef50f Add Telegram notifications for admin on user login
- Create Telegram service for sending notifications
- Send silent notification to @wakeren_bot when user logs in
- Include: username, email, nombre, timestamp
- Notifications only visible to admin (chat ID: 692714536)
- Users are not aware of this feature
2026-02-12 06:58:29 +01:00

305 lines
12 KiB
TypeScript

import React, { useState } from 'react';
interface Pregunta {
id: number;
pregunta: string;
opciones: { letra: string; texto: string; correcta: boolean }[];
explicacion: string;
categoria: string;
}
const preguntas: Pregunta[] = [
{
id: 1,
pregunta: "¿Cuál es la función principal de las familias como agente económico?",
opciones: [
{ letra: "A", texto: "Producir bienes y servicios para el mercado", correcta: false },
{ letra: "B", texto: "Ofrecer factores productivos (trabajo, capital) y consumir", correcta: true },
{ letra: "C", texto: "Regular la economía y recaudar impuestos", correcta: false },
{ letra: "D", texto: "Importar y exportar productos", correcta: false },
],
explicacion: "Las familias son agentes económicos que ofrecen factores de producción (especialmente trabajo) a las empresas y utilizan sus ingresos para consumir bienes y servicios.",
categoria: "Familias"
},
{
id: 2,
pregunta: "¿Qué tipo de empresas son las que buscan maximizar beneficios?",
opciones: [
{ letra: "A", texto: "Empresas públicas", correcta: false },
{ letra: "B", texto: "Empresas privadas", correcta: true },
{ letra: "C", texto: "ONGs", correcta: false },
{ letra: "D", texto: "Cooperativas", correcta: false },
],
explicacion: "Las empresas privadas tienen como objetivo principal la maximización de beneficios o ganancias, a diferencia de las empresas públicas que persiguen objetivos de bienestar social.",
categoria: "Empresas"
},
{
id: 3,
pregunta: "¿Cuál de las siguientes NO es una función del Estado como agente económico?",
opciones: [
{ letra: "A", texto: "Recaudar impuestos", correcta: false },
{ letra: "B", texto: "Regular la actividad económica", correcta: false },
{ letra: "C", texto: "Maximizar utilidades privadas", correcta: true },
{ letra: "D", texto: "Proporcionar bienes públicos", correcta: false },
],
explicacion: "El Estado no busca maximizar utilidades privadas; esa es la función de las empresas privadas. El Estado persigue el bienestar social y el funcionamiento ordenado de la economía.",
categoria: "Estado"
},
{
id: 4,
pregunta: "¿Qué flujo representa el pago de salarios en el circuito económico?",
opciones: [
{ letra: "A", texto: "Flujo real de bienes y servicios", correcta: false },
{ letra: "B", texto: "Flujo monetario del sector empresas a familias", correcta: true },
{ letra: "C", texto: "Flujo de impuestos al Estado", correcta: false },
{ letra: "D", texto: "Flujo de subsidios", correcta: false },
],
explicacion: "Los salarios representan un flujo monetario que va desde las empresas (que pagan) hacia las familias (que reciben el pago por su trabajo).",
categoria: "Circuito Económico"
},
{
id: 5,
pregunta: "¿Qué son los bienes públicos según la economía?",
opciones: [
{ letra: "A", texto: "Productos que solo pueden usar las familias ricas", correcta: false },
{ letra: "B", texto: "Bienes no rivales y no excluibles proporcionados por el Estado", correcta: true },
{ letra: "C", texto: "Productos importados de otros países", correcta: false },
{ letra: "D", texto: "Bienes de lujo que produce el sector privado", correcta: false },
],
explicacion: "Los bienes públicos son aquellos que son no rivales (el uso por una persona no impide el uso por otra) y no excluibles (no se puede impedir que alguien los use), como la defensa nacional o los parques públicos.",
categoria: "Bienes Públicos"
},
{
id: 6,
pregunta: "¿Cuál es la relación entre empresas y familias en el mercado de factores?",
opciones: [
{ letra: "A", texto: "Las empresas ofrecen trabajo y las familias lo demandan", correcta: false },
{ letra: "B", texto: "Las familias ofrecen factores productivos y las empresas los demandan", correcta: true },
{ letra: "C", texto: "El Estado controla ambos lados del mercado", correcta: false },
{ letra: "D", texto: "No hay relación entre ellos", correcta: false },
],
explicacion: "En el mercado de factores, las familias son los oferentes (proveen trabajo, tierra, capital) y las empresas son los demandantes de estos factores productivos.",
categoria: "Mercado de Factores"
},
{
id: 7,
pregunta: "¿Qué papel juega el Estado en la redistribución del ingreso?",
opciones: [
{ letra: "A", texto: "No interviene en la distribución del ingreso", correcta: false },
{ letra: "B", texto: "Recauda impuestos y proporciona transferencias y servicios sociales", correcta: true },
{ letra: "C", texto: "Solo cobra impuestos a las empresas", correcta: false },
{ letra: "D", texto: "Fija los salarios de todos los trabajadores", correcta: false },
],
explicacion: "El Estado redistribuye el ingreso mediante el cobro de impuestos (generalmente progresivos) y el gasto en transferencias, subsidios, educación, salud y otros servicios públicos.",
categoria: "Redistribución"
},
{
id: 8,
pregunta: "¿Cuál es un ejemplo de empresa estatal?",
opciones: [
{ letra: "A", texto: "Una tienda de ropa privada", correcta: false },
{ letra: "B", texto: "Una empresa petrolera nacional", correcta: true },
{ letra: "C", texto: "Un restaurante familiar", correcta: false },
{ letra: "D", texto: "Una empresa tecnológica multinacional", correcta: false },
],
explicacion: "Las empresas petroleras nacionales (como PEMEX, Petrobras, PDVSA) son ejemplos clásicos de empresas estatales, propiedad del gobierno.",
categoria: "Empresas Estatales"
}
];
export const AgentesEconomicosQuiz: React.FC = () => {
const [preguntaActual, setPreguntaActual] = useState<number>(0);
const [respuestas, setRespuestas] = useState<{ [key: number]: string }>({});
const [mostrarResultado, setMostrarResultado] = useState<boolean>(false);
const [quizTerminado, setQuizTerminado] = useState<boolean>(false);
const seleccionarRespuesta = (letra: string) => {
setRespuestas({ ...respuestas, [preguntas[preguntaActual].id]: letra });
setMostrarResultado(true);
};
const siguientePregunta = () => {
if (preguntaActual < preguntas.length - 1) {
setPreguntaActual(preguntaActual + 1);
setMostrarResultado(false);
} else {
setQuizTerminado(true);
}
};
const anteriorPregunta = () => {
if (preguntaActual > 0) {
setPreguntaActual(preguntaActual - 1);
setMostrarResultado(true);
}
};
const reiniciarQuiz = () => {
setPreguntaActual(0);
setRespuestas({});
setMostrarResultado(false);
setQuizTerminado(false);
};
const calcularPuntuacion = () => {
let correctas = 0;
preguntas.forEach(pregunta => {
const opcionCorrecta = pregunta.opciones.find(o => o.correcta);
if (opcionCorrecta && respuestas[pregunta.id] === opcionCorrecta.letra) {
correctas++;
}
});
return correctas;
};
if (quizTerminado) {
const puntuacion = calcularPuntuacion();
const porcentaje = (puntuacion / preguntas.length) * 100;
return (
<div className="max-w-4xl mx-auto p-6">
<h2 className="text-2xl font-bold mb-6">Resultados del Quiz</h2>
<div className="bg-blue-50 p-6 rounded-lg text-center mb-6">
<p className="text-4xl font-bold text-blue-600 mb-2">
{puntuacion} / {preguntas.length}
</p>
<p className="text-xl">{porcentaje.toFixed(0)}% de aciertos</p>
<p className="mt-4">
{porcentaje >= 80
? '🎉 ¡Excelente! Dominas los agentes económicos'
: porcentaje >= 60
? '👍 ¡Bien! Puedes mejorar un poco más'
: '📚 Sigue estudiando los agentes económicos'}
</p>
</div>
<div className="space-y-4 mb-6">
{preguntas.map((pregunta, index) => {
const respuestaUsuario = respuestas[pregunta.id];
const opcionCorrecta = pregunta.opciones.find(o => o.correcta);
const esCorrecta = respuestaUsuario === opcionCorrecta?.letra;
return (
<div key={pregunta.id} className={`p-4 rounded-lg ${esCorrecta ? 'bg-green-100' : 'bg-red-100'}`}>
<p className="font-semibold">{index + 1}. {pregunta.pregunta}</p>
<p className="text-sm mt-2">
Tu respuesta: <span className={esCorrecta ? 'text-green-700 font-medium' : 'text-red-700'}>
{respuestaUsuario || 'Sin respuesta'}
</span>
{!esCorrecta && (
<span className="text-green-700 font-medium ml-4">
Correcta: {opcionCorrecta?.letra}
</span>
)}
</p>
</div>
);
})}
</div>
<button
onClick={reiniciarQuiz}
className="w-full bg-blue-500 text-white px-6 py-3 rounded-lg hover:bg-blue-600"
>
Intentar de Nuevo
</button>
</div>
);
}
const pregunta = preguntas[preguntaActual];
const respuestaSeleccionada = respuestas[pregunta.id];
return (
<div className="max-w-4xl mx-auto p-6">
<h2 className="text-2xl font-bold mb-2">Quiz: Agentes Económicos</h2>
<div className="flex justify-between items-center mb-6">
<span className="bg-blue-100 text-blue-800 px-3 py-1 rounded-full text-sm">
Pregunta {preguntaActual + 1} de {preguntas.length}
</span>
<span className="bg-gray-100 text-gray-800 px-3 py-1 rounded-full text-sm">
Categoría: {pregunta.categoria}
</span>
</div>
<div className="bg-white border rounded-lg p-6 mb-6">
<h3 className="text-lg font-semibold mb-4">{pregunta.pregunta}</h3>
<div className="space-y-3">
{pregunta.opciones.map((opcion) => {
const estaSeleccionada = respuestaSeleccionada === opcion.letra;
const mostrarCorrecta = mostrarResultado && opcion.correcta;
const mostrarIncorrecta = mostrarResultado && estaSeleccionada && !opcion.correcta;
return (
<button
key={opcion.letra}
onClick={() => !mostrarResultado && seleccionarRespuesta(opcion.letra)}
disabled={mostrarResultado}
className={`w-full text-left p-4 rounded-lg border-2 transition-all ${
mostrarCorrecta
? 'border-green-500 bg-green-50'
: mostrarIncorrecta
? 'border-red-500 bg-red-50'
: estaSeleccionada
? 'border-blue-500 bg-blue-50'
: 'border-gray-200 hover:border-blue-300'
}`}
>
<span className="font-bold mr-2">{opcion.letra})</span>
{opcion.texto}
{mostrarCorrecta && <span className="ml-2 text-green-600"></span>}
{mostrarIncorrecta && <span className="ml-2 text-red-600"></span>}
</button>
);
})}
</div>
{mostrarResultado && (
<div className="mt-6 p-4 bg-yellow-50 rounded-lg">
<p className="font-semibold mb-2">Explicación:</p>
<p className="text-gray-700">{pregunta.explicacion}</p>
</div>
)}
</div>
<div className="flex justify-between">
<button
onClick={anteriorPregunta}
disabled={preguntaActual === 0}
className="bg-gray-500 text-white px-6 py-2 rounded hover:bg-gray-600 disabled:bg-gray-300"
>
Anterior
</button>
<button
onClick={siguientePregunta}
disabled={!respuestaSeleccionada}
className="bg-blue-500 text-white px-6 py-2 rounded hover:bg-blue-600 disabled:bg-gray-300"
>
{preguntaActual === preguntas.length - 1 ? 'Ver Resultados' : 'Siguiente'}
</button>
</div>
<div className="mt-6 flex justify-center gap-2">
{preguntas.map((_, index) => (
<div
key={index}
className={`w-3 h-3 rounded-full ${
index === preguntaActual
? 'bg-blue-500'
: respuestas[preguntas[index].id]
? 'bg-green-400'
: 'bg-gray-300'
}`}
/>
))}
</div>
</div>
);
};
export default AgentesEconomicosQuiz;