diff --git a/src/components/asignaturas/wizard/WizardControls.tsx b/src/components/asignaturas/wizard/WizardControls.tsx index d393f03..2abbbc7 100644 --- a/src/components/asignaturas/wizard/WizardControls.tsx +++ b/src/components/asignaturas/wizard/WizardControls.tsx @@ -1,12 +1,19 @@ import { useQueryClient } from '@tanstack/react-query' import { useNavigate } from '@tanstack/react-router' +import { Loader2 } from 'lucide-react' +import { useState } from 'react' import type { AIGenerateSubjectInput, AIGenerateSubjectJsonInput } from '@/data' import type { NewSubjectWizardState } from '@/features/asignaturas/nueva/types' import type { TablesInsert } from '@/types/supabase' import { Button } from '@/components/ui/button' -import { supabaseBrowser, useGenerateSubjectAI, qk } from '@/data' +import { + supabaseBrowser, + useGenerateSubjectAI, + qk, + useCreateSubjectManual, +} from '@/data' export function WizardControls({ wizard, @@ -32,6 +39,8 @@ export function WizardControls({ const navigate = useNavigate() const qc = useQueryClient() const generateSubjectAI = useGenerateSubjectAI() + const createSubjectManual = useCreateSubjectManual() + const [isSpinningIA, setIsSpinningIA] = useState(false) const handleCreate = async () => { setWizard((w) => ({ ...w, @@ -40,7 +49,7 @@ export function WizardControls({ })) try { - if (wizard.tipoOrigen === 'IA' || wizard.tipoOrigen === 'IA_SIMPLE') { + if (wizard.tipoOrigen === 'IA_SIMPLE') { const aiInput: AIGenerateSubjectInput = { plan_estudio_id: wizard.plan_estudio_id, datosBasicos: { @@ -68,11 +77,14 @@ export function WizardControls({ `${new Date().toISOString()} - Enviando a generar asignatura con IA`, ) + setIsSpinningIA(true) const asignatura = await generateSubjectAI.mutateAsync(aiInput) - console.log( - `${new Date().toISOString()} - Asignatura IA generada`, - asignatura, - ) + // await new Promise((resolve) => setTimeout(resolve, 20000)) // debug + setIsSpinningIA(false) + // console.log( + // `${new Date().toISOString()} - Asignatura IA generada`, + // asignatura, + // ) navigate({ to: `/planes/${wizard.plan_estudio_id}/asignaturas/${asignatura.id}`, @@ -156,13 +168,40 @@ export function WizardControls({ return } + + if (wizard.tipoOrigen === 'MANUAL') { + if (!wizard.plan_estudio_id) { + throw new Error('Plan de estudio inválido.') + } + + const asignatura = await createSubjectManual.mutateAsync({ + plan_estudio_id: wizard.plan_estudio_id, + estructura_id: wizard.datosBasicos.estructuraId!, + nombre: wizard.datosBasicos.nombre, + codigo: wizard.datosBasicos.codigo ?? null, + tipo: wizard.datosBasicos.tipo ?? undefined, + creditos: wizard.datosBasicos.creditos ?? 0, + horas_academicas: wizard.datosBasicos.horasAcademicas ?? null, + horas_independientes: wizard.datosBasicos.horasIndependientes ?? null, + linea_plan_id: null, + numero_ciclo: null, + }) + + navigate({ + to: `/planes/${wizard.plan_estudio_id}/asignaturas/${asignatura.id}`, + state: { showConfetti: true }, + resetScroll: false, + }) + } } catch (err: any) { + setIsSpinningIA(false) setWizard((w) => ({ ...w, isLoading: false, errorMessage: err?.message ?? 'Error creando la asignatura', })) } finally { + setIsSpinningIA(false) setWizard((w) => ({ ...w, isLoading: false })) } } @@ -181,6 +220,17 @@ export function WizardControls({ )} +
+ +
+ {isLastStep ? (