import React, { useState, useEffect } from "react"; import { OrderItem } from "../types"; import ConfirmDialog from "./ConfirmDialog"; interface CartDrawerProps { isOpen: boolean; onClose: () => void; items: OrderItem[]; onUpdateQuantity: (id: string, delta: number) => void; onRemove: (id: string) => void; onCheckout: () => void; onNewOrder?: () => void; onNavigate?: (path: string) => void; } const CartDrawer: React.FC = ({ isOpen, onClose, items, onUpdateQuantity, onRemove, onCheckout, onNewOrder, onNavigate, }) => { const [isAnimating, setIsAnimating] = useState(false); const [shouldRender, setShouldRender] = useState(false); const [confirmDialog, setConfirmDialog] = useState<{ isOpen: boolean; itemId: string; productName: string; }>({ isOpen: false, itemId: "", productName: "", }); const [showNewOrderDialog, setShowNewOrderDialog] = useState(false); const [showContinueOrNewDialog, setShowContinueOrNewDialog] = useState(false); const total = items.reduce( (acc, item) => acc + item.price * item.quantity, 0 ); // Controlar renderização e animação useEffect(() => { if (isOpen) { setShouldRender(true); // Pequeno delay para garantir que o DOM está pronto antes de iniciar a animação setTimeout(() => setIsAnimating(true), 10); } else { // Iniciar animação de saída setIsAnimating(false); // Remover do DOM após a animação terminar const timer = setTimeout(() => setShouldRender(false), 400); // Duração da animação return () => clearTimeout(timer); } }, [isOpen]); // Não renderizar se não deve estar visível if (!shouldRender) return null; const handleClose = () => { // Chamar onClose imediatamente para atualizar o estado // O useEffect vai cuidar da animação de saída onClose(); }; // Verificar se há carrinho (itens no carrinho) const hasCart = () => { return items.length > 0 || localStorage.getItem("cart"); }; // Verificar se há dados do pedido atual const hasOrderData = () => { const hasCartItems = items.length > 0; const hasCustomer = localStorage.getItem("customer"); const hasAddress = localStorage.getItem("address"); const hasPaymentPlan = localStorage.getItem("paymentPlan"); const hasBilling = localStorage.getItem("billing"); const hasDataDelivery = localStorage.getItem("dataDelivery"); const hasInvoiceStore = localStorage.getItem("invoiceStore"); const hasPartner = localStorage.getItem("partner"); return ( hasCartItems || hasCustomer || hasAddress || hasPaymentPlan || hasBilling || hasDataDelivery || hasInvoiceStore || hasPartner ); }; const handleNewOrderClick = () => { // Se houver carrinho, perguntar se quer continuar ou iniciar novo if (hasCart()) { setShowContinueOrNewDialog(true); return; } // Se não houver carrinho mas houver outros dados, mostrar confirmação normal if (hasOrderData()) { setShowNewOrderDialog(true); return; } // Se não houver nenhum dado, limpar direto sem confirmação if (onNewOrder) { onNewOrder(); handleClose(); } }; const handleContinueOrder = () => { // Fechar o dialog e navegar para /sales/home setShowContinueOrNewDialog(false); handleClose(); // Fechar o drawer também window.location.href = "/#/sales/home"; }; const handleStartNewOrder = () => { // Fechar o dialog de continuar/iniciar e abrir o de confirmação setShowContinueOrNewDialog(false); setShowNewOrderDialog(true); }; const handleConfirmNewOrder = () => { if (onNewOrder) { onNewOrder(); setShowNewOrderDialog(false); handleClose(); } }; return (
{/* Overlay */}
{/* Panel - Fullscreen em mobile, sidebar em desktop */}
Seu Carrinho

{items.length} {items.length === 1 ? "Produto" : "Produtos"}

{items.length === 0 ? (

Seu carrinho está vazio

Adicione produtos para começar.

) : ( items.map((item) => (
{item.image && item.image.trim() !== "" ? ( {item.name} ) : ( )}
{item.name}
R$ {item.price.toFixed(2)}
{item.quantity}
)) )}
{items.length > 0 && (
Total do Pedido R$ {total.toFixed(2)}
{onNewOrder && ( )}
)}
{/* Dialog de Confirmação - Remover Item */} setConfirmDialog({ isOpen: false, itemId: "", productName: "" }) } onConfirm={() => { onRemove(confirmDialog.itemId); setConfirmDialog({ isOpen: false, itemId: "", productName: "" }); }} type="delete" message={ <> Deseja remover o produto{" "} "{confirmDialog.productName}" {" "} do carrinho?
Esta ação não pode ser desfeita. } /> {/* Dialog - Continuar ou Iniciar Novo Pedido */} Você já possui um carrinho com itens.

Deseja iniciar um novo pedido e limpar todos os dados do pedido atual? } confirmText="Iniciar Novo Pedido" cancelText="Cancelar" /> {/* Dialog de Confirmação - Novo Pedido */} setShowNewOrderDialog(false)} onConfirm={handleConfirmNewOrder} type="warning" title="Novo Pedido" message={ <> Deseja iniciar um novo pedido?

Todos os dados do pedido atual serão perdidos:
  • Itens do carrinho
  • Dados do cliente
  • Endereço de entrega
  • Plano de pagamento
  • Dados financeiros
  • Informações de entrega

Esta ação não pode ser desfeita. } confirmText="Sim, Iniciar Novo Pedido" cancelText="Cancelar" />
); }; export default CartDrawer;