"use client"; import { RiAddCircleLine, RiBankLine } from "@remixicon/react"; import Image from "next/image"; import { useRouter } from "next/navigation"; import { useState } from "react"; import { toast } from "sonner"; import { deleteAccountAction } from "@/app/(dashboard)/contas/actions"; import { ConfirmActionDialog } from "@/components/confirm-action-dialog"; import { AccountCard } from "@/components/contas/account-card"; import { EmptyState } from "@/components/empty-state"; import { Button } from "@/components/ui/button"; import { getCurrentPeriod } from "@/lib/utils/period"; import { Card } from "../ui/card"; import { AccountDialog } from "./account-dialog"; import { TransferDialog } from "./transfer-dialog"; import type { Account } from "./types"; interface AccountsPageProps { accounts: Account[]; logoOptions: string[]; isInativos?: boolean; } const resolveLogoSrc = (logo: string | null) => { if (!logo) { return undefined; } const fileName = logo.split("/").filter(Boolean).pop() ?? logo; return `/logos/${fileName}`; }; export function AccountsPage({ accounts, logoOptions, isInativos = false, }: AccountsPageProps) { const router = useRouter(); const [editOpen, setEditOpen] = useState(false); const [selectedAccount, setSelectedAccount] = useState(null); const [removeOpen, setRemoveOpen] = useState(false); const [accountToRemove, setAccountToRemove] = useState(null); const [transferOpen, setTransferOpen] = useState(false); const [transferFromAccount, setTransferFromAccount] = useState(null); const hasAccounts = accounts.length > 0; const orderedAccounts = [...accounts].sort((a, b) => { // Coloca inativas no final const aIsInactive = a.status?.toLowerCase() === "inativa"; const bIsInactive = b.status?.toLowerCase() === "inativa"; if (aIsInactive && !bIsInactive) return 1; if (!aIsInactive && bIsInactive) return -1; // Mesma ordem alfabética dentro de cada grupo return a.name.localeCompare(b.name, "pt-BR", { sensitivity: "base" }); }); const handleEdit = (account: Account) => { setSelectedAccount(account); setEditOpen(true); }; const handleEditOpenChange = (open: boolean) => { setEditOpen(open); if (!open) { setSelectedAccount(null); } }; const handleRemoveRequest = (account: Account) => { setAccountToRemove(account); setRemoveOpen(true); }; const handleRemoveOpenChange = (open: boolean) => { setRemoveOpen(open); if (!open) { setAccountToRemove(null); } }; const handleRemoveConfirm = async () => { if (!accountToRemove) { return; } const result = await deleteAccountAction({ id: accountToRemove.id }); if (result.success) { toast.success(result.message); return; } toast.error(result.error); throw new Error(result.error); }; const handleTransferRequest = (account: Account) => { setTransferFromAccount(account); setTransferOpen(true); }; const handleTransferOpenChange = (open: boolean) => { setTransferOpen(open); if (!open) { setTransferFromAccount(null); } }; const removeTitle = accountToRemove ? `Remover conta "${accountToRemove.name}"?` : "Remover conta?"; return ( <>
Nova conta } />
{hasAccounts ? (
{orderedAccounts.map((account) => { const logoSrc = resolveLogoSrc(account.logo); return ( ) : undefined } onEdit={() => handleEdit(account)} onRemove={() => handleRemoveRequest(account)} onTransfer={() => handleTransferRequest(account)} onViewStatement={() => router.push(`/contas/${account.id}/extrato`) } /> ); })}
) : ( } title={ isInativos ? "Nenhuma conta inativa" : "Nenhuma conta cadastrada" } description={ isInativos ? "Não há contas inativas no momento." : "Cadastre sua primeira conta para começar a organizar os lançamentos." } /> )}
{transferFromAccount && ( ({ ...a, balance: a.balance ?? a.initialBalance ?? 0, excludeFromBalance: a.excludeFromBalance ?? false, }))} fromAccountId={transferFromAccount.id} currentPeriod={getCurrentPeriod()} open={transferOpen} onOpenChange={handleTransferOpenChange} /> )} ); }