import { useCallback, useState } from 'react' import { Link } from '@tanstack/react-router' import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Separator } from '@/components/ui/separator' import { Textarea } from '@/components/ui/textarea' import { ArrowLeft, GraduationCap, Edit2, Save, Pencil } from 'lucide-react' import { ContenidoTematico } from './ContenidoTematico' import { BibliographyItem } from './BibliographyItem' import { IAMateriaTab } from './IAMateriaTab' import type { CampoEstructura, IAMessage, IASugerencia, UnidadTematica, } from '@/types/materia'; import { mockMateria, mockEstructura, mockDocumentoSep, mockHistorial } from '@/data/mockMateriaData'; import { DocumentoSEPTab } from './DocumentoSEPTab' import { HistorialTab } from './HistorialTab' export interface BibliografiaEntry { id: string; tipo: 'BASICA' | 'COMPLEMENTARIA'; cita: string; fuenteBibliotecaId?: string; fuenteBiblioteca?: any; } export interface BibliografiaTabProps { bibliografia: BibliografiaEntry[]; onSave: (bibliografia: BibliografiaEntry[]) => void; isSaving: boolean; } export default function MateriaDetailPage() { // 1. Asegúrate de tener estos estados en tu componente principal const [messages, setMessages] = useState([]); const [datosGenerales, setDatosGenerales] = useState({}); const [campos, setCampos] = useState([]); // 2. Funciones de manejo para la IA const handleSendMessage = (text: string, campoId?: string) => { const newMessage: IAMessage = { id: Date.now().toString(), role: 'user', content: text, timestamp: new Date(), campoAfectado: campoId }; setMessages([...messages, newMessage]); // Aquí llamarías a tu API de OpenAI/Claude //toast.info("Enviando consulta a la IA..."); }; const handleAcceptSuggestion = (sugerencia: IASugerencia) => { // Lógica para actualizar el valor del campo en tu estado de datosGenerales //toast.success(`Sugerencia aplicada a ${sugerencia.campoNombre}`); }; // Dentro de tu componente principal (donde están los Tabs) const [bibliografia, setBibliografia] = useState([ { id: '1', tipo: 'BASICA', cita: 'Russell, S., & Norvig, P. (2020). Artificial Intelligence: A Modern Approach. Pearson.' } ]); const [isSaving, setIsSaving] = useState(false); const handleSaveBibliografia = (data: BibliografiaEntry[]) => { setIsSaving(true); // Aquí iría tu llamada a la API setBibliografia(data); // Simulamos un guardado setTimeout(() => { setIsSaving(false); //toast.success("Cambios guardados"); }, 1000); }; const [isRegenerating, setIsRegenerating] = useState(false); const handleRegenerateDocument = useCallback(() => { setIsRegenerating(true); setTimeout(() => { setIsRegenerating(false); }, 2000); }, []); return (
{/* ================= HEADER ================= */}
Volver al plan
IA-401

Inteligencia Artificial Aplicada

Ingeniería en Sistemas Computacionales Facultad de Ingeniería

Pertenece al plan:{' '} Licenciatura en Ingeniería en Sistemas Computacionales 2024

8 créditos 7° semestre Sistemas Inteligentes
{/* ================= TABS ================= */}
Datos generales Contenido temático Bibliografía IA de la materia Documento SEP Historial {/* ================= TAB: DATOS GENERALES ================= */} console.log("Rechazada") /*toast.error("Sugerencia rechazada")*/} />
) } /* ================= TAB CONTENT ================= */ function DatosGenerales() { return (
{/* Encabezado de la Sección */}

Datos Generales

Información oficial estructurada bajo los lineamientos de la SEP.

{/* Grid de Información */}
{/* Columna Principal (Más ancha) */}
{/* Columna Lateral (Información Secundaria) */}
{/* Tarjeta de Requisitos */} {/* Tarjeta de Evaluación */}
) } interface InfoCardProps { title: string, subtitle?: string isList?:boolean initialContent: any // Puede ser string o array de objetos type?: 'text' | 'list' | 'requirements' | 'evaluation' } function InfoCard({ title, initialContent, type = 'text' }: InfoCardProps) { const [isEditing, setIsEditing] = useState(false) const [data, setData] = useState(initialContent) // Estado temporal para el área de texto (siempre editamos como texto por simplicidad) const [tempText, setTempText] = useState( type === 'text' || type === 'list' ? initialContent : JSON.stringify(initialContent, null, 2) // O un formato legible ) const handleSave = () => { // Aquí podrías parsear el texto de vuelta si es necesario setData(tempText) setIsEditing(false) } return ( {title} {!isEditing && ( )} {isEditing ? (