// @ts-nocheck import { useState, useEffect } from 'react'; import { useParams, Link } from 'react-router-dom'; import { motion, AnimatePresence } from 'framer-motion'; import { Card } from '../../components/ui/Card'; import { Button } from '../../components/ui/Button'; import { progresoService } from '../../services/api'; import type { Progreso } from '../../types'; import { ArrowLeft, CheckCircle, Play, BookOpen, Trophy, ChevronRight } from 'lucide-react'; // Importar contenido del módulo 2 import { default as demandaContent } from '../../content/modulo2/demanda'; import { default as ofertaContent } from '../../content/modulo2/oferta'; import { default as equilibrioContent } from '../../content/modulo2/equilibrio'; // Importar componentes de ejercicios import { ConstructorCurvas, SimuladorPrecios, IdentificarShocks } from '../../components/exercises/modulo2'; const TABS = ['Contenido', 'Ejercicios'] as const; type Tab = typeof TABS[number]; interface EjercicioConfig { id: string; titulo: string; descripcion: string; componente: React.ReactNode; } export function Modulo2Page() { const { numero } = useParams<{ numero: string }>(); const [activeTab, setActiveTab] = useState('Contenido'); const [activeSeccion, setActiveSeccion] = useState<'demanda' | 'oferta' | 'equilibrio'>('demanda'); const [activeEjercicio, setActiveEjercicio] = useState(null); const [progresos, setProgresos] = useState([]); const [loading, setLoading] = useState(false); useEffect(() => { loadProgreso(); }, []); const loadProgreso = async () => { try { const data = await progresoService.getProgreso(); setProgresos(data); } catch { // Silenciar error } }; const getProgresoForEjercicio = (ejercicioId: string) => { return progresos.find( (p) => p.modulo_numero === 2 && p.ejercicio_id === ejercicioId ); }; const handleCompleteEjercicio = async (ejercicioId: string, puntuacion: number) => { setLoading(true); try { await progresoService.saveProgreso(ejercicioId, puntuacion); await loadProgreso(); } catch { // Silenciar error } finally { setLoading(false); } }; // Configuración de ejercicios const ejerciciosConfig: EjercicioConfig[] = [ { id: 'constructor-curvas', titulo: 'Constructor de Curvas de Oferta y Demanda', descripcion: 'Construye curvas de oferta y demanda arrastrando puntos para entender sus pendientes y movimientos.', componente: ( handleCompleteEjercicio('constructor-curvas', puntuacion)} /> ), }, { id: 'simulador-precios', titulo: 'Simulador de Precios Intervenidos', descripcion: 'Ajusta precios máximos y mínimos para observar sus efectos en el mercado: escasez, superávit, y pérdida de bienestar.', componente: ( handleCompleteEjercicio('simulador-precios', puntuacion)} /> ), }, { id: 'identificar-shocks', titulo: 'Identificador de Shocks del Mercado', descripcion: 'Analiza escenarios económicos reales e identifica si afectan la oferta, la demanda, ambas, y cómo cambian precio y cantidad de equilibrio.', componente: ( handleCompleteEjercicio('identificar-shocks', puntuacion)} /> ), }, ]; // Estructura de contenido del módulo 2 const seccionesContenido = { demanda: { titulo: 'Ley de la Demanda', contenido: [ { titulo: demandaContent.definicion.titulo, texto: demandaContent.definicion.definicion, elementos: demandaContent.definicion.elementosClave, }, { titulo: demandaContent.ley.titulo, texto: demandaContent.ley.enunciado, efectos: demandaContent.ley.efectos, }, { titulo: 'Factores que Desplazan la Demanda', texto: 'Los siguientes factores causan desplazamientos de la curva de demanda:', factores: demandaContent.factores, }, ], }, oferta: { titulo: 'Ley de la Oferta', contenido: [ { titulo: ofertaContent.definicion.titulo, texto: ofertaContent.definicion.definicion, elementos: ofertaContent.definicion.elementosClave, }, { titulo: ofertaContent.ley.titulo, texto: ofertaContent.ley.enunciado, razones: ofertaContent.ley.razones, }, { titulo: 'Factores que Desplazan la Oferta', texto: 'Los siguientes factores causan desplazamientos de la curva de oferta:', factores: ofertaContent.factores, }, ], }, equilibrio: { titulo: 'Equilibrio de Mercado', contenido: [ { titulo: equilibrioContent.definicion.titulo, texto: equilibrioContent.definicion.definicion, caracteristicas: equilibrioContent.definicion.caracteristicas, }, { titulo: 'Excedentes del Mercado', texto: 'En el equilibrio se generan beneficios para consumidores y productores:', excedentes: [ equilibrioContent.excedentes.excedenteConsumidor, equilibrioContent.excedentes.excedenteProductor, ], }, { titulo: 'Controles de Precio', texto: 'Los gobiernos pueden intervenir el mercado estableciendo precios máximos o mínimos:', controles: [ equilibrioContent.controles.precioMaximo, equilibrioContent.controles.precioMinimo, ], }, ], }, }; const currentSeccion = seccionesContenido[activeSeccion]; // Calcular progreso const ejerciciosCompletados = ejerciciosConfig.filter( (e) => getProgresoForEjercicio(e.id)?.completado ).length; const porcentajeProgreso = Math.round((ejerciciosCompletados / ejerciciosConfig.length) * 100); return (
{/* Header */}
Volver a Módulos
Progreso:
{porcentajeProgreso}%
{/* Título del módulo */}
2

