"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 { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; 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[]; archivedAccounts: Account[]; logoOptions: string[]; } const resolveLogoSrc = (logo: string | null) => { if (!logo) { return undefined; } const fileName = logo.split("/").filter(Boolean).pop() ?? logo; return `/logos/${fileName}`; }; export function AccountsPage({ accounts, archivedAccounts, logoOptions, }: AccountsPageProps) { const router = useRouter(); const [activeTab, setActiveTab] = useState("ativos"); 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 sortAccounts = (list: Account[]) => [...list].sort((a, b) => a.name.localeCompare(b.name, "pt-BR", { sensitivity: "base" }), ); const orderedAccounts = sortAccounts(accounts); const orderedArchivedAccounts = sortAccounts(archivedAccounts); 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?"; const renderAccountList = (list: Account[], isArchived: boolean) => { if (list.length === 0) { return ( } title={ isArchived ? "Nenhuma conta arquivada" : "Nenhuma conta cadastrada" } description={ isArchived ? "As contas arquivadas aparecerão aqui." : "Cadastre sua primeira conta para começar a organizar os lançamentos." } /> ); } return (
{list.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`) } /> ); })}
); }; return ( <>
Nova conta } />
Ativas Arquivadas {renderAccountList(orderedAccounts, false)} {renderAccountList(orderedArchivedAccounts, true)}
{transferFromAccount && ( ({ ...a, balance: a.balance ?? a.initialBalance ?? 0, excludeFromBalance: a.excludeFromBalance ?? false, }))} fromAccountId={transferFromAccount.id} currentPeriod={getCurrentPeriod()} open={transferOpen} onOpenChange={handleTransferOpenChange} /> )} ); }