"use client"; import { transferBetweenAccountsAction } from "@/app/(dashboard)/contas/actions"; import type { AccountData } from "@/app/(dashboard)/contas/data"; import { Button } from "@/components/ui/button"; import { CurrencyInput } from "@/components/ui/currency-input"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { useControlledState } from "@/hooks/use-controlled-state"; import { formatDateForDb } from "@/lib/utils/date"; import { useMemo, useState, useTransition } from "react"; import { toast } from "sonner"; interface TransferDialogProps { trigger?: React.ReactNode; accounts: AccountData[]; fromAccountId: string; currentPeriod: string; open?: boolean; onOpenChange?: (open: boolean) => void; } export function TransferDialog({ trigger, accounts, fromAccountId, currentPeriod, open, onOpenChange, }: TransferDialogProps) { const [dialogOpen, setDialogOpen] = useControlledState( open, false, onOpenChange ); const [isPending, startTransition] = useTransition(); const [errorMessage, setErrorMessage] = useState(null); // Form state const [toAccountId, setToAccountId] = useState(""); const [amount, setAmount] = useState(""); const [date, setDate] = useState(formatDateForDb(new Date())); const [period, setPeriod] = useState(currentPeriod); // Available destination accounts (exclude source account) const availableAccounts = useMemo( () => accounts.filter((account) => account.id !== fromAccountId), [accounts, fromAccountId] ); // Source account info const fromAccount = useMemo( () => accounts.find((account) => account.id === fromAccountId), [accounts, fromAccountId] ); const handleSubmit = (event: React.FormEvent) => { event.preventDefault(); setErrorMessage(null); if (!toAccountId) { setErrorMessage("Selecione a conta de destino."); return; } if (toAccountId === fromAccountId) { setErrorMessage("Selecione uma conta de destino diferente da origem."); return; } if (!amount || parseFloat(amount.replace(",", ".")) <= 0) { setErrorMessage("Informe um valor válido maior que zero."); return; } startTransition(async () => { const result = await transferBetweenAccountsAction({ fromAccountId, toAccountId, amount, date: new Date(date), period, }); if (result.success) { toast.success(result.message); setDialogOpen(false); // Reset form setToAccountId(""); setAmount(""); setDate(formatDateForDb(new Date())); setPeriod(currentPeriod); return; } setErrorMessage(result.error); toast.error(result.error); }); }; return ( {trigger ? {trigger} : null} Transferir entre contas Registre uma transferência de valores entre suas contas.
setDate(e.target.value)} required />
setPeriod(e.target.value)} placeholder="AAAA-MM" required />
{availableAccounts.length === 0 ? (
É necessário ter mais de uma conta cadastrada para realizar transferências.
) : ( )}
{errorMessage && (

{errorMessage}

)}
); }