forked from git.gladyson/openmonetis
- Adicionar tokens semânticos de estado (success, warning, info) no globals.css - Migrar ~60+ componentes de cores hardcoded do Tailwind para tokens semânticos - Unificar 3 arrays duplicados de cores de categorias em importação única - Corrigir widgets de boleto/fatura que não atualizavam após pagamento (actions de fatura e antecipação não invalidavam cache do dashboard) - Corrigir scroll em listas Popover+Command (modal prop) - Adicionar link "detalhes" no card de orçamento para página da categoria - Adicionar indicadores de tendência coloridos nos cards de métricas - Estender cores de chart de 6 para 10 - Normalizar dark mode e remover tokens não utilizados Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
93 lines
2.7 KiB
TypeScript
93 lines
2.7 KiB
TypeScript
import { RiArrowDownFill, RiCheckLine } from "@remixicon/react";
|
|
import {
|
|
calculateLastInstallmentDate,
|
|
formatCurrentInstallment,
|
|
formatLastInstallmentDate,
|
|
formatPurchaseDate,
|
|
} from "@/lib/installments/utils";
|
|
|
|
type InstallmentTimelineProps = {
|
|
purchaseDate: Date;
|
|
currentInstallment: number;
|
|
totalInstallments: number;
|
|
period: string;
|
|
};
|
|
|
|
export function InstallmentTimeline({
|
|
purchaseDate,
|
|
currentInstallment,
|
|
totalInstallments,
|
|
period,
|
|
}: InstallmentTimelineProps) {
|
|
const lastInstallmentDate = calculateLastInstallmentDate(
|
|
period,
|
|
currentInstallment,
|
|
totalInstallments,
|
|
);
|
|
|
|
return (
|
|
<div className="relative flex items-center justify-between px-4 py-4">
|
|
{/* Linha de conexão */}
|
|
<div className="absolute left-0 right-0 top-6 h-0.5 bg-border">
|
|
<div
|
|
className="h-full bg-success transition-all duration-300"
|
|
style={{
|
|
width: `${
|
|
((currentInstallment - 1) / (totalInstallments - 1)) * 100
|
|
}%`,
|
|
}}
|
|
/>
|
|
</div>
|
|
|
|
{/* Ponto 1: Data de Compra */}
|
|
<div className="relative z-10 flex flex-col items-center gap-2">
|
|
<div className="flex size-4 items-center justify-center rounded-full border-2 border-success bg-success shadow-sm">
|
|
<RiCheckLine className="size-5 text-white" />
|
|
</div>
|
|
<div className="flex flex-col items-center">
|
|
<span className="text-xs font-medium text-foreground">
|
|
Data de Compra
|
|
</span>
|
|
<span className="text-xs text-muted-foreground">
|
|
{formatPurchaseDate(purchaseDate)}
|
|
</span>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Ponto 2: Parcela Atual */}
|
|
<div className="relative z-10 flex flex-col items-center gap-2">
|
|
<div
|
|
className={`flex size-4 items-center justify-center rounded-full border-2 shadow-sm border-warning bg-warning`}
|
|
>
|
|
<RiArrowDownFill className="size-5 text-white" />
|
|
</div>
|
|
<div className="flex flex-col items-center">
|
|
<span className="text-xs font-medium text-foreground">
|
|
Parcela Atual
|
|
</span>
|
|
<span className="text-xs text-muted-foreground">
|
|
{formatCurrentInstallment(currentInstallment, totalInstallments)}
|
|
</span>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Ponto 3: Última Parcela */}
|
|
<div className="relative z-10 flex flex-col items-center gap-2">
|
|
<div
|
|
className={`flex size-4 items-center justify-center rounded-full border-2 shadow-sm border-success bg-success`}
|
|
>
|
|
<RiCheckLine className="size-5 text-white" />
|
|
</div>
|
|
<div className="flex flex-col items-center">
|
|
<span className="text-xs font-medium text-foreground">
|
|
Última Parcela
|
|
</span>
|
|
<span className="text-xs text-muted-foreground">
|
|
{formatLastInstallmentDate(lastInstallmentDate)}
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|