// frontend/src/components/GestionComponentes.tsx import { useState, useEffect } from 'react'; import toast from 'react-hot-toast'; import styles from './SimpleTable.module.css'; import { adminService } from '../services/apiService'; // Interfaces para los diferentes tipos de datos interface TextValue { valor: string; conteo: number; } interface RamValue { fabricante?: string; tamano: number; velocidad?: number; conteo: number; } const GestionComponentes = () => { const [componentType, setComponentType] = useState('os'); const [valores, setValores] = useState<(TextValue | RamValue)[]>([]); const [isLoading, setIsLoading] = useState(false); const [isModalOpen, setIsModalOpen] = useState(false); const [valorAntiguo, setValorAntiguo] = useState(''); const [valorNuevo, setValorNuevo] = useState(''); useEffect(() => { setIsLoading(true); adminService.getComponentValues(componentType) .then(data => { setValores(data); }) .catch(_err => { toast.error(`No se pudieron cargar los datos de ${componentType}.`); }) .finally(() => setIsLoading(false)); }, [componentType]); const handleOpenModal = (valor: string) => { setValorAntiguo(valor); setValorNuevo(valor); setIsModalOpen(true); }; const handleUnificar = async () => { const toastId = toast.loading('Unificando valores...'); try { await adminService.unifyComponentValues(componentType, valorAntiguo, valorNuevo); const refreshedData = await adminService.getComponentValues(componentType); setValores(refreshedData); toast.success('Valores unificados correctamente.', { id: toastId }); setIsModalOpen(false); } catch (error) { if (error instanceof Error) toast.error(error.message, { id: toastId }); } }; // 2. FUNCIÓN DELETE ACTUALIZADA: Ahora maneja un grupo const handleDeleteRam = async (ramGroup: RamValue) => { if (!window.confirm("¿Estás seguro de eliminar todas las entradas maestras para este tipo de RAM? Esta acción es irreversible.")) { return; } const toastId = toast.loading('Eliminando grupo de módulos...'); try { // El servicio ahora espera el objeto del grupo await adminService.deleteRamComponent({ fabricante: ramGroup.fabricante, tamano: ramGroup.tamano, velocidad: ramGroup.velocidad }); setValores(prev => prev.filter(v => { const currentRam = v as RamValue; return !(currentRam.fabricante === ramGroup.fabricante && currentRam.tamano === ramGroup.tamano && currentRam.velocidad === ramGroup.velocidad); })); toast.success("Grupo de módulos de RAM eliminado.", { id: toastId }); } catch (error) { if (error instanceof Error) toast.error(error.message, { id: toastId }); } }; const handleDeleteTexto = async (valor: string) => { if (!window.confirm(`Este valor ya no está en uso. ¿Quieres eliminarlo de la base de datos maestra?`)) { return; } const toastId = toast.loading('Eliminando valor...'); try { await adminService.deleteTextComponent(componentType, valor); setValores(prev => prev.filter(v => (v as TextValue).valor !== valor)); toast.success("Valor eliminado.", { id: toastId }); } catch (error) { if (error instanceof Error) toast.error(error.message, { id: toastId }); } }; const renderValor = (item: TextValue | RamValue) => { if (componentType === 'ram') { const ram = item as RamValue; return `${ram.fabricante || 'Desconocido'} ${ram.tamano}GB ${ram.velocidad ? ram.velocidad + 'MHz' : ''}`; } return (item as TextValue).valor; }; return (
Unifica valores inconsistentes y elimina registros no utilizados.
Cargando...
) : (| Valor Registrado | Nº de Equipos | Acciones | 
|---|---|---|
| {renderValor(item)} | {item.conteo} | 
                                        {componentType === 'ram' ? (
                                            
                                        ) : (
                                            <>
                                                
                                                
                                            >
                                        )}
                                     | 
Se reemplazarán todas las instancias de:
{valorAntiguo} setValorNuevo(e.target.value)} className={styles.modalInput} />