From 3be15d3b153b29775531caad0c912f1b5a84f163 Mon Sep 17 00:00:00 2001 From: lucas Date: Fri, 22 May 2026 21:30:48 -0300 Subject: [PATCH] feat(transactions): adiciona dialogo de confirmacao ao descartar lancamentos massivos Quando o usuario tenta fechar ou cancelar o dialogo de multiplos lancamentos com dados ainda nao salvos, agora exibe um ConfirmActionDialog pedindo confirmacao. Evita perda acidental de dados preenchidos. Co-Authored-By: Claude Opus 4.7 --- .../components/dialogs/mass-add-dialog.tsx | 103 +++++++++++++++--- 1 file changed, 88 insertions(+), 15 deletions(-) diff --git a/src/features/transactions/components/dialogs/mass-add-dialog.tsx b/src/features/transactions/components/dialogs/mass-add-dialog.tsx index 51976e0..f666d41 100644 --- a/src/features/transactions/components/dialogs/mass-add-dialog.tsx +++ b/src/features/transactions/components/dialogs/mass-add-dialog.tsx @@ -8,6 +8,7 @@ import { PAYMENT_METHODS, type TRANSACTION_TYPES, } from "@/features/transactions/lib/constants"; +import { ConfirmActionDialog } from "@/shared/components/confirm-action-dialog"; import { Button } from "@/shared/components/ui/button"; import { CurrencyInput } from "@/shared/components/ui/currency-input"; import { DatePicker } from "@/shared/components/ui/date-picker"; @@ -148,6 +149,9 @@ export function MassAddDialog({ defaultCardId, }: MassAddDialogProps) { const [loading, setLoading] = useState(false); + const [isDirty, setIsDirty] = useState(false); + const [confirmCloseOpen, setConfirmCloseOpen] = useState(false); + const [cancelConfirmOpen, setCancelConfirmOpen] = useState(false); // Fixed fields state (sempre ativos, sem checkboxes) const [transactionType, setTransactionType] = @@ -179,11 +183,22 @@ export function MassAddDialog({ return groupAndSortCategories(filtered); }, [categoryOptions, transactionType]); + const resetForm = () => { + setTransactionType("Despesa"); + setPaymentMethod(PAYMENT_METHODS[0]); + setPeriod(selectedPeriod); + setContaId(undefined); + setCartaoId(defaultCardId ?? undefined); + setTransactions([createEmptyTransactionRow(defaultPayerId)]); + setIsDirty(false); + }; + const addTransaction = () => { setTransactions([ ...transactions, createEmptyTransactionRow(defaultPayerId), ]); + setIsDirty(true); }; const removeTransaction = (id: string) => { @@ -192,6 +207,7 @@ export function MassAddDialog({ return; } setTransactions(transactions.filter((t) => t.id !== id)); + setIsDirty(true); }; const updateTransaction = ( @@ -202,6 +218,7 @@ export function MassAddDialog({ setTransactions( transactions.map((t) => (t.id === id ? { ...t, [field]: value } : t)), ); + setIsDirty(true); }; const handleSubmit = async () => { @@ -250,13 +267,7 @@ export function MassAddDialog({ try { await onSubmit(formData); onOpenChange(false); - // Reset form - setTransactionType("Despesa"); - setPaymentMethod(PAYMENT_METHODS[0]); - setPeriod(selectedPeriod); - setContaId(undefined); - setCartaoId(defaultCardId ?? undefined); - setTransactions([createEmptyTransactionRow(defaultPayerId)]); + resetForm(); } catch (_error) { // Error is handled by the onSubmit function } finally { @@ -265,7 +276,19 @@ export function MassAddDialog({ }; return ( - + { + if (!newOpen && isDirty) { + setConfirmCloseOpen(true); + } else { + onOpenChange(newOpen); + if (newOpen === false) { + resetForm(); + } + } + }} + > Adicionar múltiplos lançamentos @@ -286,9 +309,10 @@ export function MassAddDialog({ { + setCartaoId(value); + setIsDirty(true); + }} disabled={isLockedToCartao} > @@ -395,7 +423,10 @@ export function MassAddDialog({ {cardId ? ( { + setPeriod(value); + setIsDirty(true); + }} /> ) : null} @@ -405,7 +436,13 @@ export function MassAddDialog({ {!isCartaoSelected ? (
- { + setContaId(value); + setIsDirty(true); + }} + > {accountId && @@ -635,7 +672,13 @@ export function MassAddDialog({ + + { + setConfirmCloseOpen(false); + onOpenChange(false); + resetForm(); + }} + /> + + { + setCancelConfirmOpen(false); + onOpenChange(false); + resetForm(); + }} + />
);