"use client"; import { RiCalculatorLine, RiCheckboxBlankLine, RiCheckboxLine, } from "@remixicon/react"; import { useMemo, useState } from "react"; import MoneyValues from "@/components/money-values"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { InstallmentGroupCard } from "./installment-group-card"; import type { InstallmentAnalysisData } from "./types"; type InstallmentAnalysisPageProps = { data: InstallmentAnalysisData; }; export function InstallmentAnalysisPage({ data, }: InstallmentAnalysisPageProps) { // Estado para parcelas selecionadas: Map> const [selectedInstallments, setSelectedInstallments] = useState< Map> >(new Map()); // Calcular se está tudo selecionado (apenas parcelas não pagas) const isAllSelected = useMemo(() => { const allInstallmentsSelected = data.installmentGroups.every((group) => { const groupSelection = selectedInstallments.get(group.seriesId); const unpaidInstallments = group.pendingInstallments.filter( (i) => !i.isSettled, ); if (!groupSelection || unpaidInstallments.length === 0) return false; return groupSelection.size === unpaidInstallments.length; }); return allInstallmentsSelected && data.installmentGroups.length > 0; }, [selectedInstallments, data]); // Função para selecionar/desselecionar tudo const toggleSelectAll = () => { if (isAllSelected) { // Desmarcar tudo setSelectedInstallments(new Map()); } else { // Marcar tudo (exceto parcelas já pagas) const newInstallments = new Map>(); data.installmentGroups.forEach((group) => { const unpaidIds = group.pendingInstallments .filter((i) => !i.isSettled) .map((i) => i.id); if (unpaidIds.length > 0) { newInstallments.set(group.seriesId, new Set(unpaidIds)); } }); setSelectedInstallments(newInstallments); } }; // Função para selecionar/desselecionar um grupo de parcelas const toggleGroupSelection = (seriesId: string, installmentIds: string[]) => { const newMap = new Map(selectedInstallments); const current = newMap.get(seriesId) || new Set(); if (current.size === installmentIds.length) { // Já está tudo selecionado, desmarcar newMap.delete(seriesId); } else { // Marcar tudo newMap.set(seriesId, new Set(installmentIds)); } setSelectedInstallments(newMap); }; // Função para selecionar/desselecionar parcela individual const toggleInstallmentSelection = ( seriesId: string, installmentId: string, ) => { const newMap = new Map(selectedInstallments); // Criar uma NOVA instância do Set para React detectar a mudança const current = new Set(newMap.get(seriesId) || []); if (current.has(installmentId)) { current.delete(installmentId); if (current.size === 0) { newMap.delete(seriesId); } else { newMap.set(seriesId, current); } } else { current.add(installmentId); newMap.set(seriesId, current); } setSelectedInstallments(newMap); }; // Calcular totais const { grandTotal, selectedCount } = useMemo(() => { let installmentsSum = 0; let installmentsCount = 0; selectedInstallments.forEach((installmentIds, seriesId) => { const group = data.installmentGroups.find((g) => g.seriesId === seriesId); if (group) { installmentIds.forEach((id) => { const installment = group.pendingInstallments.find( (i) => i.id === id, ); if (installment && !installment.isSettled) { installmentsSum += installment.amount; installmentsCount++; } }); } }); return { grandTotal: installmentsSum, selectedCount: installmentsCount, }; }, [selectedInstallments, data]); const hasNoData = data.installmentGroups.length === 0; return (
{/* Card de resumo principal */}

Se você pagar tudo que está selecionado:

{selectedCount} {selectedCount === 1 ? "parcela" : "parcelas"}{" "} selecionadas

{/* Botões de ação */} {!hasNoData && (
)} {/* Seção de Lançamentos Parcelados */} {data.installmentGroups.length > 0 && (
{data.installmentGroups.map((group) => ( toggleGroupSelection( group.seriesId, group.pendingInstallments .filter((i) => !i.isSettled) .map((i) => i.id), ) } onToggleInstallment={(installmentId) => toggleInstallmentSelection(group.seriesId, installmentId) } /> ))}
)} {/* Estado vazio */} {hasNoData && (

Nenhuma parcela pendente

Você está em dia com seus pagamentos!

)}
); }