"use client"; import { RiAddCircleLine, RiBankCard2Line } from "@remixicon/react"; import { useRouter } from "next/navigation"; import { useCallback, useMemo, useState } from "react"; import { toast } from "sonner"; import { deleteCardAction } from "@/app/(dashboard)/cartoes/actions"; import { ConfirmActionDialog } from "@/components/confirm-action-dialog"; import { EmptyState } from "@/components/shared/empty-state"; import { Button } from "@/components/ui/button"; import { Card } from "@/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { CardDialog } from "./card-dialog"; import { CardItem } from "./card-item"; type AccountOption = { id: string; name: string; }; interface CardsPageProps { cards: Card[]; archivedCards: Card[]; 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 sortCards = useCallback( (list: Card[]) => [...list].sort((a, b) => a.name.localeCompare(b.name, "pt-BR", { sensitivity: "base" }), ), [], ); const orderedCards = useMemo(() => sortCards(cards), [cards, sortCards]); const orderedArchivedCards = useMemo( () => sortCards(archivedCards), [archivedCards, sortCards], ); const handleEdit = useCallback((card: Card) => { setSelectedCard(card); setEditOpen(true); }, []); const handleEditOpenChange = useCallback((open: boolean) => { setEditOpen(open); if (!open) { setSelectedCard(null); } }, []); const handleRemoveRequest = useCallback((card: Card) => { setCardToRemove(card); setRemoveOpen(true); }, []); const handleInvoice = useCallback( (card: Card) => { router.push(`/cartoes/${card.id}/fatura`); }, [router], ); const handleRemoveOpenChange = useCallback((open: boolean) => { setRemoveOpen(open); if (!open) { setCardToRemove(null); } }, []); const handleRemoveConfirm = useCallback(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); }, [cardToRemove]); const removeTitle = cardToRemove ? `Remover cartão "${cardToRemove.name}"?` : "Remover cartão?"; const renderCardList = (list: Card[], 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 Arquivados {renderCardList(orderedCards, false)} {renderCardList(orderedArchivedCards, true)}
); }