"use client"; import { formatResetTime, calculatePercentage } from "./utils"; /** * Format reset time display (Today, 12:00 PM) */ function formatResetTimeDisplay(resetTime) { if (!resetTime) return null; try { const date = new Date(resetTime); const now = new Date(); const today = new Date(now.getFullYear(), now.getMonth(), now.getDate()); const tomorrow = new Date(today); tomorrow.setDate(tomorrow.getDate() + 1); let dayStr = ""; if (date >= today && date < tomorrow) { dayStr = "Today"; } else if (date >= tomorrow && date < new Date(tomorrow.getTime() + 24 * 60 * 60 * 1000)) { dayStr = "Tomorrow"; } else { dayStr = date.toLocaleDateString("en-US", { month: "short", day: "numeric" }); } const timeStr = date.toLocaleTimeString("en-US", { hour: "numeric", minute: "2-digit", hour12: true }); return `${dayStr}, ${timeStr}`; } catch { return null; } } /** * Get color classes based on remaining percentage */ function getColorClasses(remainingPercentage) { if (remainingPercentage > 70) { return { text: "text-green-600 dark:text-green-400", bg: "bg-green-500", bgLight: "bg-green-500/10", emoji: "🟢" }; } if (remainingPercentage >= 30) { return { text: "text-yellow-600 dark:text-yellow-400", bg: "bg-yellow-500", bgLight: "bg-yellow-500/10", emoji: "🟡" }; } // 0-29% including 0% (out of quota) - show red return { text: "text-red-600 dark:text-red-400", bg: "bg-red-500", bgLight: "bg-red-500/10", emoji: "🔴" }; } /** * Quota Table Component - Table-based display for quota data */ export default function QuotaTable({ quotas = [], compact = false }) { if (!quotas || quotas.length === 0) { return null; } const cellPad = compact ? "py-1 px-1.5" : "py-2 px-3"; const nameText = compact ? "text-[11px]" : "text-sm"; const resetPrimary = compact ? "text-[11px]" : "text-sm"; const resetSecondary = compact ? "text-[10px] leading-tight" : "text-xs"; return (
{quotas.map((quota, index) => { const remaining = quota.remainingPercentage !== undefined ? Math.round(quota.remainingPercentage) : calculatePercentage(quota.used, quota.total); const colors = getColorClasses(remaining); const countdown = formatResetTime(quota.resetAt); const resetDisplay = formatResetTimeDisplay(quota.resetAt); return ( {/* Model Name with Status Emoji */} {/* Limit (Progress + Numbers) */} {/* Reset Time */} ); })}
{colors.emoji} {quota.name}
{/* Progress bar - always show with border for visibility */}
{/* Numbers */}
{quota.used.toLocaleString()} / {quota.total > 0 ? quota.total.toLocaleString() : "∞"} {remaining}%
{countdown !== "-" || resetDisplay ? ( compact ? (
{countdown !== "-" ? `in ${countdown}` : resetDisplay}
) : (
{countdown !== "-" && (
in {countdown}
)} {resetDisplay && (
{resetDisplay}
)}
) ) : (
N/A
)}
); }