This commit is contained in:
2026-02-09 15:03:33 -06:00
parent 4d0f5815eb
commit d74807c84e
9 changed files with 738 additions and 406 deletions

View File

@@ -3,7 +3,7 @@ import * as Icons from 'lucide-react'
import { useNuevaAsignaturaWizard } from './hooks/useNuevaAsignaturaWizard'
import { PasoBasicosForm } from '@/components/asignaturas/wizard/PasoBasicosForm'
import { PasoBasicosForm } from '@/components/asignaturas/wizard/PasoBasicosForm/PasoBasicosForm'
import { PasoDetallesPanel } from '@/components/asignaturas/wizard/PasoDetallesPanel'
import { PasoMetodoCardGroup } from '@/components/asignaturas/wizard/PasoMetodoCardGroup'
import { PasoResumenCard } from '@/components/asignaturas/wizard/PasoResumenCard'
@@ -55,10 +55,16 @@ export function NuevaAsignaturaModalContainer({ planId }: { planId: string }) {
canContinueDesdeMetodo,
canContinueDesdeBasicos,
canContinueDesdeDetalles,
simularGeneracionIA,
crearAsignatura,
} = useNuevaAsignaturaWizard(planId)
const titleOverrides =
wizard.tipoOrigen === 'IA_MULTIPLE'
? {
basicos: 'Sugerencias',
detalles: 'Estructura',
}
: undefined
const handleClose = () => {
navigate({ to: `/planes/${planId}/asignaturas`, resetScroll: false })
}
@@ -99,7 +105,11 @@ export function NuevaAsignaturaModalContainer({ planId }: { planId: string }) {
title="Nueva Asignatura"
onClose={handleClose}
headerSlot={
<WizardResponsiveHeader wizard={Wizard} methods={methods} />
<WizardResponsiveHeader
wizard={Wizard}
methods={methods}
titleOverrides={titleOverrides}
/>
}
footerSlot={
<Wizard.Stepper.Controls>
@@ -137,11 +147,7 @@ export function NuevaAsignaturaModalContainer({ planId }: { planId: string }) {
{idx === 2 && (
<Wizard.Stepper.Panel>
<PasoDetallesPanel
wizard={wizard}
onChange={setWizard}
onGenerarIA={simularGeneracionIA}
/>
<PasoDetallesPanel wizard={wizard} onChange={setWizard} />
</Wizard.Stepper.Panel>
)}

View File

@@ -1,6 +1,6 @@
import { useState } from 'react'
import type { AsignaturaPreview, NewSubjectWizardState } from '../types'
import type { NewSubjectWizardState } from '../types'
export function useNuevaAsignaturaWizard(planId: string) {
const [wizard, setWizard] = useState<NewSubjectWizardState>({
@@ -28,6 +28,11 @@ export function useNuevaAsignaturaWizard(planId: string) {
repositoriosReferencia: [],
archivosAdjuntos: [],
},
iaMultiple: {
ciclo: '',
enfoque: '',
selectedIds: ['1', '3', '6'],
},
resumen: {},
isLoading: false,
errorMessage: null,
@@ -35,16 +40,18 @@ export function useNuevaAsignaturaWizard(planId: string) {
const canContinueDesdeMetodo =
wizard.tipoOrigen === 'MANUAL' ||
wizard.tipoOrigen === 'IA' ||
wizard.tipoOrigen === 'IA_SIMPLE' ||
wizard.tipoOrigen === 'IA_MULTIPLE' ||
wizard.tipoOrigen === 'CLONADO_INTERNO' ||
wizard.tipoOrigen === 'CLONADO_TRADICIONAL'
const canContinueDesdeBasicos =
!!wizard.datosBasicos.nombre &&
wizard.datosBasicos.tipo !== null &&
wizard.datosBasicos.creditos !== null &&
wizard.datosBasicos.creditos > 0 &&
!!wizard.datosBasicos.estructuraId
(!!wizard.datosBasicos.nombre &&
wizard.datosBasicos.tipo !== null &&
wizard.datosBasicos.creditos !== null &&
wizard.datosBasicos.creditos > 0 &&
!!wizard.datosBasicos.estructuraId) ||
true
const canContinueDesdeDetalles = (() => {
if (wizard.tipoOrigen === 'MANUAL') return true
@@ -60,35 +67,11 @@ export function useNuevaAsignaturaWizard(planId: string) {
return false
})()
const simularGeneracionIA = async () => {
setWizard((w) => ({ ...w, isLoading: true }))
await new Promise((r) => setTimeout(r, 1500))
setWizard((w) => ({
...w,
isLoading: false,
resumen: {
previewAsignatura: {
nombre: w.datosBasicos.nombre,
objetivo:
'Aplicar los fundamentos teóricos para la resolución de problemas...',
unidades: 5,
bibliografiaCount: 3,
} as AsignaturaPreview,
},
}))
}
const crearAsignatura = async () => {
await new Promise((r) => setTimeout(r, 1000))
}
return {
wizard,
setWizard,
canContinueDesdeMetodo,
canContinueDesdeBasicos,
canContinueDesdeDetalles,
simularGeneracionIA,
crearAsignatura,
}
}

View File

@@ -15,7 +15,12 @@ export type AsignaturaPreview = {
export type NewSubjectWizardState = {
step: 1 | 2 | 3 | 4
plan_estudio_id: Asignatura['plan_estudio_id']
tipoOrigen: Asignatura['tipo_origen'] | null
tipoOrigen:
| Asignatura['tipo_origen']
| 'CLONADO'
| 'IA_SIMPLE'
| 'IA_MULTIPLE'
| null
datosBasicos: {
nombre: Asignatura['nombre']
codigo?: Asignatura['codigo']
@@ -42,6 +47,11 @@ export type NewSubjectWizardState = {
repositoriosReferencia?: Array<string>
archivosAdjuntos?: Array<UploadedFile>
}
iaMultiple?: {
ciclo: string
enfoque: string
selectedIds: Array<string>
}
resumen: {
previewAsignatura?: AsignaturaPreview
}