import React, { useState, useEffect } from "react"; import { OrderItem } from "../../types"; import { shoppingService, ShoppingItem } from "../../src/services/shopping.service"; import { authService } from "../../src/services/auth.service"; interface DiscountItemModalProps { isOpen: boolean; item: OrderItem | null; onClose: () => void; onConfirm: () => void; } const DiscountItemModal: React.FC = ({ isOpen, item, onClose, onConfirm, }) => { const [discount, setDiscount] = useState(0); const [discountValue, setDiscountValue] = useState(0); const [salePrice, setSalePrice] = useState(0); const [listPrice, setListPrice] = useState(0); const [isUpdating, setIsUpdating] = useState(false); const [error, setError] = useState(""); const [isAnimating, setIsAnimating] = useState(false); const [shouldRender, setShouldRender] = useState(false); useEffect(() => { if (item && isOpen) { const initialDiscount = item.discount || 0; const initialListPrice = item.originalPrice || item.price || 0; const initialDiscountValue = item.discountValue || 0; const initialSalePrice = item.price || 0; setDiscount(initialDiscount); setDiscountValue(initialDiscountValue); setSalePrice(initialSalePrice); setListPrice(initialListPrice); setError(""); } }, [item, isOpen]); // Animação de entrada/saída useEffect(() => { if (isOpen) { setShouldRender(true); setTimeout(() => setIsAnimating(true), 10); } else { setIsAnimating(false); const timer = setTimeout(() => setShouldRender(false), 300); return () => clearTimeout(timer); } }, [isOpen]); const calcDiscountValue = () => { if (!item) return; const percent = discount; const newDiscountValue = Number.parseFloat( ((listPrice * percent) / 100).toFixed(2) ); const newSalePrice = Number.parseFloat( (listPrice - newDiscountValue).toFixed(2) ); setDiscountValue(newDiscountValue); setSalePrice(newSalePrice); }; const calcPercentDiscount = () => { if (!item) return; const newPercent = Number.parseFloat((discountValue / listPrice).toFixed(2)) * 100; const newSalePrice = Number.parseFloat( (listPrice - discountValue).toFixed(2) ); setDiscount(newPercent); setSalePrice(newSalePrice); }; const handleConfirm = async () => { if (!item) return; // Validações (paymentPlan já foi validado antes de abrir o modal) const paymentPlan = localStorage.getItem("paymentPlan"); if (!paymentPlan) { setError( "Venda sem plano de pagamento informado, desconto não permitido!" ); return; } try { setIsUpdating(true); setError(""); // Converter OrderItem para ShoppingItem const shoppingItem = shoppingService.productToShoppingItem(item); shoppingItem.id = item.id; shoppingItem.discount = discount; shoppingItem.discountValue = discountValue; shoppingItem.price = salePrice; shoppingItem.userDiscount = authService.getUser(); // Atualizar no backend await shoppingService.updatePriceItemShopping(shoppingItem); setIsAnimating(false); setTimeout(() => { onConfirm(); onClose(); }, 300); } catch (err: any) { setError(err.message || "Erro ao aplicar desconto"); } finally { setIsUpdating(false); } }; const handleCancel = () => { setIsAnimating(false); setTimeout(() => { onClose(); }, 300); }; if (!shouldRender || !item) return null; return (
{/* Overlay */}
{/* Dialog */}
{/* Header */}

Desconto por produto

Desconto sobre item de venda

{/* Content */}
{/* Produto */}
{/* Preço de tabela */}
{/* % Desconto e Valor de desconto */}
{ setDiscount(Number.parseFloat(e.target.value) || 0); }} onBlur={calcDiscountValue} step="0.01" min="0" max="100" className="w-full px-3 py-2 border border-slate-300 rounded-md focus:outline-none focus:ring-2 focus:ring-[#002147]" />
{ setDiscountValue(Number.parseFloat(e.target.value) || 0); }} onBlur={calcPercentDiscount} step="0.01" min="0" className="w-full px-3 py-2 border border-slate-300 rounded-md focus:outline-none focus:ring-2 focus:ring-[#002147]" />
{/* Preço de venda */}
{/* Erro */} {error && (
{error}
)}
{/* Actions */}
); }; export default DiscountItemModal;