'use client' import { useState, useEffect } from 'react' import { Box, Typography, LinearProgress, Chip, Button, Paper, CircularProgress, Skeleton } from '@mui/material' import { TrendingUp, AutoAwesome } from '@mui/icons-material' import { useTranslations, useLocale } from 'next-intl' import Link from 'next/link' interface UsageData { tier: string status: string conversationLimit: number conversationCount: number limitResetDate: string | null } interface UsageDisplayProps { compact?: boolean showUpgradeButton?: boolean } export default function UsageDisplay({ compact = false, showUpgradeButton = true }: UsageDisplayProps) { const locale = useLocale() const t = useTranslations('subscription.usage') const [loading, setLoading] = useState(true) const [usageData, setUsageData] = useState(null) const [error, setError] = useState(false) useEffect(() => { fetchUsageData() }, []) const fetchUsageData = async () => { try { const token = localStorage.getItem('authToken') if (!token) { setError(true) setLoading(false) return } const response = await fetch('/api/user/profile', { headers: { 'Authorization': `Bearer ${token}` } }) if (response.ok) { const data = await response.json() setUsageData({ tier: data.user.subscriptionTier || 'free', status: data.user.subscriptionStatus || 'active', conversationLimit: data.user.conversationLimit || 10, conversationCount: data.user.conversationCount || 0, limitResetDate: data.user.limitResetDate }) } else { setError(true) } } catch (err) { console.error('Error fetching usage data:', err) setError(true) } finally { setLoading(false) } } const formatResetDate = (dateString: string | null) => { if (!dateString) { // If no reset date set, calculate 1 month from now const nextMonth = new Date() nextMonth.setMonth(nextMonth.getMonth() + 1) return nextMonth.toLocaleDateString(locale, { year: 'numeric', month: 'long', day: 'numeric' }) } const date = new Date(dateString) return date.toLocaleDateString(locale, { year: 'numeric', month: 'long', day: 'numeric' }) } if (loading) { return ( ) } if (error || !usageData) { return null } const isPremium = usageData.tier === 'premium' const usagePercentage = isPremium ? 0 : (usageData.conversationCount / usageData.conversationLimit) * 100 const remaining = Math.max(0, usageData.conversationLimit - usageData.conversationCount) const isNearLimit = !isPremium && remaining <= 2 return ( {/* Tier Badge */} {t('title')} : undefined} sx={{ fontWeight: 600 }} /> {/* Usage Stats */} {t('conversations')} {isPremium ? ( t('unlimited') ) : ( `${usageData.conversationCount} ${t('of')} ${usageData.conversationLimit}` )} {!isPremium && ( <> {remaining} {t('remaining')} {usageData.limitResetDate && ( <> • {t('resetsOn')} {formatResetDate(usageData.limitResetDate)} )} )} {isPremium && ( {t('premiumDescription')} )} {/* Upgrade Button */} {!isPremium && showUpgradeButton && ( )} ) }