"use client"; import { RiBankCard2Line, RiBarChartBoxLine } from "@remixicon/react"; import Image from "next/image"; import { Bar, BarChart, CartesianGrid, ReferenceLine, XAxis, YAxis, } from "recharts"; import type { CardDetailData } from "@/features/reports/cards-report-queries"; import { Card, CardContent, CardHeader, CardTitle, } from "@/shared/components/ui/card"; import { type ChartConfig, ChartContainer, ChartTooltip, } from "@/shared/components/ui/chart"; import { resolveLogoSrc } from "@/shared/lib/logo"; import { formatCurrency, formatCurrencyCompact } from "@/shared/utils/currency"; import { formatPercentage } from "@/shared/utils/percentage"; type CardUsageChartProps = { data: CardDetailData["monthlyUsage"]; limit: number; card: { name: string; logo: string | null; }; }; const chartConfig = { amount: { label: "Uso", color: "#3b82f6", }, } satisfies ChartConfig; export function CardUsageChart({ data, limit, card }: CardUsageChartProps) { // Always show last 12 months const chartData = data.slice(-12).map((item) => ({ month: item.periodLabel, amount: item.amount, })); const logoPath = resolveLogoSrc(card.logo); return (
Histórico de Uso {/* Card logo and name */}
{logoPath ? ( {card.name} ) : ( )} {card.name}
Math.abs(Number(value)) >= 1000 ? formatCurrencyCompact(Number(value), { maximumFractionDigits: 0, minimumFractionDigits: 0, }) : formatCurrency(Number(value), { maximumFractionDigits: 0, minimumFractionDigits: 0, }) } /> {limit > 0 && ( )} { if (!active || !payload || payload.length === 0) { return null; } const data = payload[0].payload; const value = data.amount as number; const usagePercent = limit > 0 ? (value / limit) * 100 : 0; return (
{data.month}
Uso {formatCurrency(value, { maximumFractionDigits: 0, minimumFractionDigits: 0, })}
{limit > 0 && (
% do Limite {formatPercentage(usagePercent, { maximumFractionDigits: 0, minimumFractionDigits: 0, })}
)}
); }} cursor={{ fill: "hsl(var(--muted))", opacity: 0.3 }} />
); }