"use client"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader } from "@/components/ui/card"; import { ChartContainer, ChartTooltip, type ChartConfig, } from "@/components/ui/chart"; import type { CardDetailData } from "@/lib/relatorios/cartoes-report"; import { cn } from "@/lib/utils"; import { RiBankCard2Line } from "@remixicon/react"; import Image from "next/image"; import { useState } from "react"; import { Bar, BarChart, CartesianGrid, ReferenceLine, XAxis, YAxis, } from "recharts"; type CardUsageChartProps = { data: CardDetailData["monthlyUsage"]; limit: number; card: { name: string; logo: string | null; }; }; const chartConfig = { amount: { label: "Uso", color: "#3b82f6", }, } satisfies ChartConfig; type PeriodFilter = "3" | "6" | "12"; const filterOptions: { value: PeriodFilter; label: string }[] = [ { value: "3", label: "3 meses" }, { value: "6", label: "6 meses" }, { value: "12", label: "12 meses" }, ]; const resolveLogoPath = (logo: string | null) => { if (!logo) return null; if ( logo.startsWith("http://") || logo.startsWith("https://") || logo.startsWith("data:") ) { return logo; } return logo.startsWith("/") ? logo : `/logos/${logo}`; }; export function CardUsageChart({ data, limit, card }: CardUsageChartProps) { const [period, setPeriod] = useState("6"); const formatCurrency = (value: number) => { return new Intl.NumberFormat("pt-BR", { style: "currency", currency: "BRL", minimumFractionDigits: 0, maximumFractionDigits: 0, }).format(value); }; const formatCurrencyCompact = (value: number) => { if (Math.abs(value) >= 1000) { return new Intl.NumberFormat("pt-BR", { style: "currency", currency: "BRL", minimumFractionDigits: 0, maximumFractionDigits: 0, notation: "compact", }).format(value); } return formatCurrency(value); }; // Filter data based on selected period const filteredData = data.slice(-Number(period)); const chartData = filteredData.map((item) => ({ month: item.periodLabel, amount: item.amount, })); const logoPath = resolveLogoPath(card.logo); return (
{/* Card logo and name on the left */}
{logoPath ? (
{`Logo
) : (
)} {card.name}
{/* Filters on the right */}
{filterOptions.map((option) => ( ))}
{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)}
{limit > 0 && (
% do Limite {usagePercent.toFixed(0)}%
)}
); }} cursor={{ fill: "hsl(var(--muted))", opacity: 0.3 }} />
); }