"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 { sendPayerSummaryAction } from "@/features/payers/lib/detail-actions"; import { Badge } from "@/shared/components/ui/badge"; import { Button } from "@/shared/components/ui/button"; import { Card, CardDescription, CardHeader, CardTitle, } from "@/shared/components/ui/card"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/shared/components/ui/dialog"; import { PAYER_ROLE_ADMIN } from "@/shared/lib/payers/constants"; import { getAvatarSrc } from "@/shared/lib/payers/utils"; import { formatCurrency } from "@/shared/utils/currency"; import { formatDateTime } from "@/shared/utils/date"; import type { PayerInfo, PayerSummaryPreview } from "./types"; type PayerHeaderCardProps = { payer: PayerInfo; selectedPeriod: string; summary: PayerSummaryPreview; }; export function PayerHeaderCard({ payer, selectedPeriod, summary, }: PayerHeaderCardProps) { const router = useRouter(); const [isSending, startTransition] = useTransition(); const [confirmOpen, setConfirmOpen] = useState(false); const avatarSrc = getAvatarSrc(payer.avatarUrl); const isDataUrl = avatarSrc.startsWith("data:"); const createdAtLabel = formatDate(payer.createdAt); const isAdmin = payer.role === PAYER_ROLE_ADMIN; const lastMailLabel = formatDateTime(payer.lastMailAt, { dateStyle: "short", timeStyle: "short", }) ?? "Nunca enviado"; const disableSend = isSending || !payer.email || !payer.canEdit; const openConfirmDialog = () => { if (!payer.email) { toast.error("Cadastre um e-mail para esta pessoa antes de enviar."); return; } setConfirmOpen(true); }; const handleSendSummary = () => { if (!payer.email) { toast.error("Cadastre um e-mail para esta pessoa antes de enviar."); return; } startTransition(async () => { const result = await sendPayerSummaryAction({ payerId: payer.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
{payer.name} {isAdmin ? ( ) : null} {payer.status} {payer.isAutoSend ? ( Envio automático ) : null}
Criado em {createdAtLabel} {payer.email ? ( {payer.email} ) : ( Sem e-mail cadastrado )}
{payer.canEdit ? ( <> Último envio: {lastMailLabel} ) : ( Acesso somente leitura )}
{payer.canEdit ? ( { if (isSending) return; setConfirmOpen(open); }} > Confirmar envio do resumo Resumo de{" "} {summary.periodLabel} {" "} para{" "} {payer.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", }) ?? "—" ); };