import { useEffect, useState } from 'react'; import { Plus, Search, Edit, Trash2, Image as ImageIcon, Printer } from 'lucide-react'; import toast from 'react-hot-toast'; import { productService, categoryService } from '../services'; import ProductModal from '../components/ProductModal'; import PrintLabel from '../components/PrintLabel'; export default function Products() { const [products, setProducts] = useState([]); const [categories, setCategories] = useState([]); const [loading, setLoading] = useState(true); const [modalOpen, setModalOpen] = useState(false); const [printModalOpen, setPrintModalOpen] = useState(false); const [selectedProduct, setSelectedProduct] = useState(null); const [search, setSearch] = useState(''); const [pagination, setPagination] = useState({}); useEffect(() => { loadProducts(); loadCategories(); }, []); const loadProducts = async (searchTerm = '') => { setLoading(true); try { const response = await productService.getAll({ search: searchTerm, limit: 50 }); setProducts(response.data); setPagination(response.pagination); } catch (err) { console.error('Error cargando productos:', err); toast.error('Error cargando productos'); } finally { setLoading(false); } }; const loadCategories = async () => { try { const response = await categoryService.getAll(); setCategories(response.data); } catch (err) { console.error('Error cargando categorías:', err); } }; const handleSearch = (e) => { const value = e.target.value; setSearch(value); if (value.length > 2 || value.length === 0) { loadProducts(value); } }; const handleEdit = (product) => { setSelectedProduct(product); setModalOpen(true); }; const handlePrint = (product) => { setSelectedProduct(product); setPrintModalOpen(true); }; const handleDelete = async (product) => { if (!confirm(`¿Eliminar producto "${product.nombre}"?`)) return; try { await productService.delete(product.id); toast.success('Producto eliminado'); loadProducts(); } catch (err) { console.error('Error eliminando producto:', err); toast.error('Error al eliminar producto'); } }; const handleModalClose = () => { setModalOpen(false); setSelectedProduct(null); loadProducts(); }; const getCategoryName = (categoryId) => { if (!categories || categories.length === 0) return 'Sin categoría'; const category = categories.find(c => c.id === categoryId); return category?.nombre || 'Sin categoría'; }; return (
No hay productos registrados
| Producto | SKU | Categoría | Precio | Stock | Estado | Acciones |
|---|---|---|---|---|---|---|
|
{product.images?.length > 0 ? (
{product.nombre}
|
{product.sku} | {getCategoryName(product.category_id)} | ${product.precio_base.toLocaleString('es-CL')} | {product.stock_disponible || 0} | {product.is_active ? 'Activo' : 'Inactivo'} |
Mostrando {products.length} de {pagination.totalItems} productos