import React, { useState, useEffect } from 'react'; import { Plus, Edit, Trash2, UtensilsCrossed, Table, ClipboardList } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Badge } from '@/components/ui/badge'; import { useToast } from '@/hooks/use-toast'; import { apiClient } from '@/services/adminApi'; const RestaurantPOS = () => { const [establishments, setEstablishments] = useState([]); const [selectedEstablishment, setSelectedEstablishment] = useState(''); const [menuItems, setMenuItems] = useState([]); const [tables, setTables] = useState([]); const [orders, setOrders] = useState([]); const [loading, setLoading] = useState(false); const { toast } = useToast(); const [menuForm, setMenuForm] = useState({ name: '', description: '', category: '', price: 0, isAvailable: true }); const [tableForm, setTableForm] = useState({ tableNumber: '', capacity: 4, status: 'available' }); useEffect(() => { loadEstablishments(); }, []); useEffect(() => { if (selectedEstablishment) { loadRestaurantData(); } }, [selectedEstablishment]); const loadEstablishments = async () => { try { const response = await apiClient.get('/commerce/establishments?type=restaurant'); setEstablishments(Array.isArray(response) ? response : (response as any)?.establishments || []); } catch (error) { console.error('Error loading establishments:', error); } }; const loadRestaurantData = async () => { if (!selectedEstablishment) return; setLoading(true); try { const [menuData, tablesData, ordersData] = await Promise.all([ apiClient.get(`/restaurant/establishments/${selectedEstablishment}/menu`), apiClient.get(`/restaurant/establishments/${selectedEstablishment}/tables`), apiClient.get(`/restaurant/establishments/${selectedEstablishment}/orders`) ]); setMenuItems(Array.isArray(menuData) ? menuData : (menuData as any)?.items || []); setTables(Array.isArray(tablesData) ? tablesData : (tablesData as any)?.tables || []); setOrders(Array.isArray(ordersData) ? ordersData : (ordersData as any)?.orders || []); } catch (error) { console.error('Error loading restaurant data:', error); } finally { setLoading(false); } }; const handleCreateMenuItem = async () => { try { await apiClient.post('/restaurant/menu-items', { ...menuForm, establishmentId: parseInt(selectedEstablishment) }); toast({ title: 'Éxito', description: 'Ítem de menú creado' }); setMenuForm({ name: '', description: '', category: '', price: 0, isAvailable: true }); loadRestaurantData(); } catch (error: any) { toast({ title: 'Error', description: error?.message || 'No se pudo crear el ítem', variant: 'destructive' }); } }; const handleDeleteMenuItem = async (id: number) => { try { await apiClient.delete(`/restaurant/menu-items/${id}`); toast({ title: 'Éxito', description: 'Ítem eliminado' }); loadRestaurantData(); } catch (error) { toast({ title: 'Error', description: 'No se pudo eliminar', variant: 'destructive' }); } }; const handleCreateTable = async () => { try { await apiClient.post('/restaurant/tables', { ...tableForm, establishmentId: parseInt(selectedEstablishment) }); toast({ title: 'Éxito', description: 'Mesa creada' }); setTableForm({ tableNumber: '', capacity: 4, status: 'available' }); loadRestaurantData(); } catch (error: any) { toast({ title: 'Error', description: error?.message || 'No se pudo crear la mesa', variant: 'destructive' }); } }; const handleUpdateTableStatus = async (tableId: number, status: string) => { try { await apiClient.patch(`/restaurant/tables/${tableId}/status`, { status }); toast({ title: 'Éxito', description: 'Estado actualizado' }); loadRestaurantData(); } catch (error) { toast({ title: 'Error', description: 'No se pudo actualizar', variant: 'destructive' }); } }; const handleUpdateOrderStatus = async (orderId: number, status: string) => { try { await apiClient.patch(`/restaurant/orders/${orderId}/status`, { status }); toast({ title: 'Éxito', description: 'Orden actualizada' }); loadRestaurantData(); } catch (error) { toast({ title: 'Error', description: 'No se pudo actualizar', variant: 'destructive' }); } }; return (
{selectedEstablishment && ( Menú Mesas Órdenes
Agregar Ítem al Menú
setMenuForm({ ...menuForm, name: e.target.value })} placeholder="Nombre del plato" />