'use client'; import { useQuery } from '@tanstack/react-query'; import { Loader2, BarChart2 } from 'lucide-react'; import { useLanguage } from '@/lib/i18n'; import { cn } from '@/lib/utils'; interface QuotaEntry { remaining: number; limit: number; used: number; } type Quotas = Record; const FEATURE_LABEL_KEYS: Record = { aiSummary: 'sidebar.aiSummary', aiFlashcards: 'sidebar.aiFlashcards', aiMindmap: 'sidebar.aiMindmap', aiTranscribe: 'sidebar.aiTranscribe', aiDiagram: 'sidebar.aiDiagram', aiAgent: 'sidebar.aiAgent', }; function UsageBar({ used, limit, isUnlimited }: { used: number; limit: number; isUnlimited: boolean }) { const pct = isUnlimited ? 0 : Math.min(100, limit > 0 ? (used / limit) * 100 : 0); const color = pct >= 90 ? 'bg-rose-500' : pct >= 70 ? 'bg-amber-500' : 'bg-emerald-500'; return (
{!isUnlimited && (
)}
); } export function UsageBreakdown() { const { t } = useLanguage(); const { data, isLoading } = useQuery<{ quotas: Quotas }>({ queryKey: ['usage', 'current'], queryFn: async () => { const res = await fetch('/api/usage/current'); if (!res.ok) throw new Error('Failed to fetch usage'); return res.json(); }, }); const quotas = data?.quotas ?? {}; const entries = Object.entries(quotas); return (

{t('billing.usageThisPeriod')}

{isLoading ? (
) : entries.length === 0 ? (

{t('billing.noUsage')}

) : (
{entries.map(([feature, quota]) => { const isUnlimited = quota.limit === -1 || !isFinite(quota.limit); const labelKey = FEATURE_LABEL_KEYS[feature]; const label = labelKey ? t(labelKey) : feature; return (
{label} {isUnlimited ? ( {t('billing.unlimited')} ) : ( `${quota.used} / ${quota.limit}` )}
); })}
)}
); }