import React, { useState, useEffect } from 'react'; import { View, Product, OrderItem } from './types'; import LoginView from './views/LoginView'; import HomeMenuView from './views/HomeMenuView'; import SalesDashboardView from './views/SalesDashboardView'; import ProductSearchView from './views/ProductSearchView'; import CheckoutView from './views/CheckoutView'; import Header from './components/Header'; import CartDrawer from './components/CartDrawer'; import ConfirmDialog from './components/ConfirmDialog'; import { useAuth } from './src/contexts/AuthContext'; import { useCart } from './src/hooks/useCart'; import { shoppingService } from './src/services/shopping.service'; const App: React.FC = () => { const { isAuthenticated, isLoading, logout: authLogout, user } = useAuth(); const { cart, isLoading: isCartLoading, addToCart, updateQuantity, removeFromCart, refreshCart, clearCart, } = useCart(); const [currentView, setCurrentView] = useState(View.LOGIN); const [isCartOpen, setIsCartOpen] = useState(false); const [showLogoutConfirm, setShowLogoutConfirm] = useState(false); // Redirecionar baseado no estado de autenticação useEffect(() => { console.log('Auth state changed:', { isAuthenticated, isLoading, user: !!user }); if (!isLoading) { if (isAuthenticated && user) { console.log('Redirecionando para HOME_MENU'); setCurrentView(View.HOME_MENU); } else if (!isAuthenticated) { console.log('Redirecionando para LOGIN'); setCurrentView(View.LOGIN); } } }, [isAuthenticated, isLoading, user]); // Recarregar carrinho quando navegar para a página de produtos (como no Angular) useEffect(() => { if (currentView === View.PRODUCT_SEARCH && isAuthenticated && user) { console.log('🛒 [APP] Navegando para ProductSearchView, recarregando carrinho...'); const cartId = shoppingService.getCart(); if (cartId) { console.log('🛒 [APP] CartId encontrado, chamando refreshCart:', cartId); refreshCart(); } else { console.log('🛒 [APP] Nenhum cartId encontrado no localStorage'); } } }, [currentView, isAuthenticated, user, refreshCart]); const handleLogin = () => { // Login é gerenciado pelo LoginView através do contexto if (isAuthenticated) { setCurrentView(View.HOME_MENU); } }; const handleLogout = () => { // Mostrar confirmação antes de fazer logout setShowLogoutConfirm(true); }; const executeLogout = () => { console.log("🚪 [APP] Iniciando processo de logout..."); // 1. Limpar carrinho usando o hook clearCart(); console.log("🚪 [APP] Estado do carrinho limpo"); // 2. Limpar dados de autenticação (token, user) do localStorage e contexto authLogout(); console.log("🚪 [APP] Dados de autenticação removidos"); // 3. Redirecionar para login setCurrentView(View.LOGIN); console.log("🚪 [APP] Redirecionado para tela de login"); setShowLogoutConfirm(false); }; // Handler para novo pedido - limpa todos os dados do pedido atual const handleNewOrder = () => { console.log("🆕 [APP] Iniciando novo pedido..."); // 1. Limpar carrinho usando o hook clearCart(); console.log("🆕 [APP] Estado do carrinho limpo"); // 2. Limpar todos os dados do localStorage relacionados ao pedido shoppingService.clearShoppingData(); console.log("🆕 [APP] Dados do pedido limpos do localStorage"); // 3. Fechar o carrinho se estiver aberto setIsCartOpen(false); // 4. Redirecionar para a página de produtos se não estiver lá if (currentView !== View.PRODUCT_SEARCH) { setCurrentView(View.PRODUCT_SEARCH); } console.log("🆕 [APP] Novo pedido iniciado com sucesso"); }; // Handler para adicionar item ao carrinho const handleAddToCart = async (product: Product | OrderItem) => { try { await addToCart(product); // Abrir o carrinho automaticamente ao adicionar setIsCartOpen(true); } catch (error: any) { console.error('🛒 [APP] Erro ao adicionar item ao carrinho:', error); // O hook já trata o erro, apenas logamos aqui } }; const renderView = () => { const isDashboardOrSearch = currentView === View.SALES_DASHBOARD || currentView === View.PRODUCT_SEARCH || currentView === View.CHECKOUT; return (
{isDashboardOrSearch && user && (
acc + i.quantity, 0)} onCartClick={() => setIsCartOpen(true)} onLogout={handleLogout} /> )}
{(() => { switch (currentView) { case View.LOGIN: return ; case View.HOME_MENU: return user ? ( ) : null; case View.SALES_DASHBOARD: return ; case View.PRODUCT_SEARCH: return ; case View.CHECKOUT: return ( setCurrentView(View.PRODUCT_SEARCH)} onCartUpdate={refreshCart} onClearCart={clearCart} /> ); default: return ; } })()}
{/* Carrinho Global */} setIsCartOpen(false)} items={cart} onUpdateQuantity={updateQuantity} onRemove={removeFromCart} onCheckout={() => { setIsCartOpen(false); setCurrentView(View.CHECKOUT); }} onNewOrder={handleNewOrder} />
); }; return (
{/* Meta tag para mobile app-like experience */} {renderView()} {/* Confirmação de Logout */} setShowLogoutConfirm(false)} confirmText="Sair" cancelText="Cancelar" />
); }; export default App;