/* eslint-disable jsx-a11y/click-events-have-key-events */ /* eslint-disable jsx-a11y/label-has-associated-control */ /* eslint-disable jsx-a11y/no-static-element-interactions */ import { useParams } from '@tanstack/react-router' import { Plus, Search, BookOpen, Trash2, Library, Edit3 } from 'lucide-react' import { useState } from 'react' import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from '@/components/ui/alert-dialog' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Card, CardContent } from '@/components/ui/card' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, } from '@/components/ui/dialog' import { Input } from '@/components/ui/input' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' import { Textarea } from '@/components/ui/textarea' import { useCreateBibliografia, useDeleteBibliografia, useSubjectBibliografia, useUpdateBibliografia, } from '@/data/hooks/useSubjects' import { cn } from '@/lib/utils' // --- Interfaces --- export interface BibliografiaEntry { id: string tipo: 'BASICA' | 'COMPLEMENTARIA' cita: string tipo_fuente?: 'MANUAL' | 'BIBLIOTECA' biblioteca_item_id?: string | null fuenteBibliotecaId?: string fuenteBiblioteca?: any } export function BibliographyItem() { const { asignaturaId } = useParams({ from: '/planes/$planId/asignaturas/$asignaturaId', }) // --- 1. Única fuente de verdad: La Query --- const { data: bibliografia = [], isLoading } = useSubjectBibliografia(asignaturaId) // --- 2. Mutaciones --- const { mutate: crearBibliografia } = useCreateBibliografia() const { mutate: actualizarBibliografia } = useUpdateBibliografia(asignaturaId) const { mutate: eliminarBibliografia } = useDeleteBibliografia(asignaturaId) // --- 3. Estados de UI (Solo para diálogos y edición) --- const [isAddDialogOpen, setIsAddDialogOpen] = useState(false) const [isLibraryDialogOpen, setIsLibraryDialogOpen] = useState(false) const [deleteId, setDeleteId] = useState(null) const [editingId, setEditingId] = useState(null) const [newEntryType, setNewEntryType] = useState<'BASICA' | 'COMPLEMENTARIA'>( 'BASICA', ) console.log('Datos actuales en el front:', bibliografia) // --- 4. Derivación de datos (Se calculan en cada render) --- const basicaEntries = bibliografia.filter((e) => e.tipo === 'BASICA') const complementariaEntries = bibliografia.filter( (e) => e.tipo === 'COMPLEMENTARIA', ) // --- Handlers Conectados a la Base de Datos --- const handleAddManual = (cita: string) => { crearBibliografia( { asignatura_id: asignaturaId, tipo: newEntryType, cita, tipo_fuente: 'MANUAL', }, { onSuccess: () => setIsAddDialogOpen(false), }, ) } const handleAddFromLibrary = ( resource: any, tipo: 'BASICA' | 'COMPLEMENTARIA', ) => { const cita = `${resource.autor} (${resource.anio}). ${resource.titulo}. ${resource.editorial}.` crearBibliografia( { asignatura_id: asignaturaId, tipo, cita, tipo_fuente: 'BIBLIOTECA', biblioteca_item_id: resource.id, }, { onSuccess: () => setIsLibraryDialogOpen(false), }, ) } const handleUpdateCita = (id: string, nuevaCita: string) => { actualizarBibliografia( { id, updates: { cita: nuevaCita }, }, { onSuccess: () => setEditingId(null), }, ) } const onConfirmDelete = () => { if (deleteId) { eliminarBibliografia(deleteId, { onSuccess: () => setDeleteId(null), }) } } if (isLoading) return
Cargando bibliografía...
return (

Bibliografía

{basicaEntries.length} básica • {complementariaEntries.length}{' '} complementaria

e.biblioteca_item_id || '', )} />
{/* BASICA */}

Bibliografía Básica

{basicaEntries.map((entry) => ( setEditingId(entry.id)} onStopEditing={() => setEditingId(null)} onUpdateCita={handleUpdateCita} onDelete={() => setDeleteId(entry.id)} /> ))}
{/* COMPLEMENTARIA */}

Bibliografía Complementaria

{complementariaEntries.map((entry) => ( setEditingId(entry.id)} onStopEditing={() => setEditingId(null)} onUpdateCita={handleUpdateCita} onDelete={() => setDeleteId(entry.id)} /> ))}
setDeleteId(null)}> ¿Eliminar referencia? La referencia será quitada del plan de estudios. Cancelar Eliminar
) } // --- Subcomponentes --- function BibliografiaCard({ entry, isEditing, onEdit, onStopEditing, onUpdateCita, onDelete, }: any) { const [localCita, setLocalCita] = useState(entry.cita) return (
{isEditing ? (