"use client"; import { Activity } from "lucide-react"; import { Card, CardContent, CardHeader } from "../../../../../shadcnui"; import { MeterInterface, MeterSummaryInterface } from "../../data/stripe-usage.interface"; type UsageSummaryCardProps = { meter: MeterInterface; summary: MeterSummaryInterface | null; }; /** * Get progress bar color based on usage percentage */ function getProgressColor(percentage: number | null): string { if (percentage === null) return "bg-blue-500"; if (percentage >= 90) return "bg-red-500"; if (percentage >= 75) return "bg-orange-500"; return "bg-green-500"; } /** * Format a Unix timestamp to readable date */ function formatDate(date: Date | undefined): string { if (!date) return "N/A"; try { return new Intl.DateTimeFormat("en-US", { month: "short", day: "numeric", }).format(new Date(date)); } catch (_error) { return "Invalid Date"; } } export function UsageSummaryCard({ meter, summary }: UsageSummaryCardProps) { const currentUsage = summary?.aggregatedValue ?? 0; const limit = (meter as any).limit; // Meters may have optional limit field const percentage = limit && limit > 0 ? (currentUsage / limit) * 100 : null; const progressColor = getProgressColor(percentage); const progressWidth = percentage !== null ? Math.min(percentage, 100) : 0; const displayName = meter.displayName || meter.eventName; const hasLimit = limit !== null && limit !== undefined; return (

{displayName}

{meter.id}

{/* Current Usage */}

{currentUsage.toLocaleString()}

{hasLimit &&

of {limit.toLocaleString()} used

}
{/* Progress Bar */} {hasLimit ? (

{percentage?.toFixed(1)}% used

) : (

No limit set

)} {/* Period Information */} {summary && summary.start && summary.end && (

Period: {formatDate(summary.start)} - {formatDate(summary.end)}

)} ); }