Que sirvan la redirección de la IA

fix #192
This commit is contained in:
2026-03-25 09:38:09 -06:00
parent 75784658bf
commit 0e710f9637
2 changed files with 56 additions and 19 deletions
@@ -318,6 +318,7 @@ function DatosGenerales({
<div className="space-y-6"> <div className="space-y-6">
{/* Tarjeta de Requisitos */} {/* Tarjeta de Requisitos */}
<InfoCard <InfoCard
asignaturaId={asignaturaId}
title="Requisitos y Seriación" title="Requisitos y Seriación"
type="requirements" type="requirements"
initialContent={pre} initialContent={pre}
@@ -342,6 +343,7 @@ function DatosGenerales({
{/* Tarjeta de Evaluación */} {/* Tarjeta de Evaluación */}
<InfoCard <InfoCard
asignaturaId={asignaturaId}
title="Sistema de Evaluación" title="Sistema de Evaluación"
type="evaluation" type="evaluation"
initialContent={criteriosEvaluacion} initialContent={criteriosEvaluacion}
@@ -517,16 +519,25 @@ function InfoCard({
} }
const handleIARequest = (campoClave: string) => { const handleIARequest = (campoClave: string) => {
console.log(placeholder) console.log(campoClave)
let targetClave = campoClave
if (type === 'evaluation' && !targetClave) {
targetClave = 'criterios_de_evaluacion'
}
if (targetClave === 'contenido') {
targetClave = 'contenido_tematico'
}
console.log(targetClave)
console.log(asignaturaId)
// Añadimos un timestamp a la state para forzar que la navegación
// genere una nueva ubicación incluso si la ruta y los params son iguales.
navigate({ navigate({
to: '/planes/$planId/asignaturas/$asignaturaId/iaasignatura', to: '/planes/$planId/asignaturas/$asignaturaId/iaasignatura',
params: { planId, asignaturaId: asignaturaId! }, params: { planId, asignaturaId: asignaturaId! },
state: { state: {
activeTab: 'ia', activeTab: 'ia',
prefillCampo: campoClave, prefillCampo: targetClave,
prefillContenido: data, prefillContenido: data,
_ts: Date.now(), _ts: Date.now(),
} as any, } as any,
@@ -581,19 +592,21 @@ function InfoCard({
{!isEditing && ( {!isEditing && (
<div className="flex gap-1"> <div className="flex gap-1">
<Tooltip> {type !== 'requirements' && (
<TooltipTrigger asChild> <Tooltip>
<Button <TooltipTrigger asChild>
variant="ghost" <Button
size="icon" variant="ghost"
className="h-8 w-8 text-blue-500 hover:bg-blue-100" size="icon"
onClick={() => clave && handleIARequest(clave)} className="h-8 w-8 text-blue-500 hover:bg-blue-100"
> onClick={() => handleIARequest(clave)}
<Sparkles className="h-4 w-4" /> >
</Button> <Sparkles className="h-4 w-4" />
</TooltipTrigger> </Button>
<TooltipContent>Mejorar con IA</TooltipContent> </TooltipTrigger>
</Tooltip> <TooltipContent>Mejorar con IA</TooltipContent>
</Tooltip>
)}
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
@@ -1,5 +1,5 @@
import { useQueryClient } from '@tanstack/react-query' import { useQueryClient } from '@tanstack/react-query'
import { useParams } from '@tanstack/react-router' import { useLocation, useParams } from '@tanstack/react-router'
import { import {
Sparkles, Sparkles,
Send, Send,
@@ -58,7 +58,7 @@ export function IAAsignaturaTab() {
const { asignaturaId } = useParams({ const { asignaturaId } = useParams({
from: '/planes/$planId/asignaturas/$asignaturaId', from: '/planes/$planId/asignaturas/$asignaturaId',
}) })
const location = useLocation()
// --- ESTADOS --- // --- ESTADOS ---
const [activeChatId, setActiveChatId] = useState<string | undefined>( const [activeChatId, setActiveChatId] = useState<string | undefined>(
undefined, undefined,
@@ -269,6 +269,30 @@ export function IAAsignaturaTab() {
) )
}, [availableFields, input, showSuggestions]) }, [availableFields, input, showSuggestions])
useEffect(() => {
const state = location.state as any
// Verificamos si existe el timestamp (_ts) para saber que es una acción nueva
if (state?.activeTab === 'ia' && state?._ts) {
// Si el campo no está ya seleccionado, lo agregamos
if (state.prefillCampo) {
const fieldToSelect = availableFields.find(
(f) => f.key === state.prefillCampo,
)
if (fieldToSelect) {
setSelectedFields([fieldToSelect]) // Reemplaza o añade según prefieras
// Generamos un prompt inicial automático
const autoPrompt = `Mejora el contenido de: ${fieldToSelect.label}`
setInput(autoPrompt)
// Opcional: Si quieres que dispare la IA inmediatamente al llegar:
// handleSend(autoPrompt)
}
}
}
}, [location.state, availableFields])
// 2. Efecto para cerrar con ESC // 2. Efecto para cerrar con ESC
useEffect(() => { useEffect(() => {
const handleKeyDown = (e: KeyboardEvent) => { const handleKeyDown = (e: KeyboardEvent) => {