diff --git a/src/components/planes/CreatePlanDialog.tsx b/src/components/planes/CreatePlanDialog.tsx new file mode 100644 index 0000000..1a6764c --- /dev/null +++ b/src/components/planes/CreatePlanDialog.tsx @@ -0,0 +1,106 @@ +import { useRouter } from "@tanstack/react-router" +import { useSupabaseAuth } from "@/auth/supabase" +import { useState } from "react" +import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog" +import { Label } from "@/components/ui/label" +import { Textarea } from "@/components/ui/textarea" +import { Input } from "@/components/ui/input" +import { CarreraCombobox, FacultadCombobox } from "@/components/users/procedencia-combobox" +import { Button } from "@/components/ui/button" +import { postAPI } from "@/lib/api" + +export function CreatePlanDialog({ open, onOpenChange }: { open: boolean; onOpenChange: (v: boolean) => void }) { + const router = useRouter() + const auth = useSupabaseAuth() + const role = auth.claims?.role + + const [saving, setSaving] = useState(false) + const [err, setErr] = useState(null) + + const [facultadId, setFacultadId] = useState(auth.claims?.facultad_id ?? "") + const [carreraId, setCarreraId] = useState(auth.claims?.carrera_id ?? "") + const [nivel, setNivel] = useState("") + const [prompt, setPrompt] = useState( + "Genera un plan de estudios claro y realista: " + ) + + const lockFacultad = role === "secretario_academico" || role === "jefe_carrera" + const lockCarrera = role === "jefe_carrera" + + async function crearConIA() { + setErr(null) + if (!carreraId) { setErr("Selecciona una carrera."); return } + setSaving(true) + try { + const res = await postAPI("/api/generar/plan", { + carreraId, + prompt, + insert: true, + }) + const newId = res?.id || res?.plan?.id || res?.data?.id + if (newId) { + onOpenChange(false) + router.invalidate() + router.navigate({ to: "/plan/$planId", params: { planId: newId } }) + } else { + onOpenChange(false) + router.invalidate() + } + } catch (e: any) { + setErr(typeof e?.message === "string" ? e.message : "Error al generar el plan.") + } finally { + setSaving(false) + } + } + + return ( + + + + Nuevo plan de estudios (IA) + +
+
+ +