import { RiArrowDownLine, RiArrowUpLine, RiCurrencyLine, RiIncreaseDecreaseLine, RiSubtractLine, } from "@remixicon/react"; import { Badge } from "@/components/ui/badge"; import { Card, CardAction, CardFooter, CardHeader, CardTitle, } from "@/components/ui/card"; import type { DashboardCardMetrics } from "@/lib/dashboard/metrics"; import { title_font } from "@/public/fonts/font_index"; import MoneyValues from "../money-values"; type SectionCardsProps = { metrics: DashboardCardMetrics; }; type Trend = "up" | "down" | "flat"; const TREND_THRESHOLD = 0.005; const CARDS = [ { label: "Receitas", key: "receitas", icon: RiArrowUpLine }, { label: "Despesas", key: "despesas", icon: RiArrowDownLine }, { label: "Balanço", key: "balanco", icon: RiIncreaseDecreaseLine }, { label: "Previsto", key: "previsto", icon: RiCurrencyLine }, ] as const; const TREND_ICONS = { up: RiArrowUpLine, down: RiArrowDownLine, flat: RiSubtractLine, } as const; const getTrend = (current: number, previous: number): Trend => { const diff = current - previous; if (diff > TREND_THRESHOLD) return "up"; if (diff < -TREND_THRESHOLD) return "down"; return "flat"; }; const getPercentChange = (current: number, previous: number): string => { const EPSILON = 0.01; // Considera valores menores que 1 centavo como zero if (Math.abs(previous) < EPSILON) { if (Math.abs(current) < EPSILON) return "0%"; return "—"; } const change = ((current - previous) / Math.abs(previous)) * 100; return Number.isFinite(change) && Math.abs(change) < 1000000 ? `${change > 0 ? "+" : ""}${change.toFixed(1)}%` : "—"; }; export function SectionCards({ metrics }: SectionCardsProps) { return (
{CARDS.map(({ label, key, icon: Icon }) => { const metric = metrics[key]; const trend = getTrend(metric.current, metric.previous); const TrendIcon = TREND_ICONS[trend]; return ( {label} {getPercentChange(metric.current, metric.previous)}
Mês anterior
); })}
); }