"use client"; import { RiAddFill, RiBankCard2Line } from "@remixicon/react"; import { useRouter } from "next/navigation"; import { useMemo, useState } from "react"; import { toast } from "sonner"; import { deleteCardAction } from "@/features/cards/actions"; import { ConfirmActionDialog } from "@/shared/components/confirm-action-dialog"; import { EmptyState } from "@/shared/components/feedback/empty-state"; import { Button } from "@/shared/components/ui/button"; import { Card as UiCard } from "@/shared/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger, } from "@/shared/components/ui/tabs"; import { CardDialog } from "./card-dialog"; import { CardItem } from "./card-item"; import type { Card as CreditCard } from "./types"; type AccountOption = { id: string; name: string; logo: string | null; }; interface CardsPageProps { cards: CreditCard[]; archivedCards: CreditCard[]; accounts: AccountOption[]; logoOptions: string[]; } export function CardsPage({ cards, archivedCards, accounts, logoOptions, }: CardsPageProps) { const router = useRouter(); const [activeTab, setActiveTab] = useState("ativos"); const [editOpen, setEditOpen] = useState(false); const [selectedCard, setSelectedCard] = useState(null); const [removeOpen, setRemoveOpen] = useState(false); const [cardToRemove, setCardToRemove] = useState(null); const orderedCards = useMemo( () => [...cards].sort((a, b) => a.name.localeCompare(b.name, "pt-BR", { sensitivity: "base" }), ), [cards], ); const orderedArchivedCards = useMemo( () => [...archivedCards].sort((a, b) => a.name.localeCompare(b.name, "pt-BR", { sensitivity: "base" }), ), [archivedCards], ); const handleEdit = (card: CreditCard) => { setSelectedCard(card); setEditOpen(true); }; const handleEditOpenChange = (open: boolean) => { setEditOpen(open); if (!open) { setSelectedCard(null); } }; const handleRemoveRequest = (card: CreditCard) => { setCardToRemove(card); setRemoveOpen(true); }; const handleInvoice = (card: CreditCard) => { router.push(`/cards/${card.id}/invoice`); }; const handleRemoveOpenChange = (open: boolean) => { setRemoveOpen(open); if (!open) { setCardToRemove(null); } }; const handleRemoveConfirm = async () => { if (!cardToRemove) { return; } const result = await deleteCardAction({ id: cardToRemove.id }); if (result.success) { toast.success(result.message); return; } toast.error(result.error); throw new Error(result.error); }; const removeTitle = cardToRemove ? `Remover cartão "${cardToRemove.name}"?` : "Remover cartão?"; const renderCardList = (list: CreditCard[], isArchived: boolean) => { if (list.length === 0) { return ( } title={ isArchived ? "Nenhum cartão arquivado" : "Nenhum cartão cadastrado" } description={ isArchived ? "Os cartões arquivados aparecerão aqui." : "Adicione seu primeiro cartão para acompanhar limites e faturas com mais controle." } /> ); } return (
{list.map((card) => ( handleEdit(card)} onInvoice={() => handleInvoice(card)} onRemove={() => handleRemoveRequest(card)} /> ))}
); }; return ( <>
Novo cartão } />
Ativos Inativos {renderCardList(orderedCards, false)} {renderCardList(orderedArchivedCards, true)}
); }