"use client"; import { RiBankCard2Line, RiBillLine, RiExchangeDollarLine, RiMailLine, RiMailSendLine, RiVerifiedBadgeFill, } from "@remixicon/react"; import Image from "next/image"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { useState, useTransition } from "react"; import { toast } from "sonner"; import { sendPagadorSummaryAction } from "@/app/(dashboard)/pagadores/[pagadorId]/actions"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { PAGADOR_ROLE_ADMIN } from "@/lib/pagadores/constants"; import { getAvatarSrc } from "@/lib/pagadores/utils"; import { formatCurrency } from "@/lib/utils/currency"; import { formatDateTime } from "@/lib/utils/date"; import type { PagadorInfo, PagadorSummaryPreview } from "./types"; type PagadorHeaderCardProps = { pagador: PagadorInfo; selectedPeriod: string; summary: PagadorSummaryPreview; }; export function PagadorHeaderCard({ pagador, selectedPeriod, summary, }: PagadorHeaderCardProps) { const router = useRouter(); const [isSending, startTransition] = useTransition(); const [confirmOpen, setConfirmOpen] = useState(false); const avatarSrc = getAvatarSrc(pagador.avatarUrl); const createdAtLabel = formatDate(pagador.createdAt); const isAdmin = pagador.role === PAGADOR_ROLE_ADMIN; const lastMailLabel = formatDateTime(pagador.lastMailAt, { dateStyle: "short", timeStyle: "short", }) ?? "Nunca enviado"; const disableSend = isSending || !pagador.email || !pagador.canEdit; const openConfirmDialog = () => { if (!pagador.email) { toast.error("Cadastre um e-mail para este pagador antes de enviar."); return; } setConfirmOpen(true); }; const handleSendSummary = () => { if (!pagador.email) { toast.error("Cadastre um e-mail para este pagador antes de enviar."); return; } startTransition(async () => { const result = await sendPagadorSummaryAction({ pagadorId: pagador.id, period: selectedPeriod, }); if (!result.success) { toast.error(result.error); return; } toast.success(result.message); setConfirmOpen(false); router.refresh(); }); }; const getStatusBadgeVariant = (status: string): "success" | "outline" => { const normalizedStatus = status.toLowerCase(); if (normalizedStatus === "ativo") { return "success"; } return "outline"; }; return (
{`Avatar
{pagador.name} {isAdmin ? ( ) : null} {pagador.status} {pagador.isAutoSend ? ( Envio automático ) : null}
Criado em {createdAtLabel} {pagador.email ? ( {pagador.email} ) : ( Sem e-mail cadastrado )}
{pagador.canEdit ? ( <> Último envio: {lastMailLabel} ) : ( Acesso somente leitura )}
{pagador.canEdit ? ( { if (isSending) return; setConfirmOpen(open); }} > Confirmar envio do resumo Resumo de{" "} {summary.periodLabel} {" "} para{" "} {pagador.email}

Total de Despesas

{formatCurrency(summary.totalExpenses)}

{summary.lancamentoCount} lançamentos

Cartões

{formatCurrency(summary.paymentSplits.card)}

Boletos

{formatCurrency(summary.paymentSplits.boleto)}

Pix/Débito

{formatCurrency(summary.paymentSplits.instant)}

{summary.cardUsage.length > 0 && (
Cartões Utilizados
{summary.cardUsage.map((card, index) => (
{card.name} {formatCurrency(card.amount)}
))}
)} {(summary.boletoStats.paidCount > 0 || summary.boletoStats.pendingCount > 0) && (
Status de Boletos

Pagos

{formatCurrency(summary.boletoStats.paidAmount)}{" "} ({summary.boletoStats.paidCount})

Pendentes

{formatCurrency(summary.boletoStats.pendingAmount)}{" "} ({summary.boletoStats.pendingCount})

)}
) : null}
); } const formatDate = (value: string) => { return ( formatDateTime(value, { day: "2-digit", month: "long", year: "numeric", }) ?? "—" ); };