"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/empty-state"; import { Button } from "@/components/ui/button"; import { Card } from "@/components/ui/card"; import { CardDialog } from "./card-dialog"; import { CardItem } from "./card-item"; type AccountOption = { id: string; name: string; }; interface CardsPageProps { cards: Card[]; accounts: AccountOption[]; logoOptions: string[]; isInativos?: boolean; } export function CardsPage({ cards, accounts, logoOptions, isInativos = false, }: CardsPageProps) { const router = useRouter(); const [editOpen, setEditOpen] = useState(false); const [selectedCard, setSelectedCard] = useState(null); const [removeOpen, setRemoveOpen] = useState(false); const [cardToRemove, setCardToRemove] = useState(null); const hasCards = cards.length > 0; const orderedCards = useMemo( () => [...cards].sort((a, b) => { // Coloca inativos no final const aIsInactive = a.status?.toLowerCase() === "inativo"; const bIsInactive = b.status?.toLowerCase() === "inativo"; 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" }); }), [cards], ); 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?"; return ( <>
{!isInativos && (
Novo cartão } />
)} {hasCards ? (
{orderedCards.map((card) => ( handleEdit(card)} onInvoice={() => handleInvoice(card)} onRemove={() => handleRemoveRequest(card)} /> ))}
) : ( } title={ isInativos ? "Nenhum cartão inativo" : "Nenhum cartão cadastrado" } description={ isInativos ? "Os cartões inativos aparecerão aqui." : "Adicione seu primeiro cartão para acompanhar limites e faturas com mais controle." } /> )}
); }