import { useState } from 'react'; import { Plus, Pencil, Trash2, Search, ToggleLeft, ToggleRight } from 'lucide-react'; import { useVendors, useDeleteVendor, useCreateVendor, useUpdateVendor, useToggleVendorActive, } from '../../../hooks/useBidding'; import { Vendor, CreateVendorDto, } from '../../../services/bidding'; import clsx from 'clsx'; export function VendorsPage() { const [search, setSearch] = useState(''); const [activeFilter, setActiveFilter] = useState(''); const [showModal, setShowModal] = useState(false); const [editingItem, setEditingItem] = useState(null); const [deleteConfirm, setDeleteConfirm] = useState(null); const { data, isLoading, error } = useVendors({ isActive: activeFilter === '' ? undefined : activeFilter, businessName: search || undefined, }); const deleteMutation = useDeleteVendor(); const createMutation = useCreateVendor(); const updateMutation = useUpdateVendor(); const toggleActiveMutation = useToggleVendorActive(); const handleDelete = async (id: string) => { await deleteMutation.mutateAsync(id); setDeleteConfirm(null); }; const handleSubmit = async (formData: CreateVendorDto) => { if (editingItem) { await updateMutation.mutateAsync({ id: editingItem.id, data: formData }); } else { await createMutation.mutateAsync(formData); } setShowModal(false); setEditingItem(null); }; const handleToggleActive = async (id: string) => { await toggleActiveMutation.mutateAsync(id); }; const vendors = data?.items || []; return (

Proveedores

Gestion de proveedores y subcontratistas

{/* Filters */}
setSearch(e.target.value)} />
{/* Table */}
{isLoading ? (
Cargando...
) : error ? (
Error al cargar los datos
) : vendors.length === 0 ? (
No hay proveedores
) : ( {vendors.map((item) => ( ))}
Razon Social RFC Contacto Email Telefono Estado Acciones
{item.businessName} {item.rfc || '-'} {item.contactName || '-'} {item.email || '-'} {item.phone || '-'}
)}
{/* Modal */} {showModal && ( { setShowModal(false); setEditingItem(null); }} onSubmit={handleSubmit} isLoading={createMutation.isPending || updateMutation.isPending} /> )} {/* Delete Confirmation */} {deleteConfirm && (

Confirmar eliminacion

¿Esta seguro de eliminar este proveedor? Esta accion no se puede deshacer.

)}
); } // Modal Component interface VendorModalProps { item: Vendor | null; onClose: () => void; onSubmit: (data: CreateVendorDto) => Promise; isLoading: boolean; } function VendorModal({ item, onClose, onSubmit, isLoading }: VendorModalProps) { const [formData, setFormData] = useState({ businessName: item?.businessName || '', rfc: item?.rfc || '', contactName: item?.contactName || '', email: item?.email || '', phone: item?.phone || '', isActive: item?.isActive ?? true, }); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); await onSubmit(formData); }; return (

{item ? 'Editar Proveedor' : 'Nuevo Proveedor'}

setFormData({ ...formData, businessName: e.target.value })} />
setFormData({ ...formData, rfc: e.target.value.toUpperCase() })} />
setFormData({ ...formData, contactName: e.target.value })} />
setFormData({ ...formData, email: e.target.value })} />
setFormData({ ...formData, phone: e.target.value })} />
setFormData({ ...formData, isActive: e.target.checked })} />
); }