diff --git a/src/components/asignaturas/detalle/MateriaDetailPage.tsx b/src/components/asignaturas/detalle/MateriaDetailPage.tsx index 3a7cd71..5516e2b 100644 --- a/src/components/asignaturas/detalle/MateriaDetailPage.tsx +++ b/src/components/asignaturas/detalle/MateriaDetailPage.tsx @@ -1,123 +1,117 @@ - -import { useCallback, useState } from 'react' -import { Link } from '@tanstack/react-router' +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 { ArrowLeft, GraduationCap, Edit2, Save, Pencil } from 'lucide-react' import { ContenidoTematico } from './ContenidoTematico' import { BibliographyItem } from './BibliographyItem' import { IAMateriaTab } from './IAMateriaTab' -import type { +import type { CampoEstructura, - IAMessage, - IASugerencia, - UnidadTematica, -} from '@/types/materia'; + IAMessage, + IASugerencia, + UnidadTematica, +} from '@/types/materia' import { mockMateria, mockEstructura, mockDocumentoSep, - mockHistorial -} from '@/data/mockMateriaData'; + mockHistorial, +} from '@/data/mockMateriaData' import { DocumentoSEPTab } from './DocumentoSEPTab' import { HistorialTab } from './HistorialTab' +import { useSubject } from '@/data/hooks/useSubjects' export interface BibliografiaEntry { - id: string; - tipo: 'BASICA' | 'COMPLEMENTARIA'; - cita: string; - fuenteBibliotecaId?: string; - fuenteBiblioteca?: any; + id: string + tipo: 'BASICA' | 'COMPLEMENTARIA' + cita: string + fuenteBibliotecaId?: string + fuenteBiblioteca?: any } export interface BibliografiaTabProps { - bibliografia: BibliografiaEntry[]; - onSave: (bibliografia: BibliografiaEntry[]) => void; - isSaving: boolean; + 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([]); + 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..."); -}; + // 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]) -const handleAcceptSuggestion = (sugerencia: IASugerencia) => { - // Lógica para actualizar el valor del campo en tu estado de datosGenerales - //toast.success(`Sugerencia aplicada a ${sugerencia.campoNombre}`); -}; + // 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 [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 handleSaveBibliografia = (data: BibliografiaEntry[]) => { + setIsSaving(true) + // Aquí iría tu llamada a la API + setBibliografia(data) - const [isRegenerating, setIsRegenerating] = useState(false); - -const handleRegenerateDocument = useCallback(() => { - setIsRegenerating(true); + // Simulamos un guardado setTimeout(() => { - setIsRegenerating(false); - }, 2000); - }, []); + 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 @@ -127,7 +121,7 @@ const handleRegenerateDocument = useCallback(() => {
- + Ingeniería en Sistemas Computacionales @@ -136,13 +130,13 @@ const handleRegenerateDocument = useCallback(() => {

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

-
+
8 créditos 7° semestre Sistemas Inteligentes @@ -152,10 +146,10 @@ const handleRegenerateDocument = useCallback(() => {
{/* ================= TABS ================= */} -
-
+
+
- + Datos generales Contenido temático Bibliografía @@ -176,22 +170,27 @@ const handleRegenerateDocument = useCallback(() => { - - console.log("Rechazada") /*toast.error("Sugerencia rechazada")*/} - /> + + console.log( + 'Rechazada', + ) /*toast.error("Sugerencia rechazada")*/ + } + /> @@ -206,7 +205,7 @@ const handleRegenerateDocument = useCallback(() => { - +
@@ -218,79 +217,93 @@ const handleRegenerateDocument = useCallback(() => { /* ================= TAB CONTENT ================= */ function DatosGenerales() { + const { data: asignaturasApi, isLoading: loadingAsig } = useSubject( + /*planId*/ '9d4dda6a-488f-428a-8a07-38081592a641', + ) + + console.log(asignaturasApi.datos) + return ( -
- +
{/* Encabezado de la Sección */} -
+
-

Datos Generales

-

+

+ 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 Requisitos */} + - {/* Tarjeta de Evaluación */} - -
+ {/* Tarjeta de Evaluación */} + +
@@ -298,9 +311,9 @@ function DatosGenerales() { } interface InfoCardProps { - title: string, + title: string subtitle?: string - isList?:boolean + isList?: boolean initialContent: any // Puede ser string o array de objetos type?: 'text' | 'list' | 'requirements' | 'evaluation' } @@ -310,23 +323,30 @@ function InfoCard({ title, initialContent, type = 'text' }: InfoCardProps) { 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 + 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) + setData(tempText) setIsEditing(false) } return ( - - {title} + + + {title} + {!isEditing && ( - )} @@ -335,14 +355,22 @@ function InfoCard({ title, initialContent, type = 'text' }: InfoCardProps) { {isEditing ? (
-