import { createFileRoute, useNavigate } from '@tanstack/react-router' import { Pencil, Check, X, Sparkles, AlertCircle } from 'lucide-react' import { useState, useEffect } from 'react' import type { DatosGeneralesField } from '@/types/plan' import { Button } from '@/components/ui/button' import { Textarea } from '@/components/ui/textarea' import { usePlan } from '@/data' // import { toast } from 'sonner' // Asegúrate de tener sonner instalado o quita la línea export const Route = createFileRoute('/planes/$planId/_detalle/datos')({ component: DatosGeneralesPage, }) const formatLabel = (key: string) => { const result = key.replace(/_/g, ' ') return result.charAt(0).toUpperCase() + result.slice(1) } function DatosGeneralesPage() { const { planId } = Route.useParams() const { data } = usePlan(planId) const navigate = useNavigate() // Inicializamos campos como un arreglo vacío const [campos, setCampos] = useState>([]) const [editingId, setEditingId] = useState(null) const [editValue, setEditValue] = useState('') // Efecto para transformar data?.datos en el arreglo de campos useEffect(() => { // 2. Validación de seguridad para sourceData const sourceData = data?.datos if (sourceData && typeof sourceData === 'object') { const datosTransformados: Array = Object.entries( sourceData, ).map(([key, value], index) => ({ id: (index + 1).toString(), label: formatLabel(key), // Forzamos el valor a string de forma segura value: typeof value === 'string' ? value : value?.toString() || '', requerido: true, tipo: 'texto', })) setCampos(datosTransformados) } console.log(data) }, [data]) // 3. Manejadores de acciones (Ahora como funciones locales) const handleEdit = (campo: DatosGeneralesField) => { setEditingId(campo.id) setEditValue(campo.value) } const handleCancel = () => { setEditingId(null) setEditValue('') } const handleSave = (id: string) => { // Actualizamos el estado local de la lista setCampos((prev) => prev.map((c) => (c.id === id ? { ...c, value: editValue } : c)), ) setEditingId(null) setEditValue('') // toast.success('Cambios guardados localmente') } const handleIARequest = (descripcion: string) => { navigate({ to: '/planes/$planId/iaplan', params: { planId: '1', // o dinámico }, state: { prefill: descripcion, } as any, }) } return (

Datos Generales del Plan

Información estructural y descriptiva del plan de estudios

{campos.map((campo) => { const isEditing = editingId === campo.id return (
{/* Header de la Card */}

{campo.label}

{campo.requerido && ( * )}
{!isEditing && (
)}
{/* Contenido de la Card */}
{isEditing ? (