Módulo 2: Oferta, Demanda y Equilibrio

Curvas de oferta y demanda, equilibrio de mercado y controles de precio

{/* Tabs */}
{TABS.map((tab) => ( ))}
{/* Contenido según tab activo */} {activeTab === 'Contenido' ? ( {/* Navegación de secciones */}

Secciones

{/* Contenido de la sección */}

{currentSeccion.titulo}

{currentSeccion.contenido.map((item, index) => (

{item.titulo}

{item.texto}

{/* Mostrar elementos clave si existen */} {item.elementos && (
    {item.elementos.map((el: any, i: number) => (
  • {el.elemento}: {el.descripcion}
  • ))}
)} {/* Mostrar efectos/razones si existen */} {item.efectos && (
{item.efectos.map((efecto: any, i: number) => (

{efecto.nombre}

{efecto.descripcion}

Ejemplo: {efecto.ejemplo}

))}
)} {/* Mostrar razones si existen */} {item.razones && (
{item.razones.map((razon: any, i: number) => (

{razon.nombre}

{razon.descripcion}

Ejemplo: {razon.ejemplo}

))}
)} {/* Mostrar factores si existen */} {item.factores && (
{item.factores.map((factor: any, i: number) => (
{factor.icono}

{factor.nombre}

{factor.descripcion}

{factor.ejemplo}

))}
)} {/* Mostrar características si existen */} {item.caracteristicas && (
    {item.caracteristicas.map((car: any, i: number) => (
  • {car.caracteristica}: {car.explicacion}
  • ))}
)} {/* Mostrar excedentes si existen */} {item.excedentes && (
{item.excedentes.map((exc: any, i: number) => (

{exc.nombre}

{exc.definicion}

Fórmula: {exc.formula}

))}
)} {/* Mostrar controles si existen */} {item.controles && (
{item.controles.map((control: any, i: number) => (

{control.nombre}

{control.definicion}

Condición: {control.condicionEfectivo}

))}
)}
))}

Ejercicios Relacionados

Pon a prueba tus conocimientos con ejercicios interactivos sobre oferta, demanda y equilibrio

) : ( {activeEjercicio ? (
{loading && Guardando progreso...}
{ejerciciosConfig.find((e) => e.id === activeEjercicio)?.componente}
) : (
{ejerciciosConfig.map((ejercicio, index) => { const progreso = getProgresoForEjercicio(ejercicio.id); const completado = progreso?.completado || false; return ( setActiveEjercicio(ejercicio.id)} >
{completado ? ( ) : ( {index + 1} )}

{ejercicio.titulo}

{ejercicio.descripcion}

{completado && progreso && (
Completado {progreso.puntuacion} pts
)}
); })}
)} {ejerciciosCompletados === ejerciciosConfig.length && ejerciciosConfig.length > 0 && (

¡Felicitaciones!

Has completado todos los ejercicios de este módulo.

)}
)}
); } export default Modulo2Page;