"use client"; import { RiBankCard2Line, RiCheckboxCircleFill, RiEyeLine, RiTimeLine, } from "@remixicon/react"; import { format } from "date-fns"; import { ptBR } from "date-fns/locale"; import Image from "next/image"; import { useState } from "react"; import MoneyValues from "@/shared/components/money-values"; import { Badge } from "@/shared/components/ui/badge"; import { Button } from "@/shared/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/shared/components/ui/card"; import { Checkbox } from "@/shared/components/ui/checkbox"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@/shared/components/ui/dialog"; import { Progress } from "@/shared/components/ui/progress"; import { cn } from "@/shared/utils"; import type { InstallmentGroup } from "./types"; type InstallmentGroupCardProps = { group: InstallmentGroup; selectedInstallments: Set; onToggleGroup: () => void; onToggleInstallment: (installmentId: string) => void; }; export function InstallmentGroupCard({ group, selectedInstallments, onToggleGroup, onToggleInstallment, }: InstallmentGroupCardProps) { const [isDetailsOpen, setIsDetailsOpen] = useState(false); const unpaidInstallments = group.pendingInstallments.filter( (i) => !i.isSettled, ); const paidInstallments = group.pendingInstallments.filter((i) => i.isSettled); const unpaidCount = unpaidInstallments.length; const isFullySelected = selectedInstallments.size === unpaidInstallments.length && unpaidInstallments.length > 0; const isPartiallySelected = selectedInstallments.size > 0 && !isFullySelected; const hasSelection = selectedInstallments.size > 0; const progress = group.totalInstallments > 0 ? (group.paidInstallments / group.totalInstallments) * 100 : 0; const selectedAmount = group.pendingInstallments .filter((i) => selectedInstallments.has(i.id) && !i.isSettled) .reduce((sum, i) => sum + Number(i.amount), 0); const totalAmount = group.pendingInstallments.reduce( (sum, i) => sum + i.amount, 0, ); const pendingAmount = unpaidInstallments.reduce( (sum, i) => sum + i.amount, 0, ); return ( <> {/* Header Section */}
{/* Checkbox de seleção do grupo */}
{/* Info principal */}
{group.cartaoLogo ? ( {group.cartaoName ) : (
)}
{group.name} {group.cartaoName ?? "Compra parcelada"}
{/* Badge de status */} {progress === 100 ? "Quitado" : `${Math.round(progress)}% pago`}
{/* Grid de valores */}

Valor total

Pendente

0 ? "text-amber-600" : "text-success-600", )} />
{/* Barra de progresso */}
{group.paidInstallments} de {group.totalInstallments} parcelas pagas
{unpaidCount > 0 && (
{unpaidCount} {unpaidCount === 1 ? "pendente" : "pendentes"}
)}
{/* Valor selecionado */} {hasSelection && (
{selectedInstallments.size}{" "} {selectedInstallments.size === 1 ? "parcela selecionada" : "parcelas selecionadas"}
)} {/* Botão para abrir detalhes */}
{/* Modal de detalhes */}
{group.cartaoLogo ? ( {group.cartaoName ) : (
)} {group.name}
Detalhes das parcelas do grupo {group.name}
{/* Parcelas pagas */} {paidInstallments.length > 0 && (

Parcelas pagas

{paidInstallments.map((installment) => { const dueDate = installment.dueDate ? format(installment.dueDate, "dd MMM yyyy", { locale: ptBR, }) : format(installment.purchaseDate, "dd MMM yyyy", { locale: ptBR, }); return (

Parcela {installment.currentInstallment}/ {group.totalInstallments}

Vencimento: {dueDate}

); })}
)} {/* Parcelas pendentes */} {unpaidInstallments.length > 0 && (

Parcelas pendentes

{unpaidInstallments.map((installment) => { const isSelected = selectedInstallments.has(installment.id); const dueDate = installment.dueDate ? format(installment.dueDate, "dd MMM yyyy", { locale: ptBR, }) : format(installment.purchaseDate, "dd MMM yyyy", { locale: ptBR, }); return ( ); })}
)}
{/* Footer com resumo da seleção */} {hasSelection && (
{selectedInstallments.size}{" "} {selectedInstallments.size === 1 ? "parcela selecionada" : "parcelas selecionadas"}
)}
); }