/** * Usage & Analytics Page - Refactored * Organized tabs: Plan Limits & Usage, Credit Activity, API Usage * Tab selection driven by URL path for sidebar navigation */ import { useState, useEffect } from 'react'; import { useLocation } from 'react-router-dom'; import { TrendingUp, Activity, BarChart3, Zap, Calendar } from 'lucide-react'; import PageMeta from '../../components/common/PageMeta'; import { useToast } from '../../components/ui/toast/ToastContainer'; import { getUsageAnalytics, UsageAnalytics, getCreditBalance, type CreditBalance } from '../../services/billing.api'; import { Card } from '../../components/ui/card'; import Badge from '../../components/ui/badge/Badge'; import BillingUsagePanel from '../../components/billing/BillingUsagePanel'; import UsageLimitsPanel from '../../components/billing/UsageLimitsPanel'; import Button from '../../components/ui/button/Button'; type TabType = 'limits' | 'activity' | 'api'; // Map URL paths to tab types function getTabFromPath(pathname: string): TabType { if (pathname.includes('/credits')) return 'activity'; if (pathname.includes('/activity')) return 'api'; return 'limits'; } export default function UsageAnalyticsPage() { const toast = useToast(); const location = useLocation(); // Derive active tab from URL path const activeTab = getTabFromPath(location.pathname); const [analytics, setAnalytics] = useState(null); const [creditBalance, setCreditBalance] = useState(null); const [loading, setLoading] = useState(true); const [period, setPeriod] = useState(30); useEffect(() => { loadData(); }, [period]); const loadData = async () => { try { setLoading(true); const [analyticsData, balanceData] = await Promise.all([ getUsageAnalytics(period), getCreditBalance(), ]); setAnalytics(analyticsData); setCreditBalance(balanceData); } catch (error: any) { toast.error(`Failed to load usage data: ${error.message}`); } finally { setLoading(false); } }; if (loading) { return (
Loading usage data...
); } const tabTitles: Record = { limits: 'Limits & Usage', activity: 'Credit History', api: 'Activity Log', }; return (
{/* Page Header */}
Usage & Analytics / {tabTitles[activeTab]}

{tabTitles[activeTab]}

{activeTab === 'limits' && 'See how much you\'re using - Track your credits and content limits'} {activeTab === 'activity' && 'See where your credits go - Track credit usage history'} {activeTab === 'api' && 'Technical requests - Monitor API activity and usage'}

{/* Quick Stats Overview */} {creditBalance && (
Credits Left
{creditBalance.credits.toLocaleString()}
available
Credits Used This Month
{creditBalance.credits_used_this_month.toLocaleString()}
spent so far
Your Monthly Limit
{creditBalance.plan_credits_per_month.toLocaleString()}
total each month
Usage %
{creditBalance.plan_credits_per_month > 0 ? Math.round((creditBalance.credits_used_this_month / creditBalance.plan_credits_per_month) * 100) : 0}%
)} {/* Period Selector (only show on activity and api tabs) */} {(activeTab === 'activity' || activeTab === 'api') && (
{[7, 30, 90].map((value) => { const isActive = period === value; return ( ); })}
)} {/* Tab Content */}
{/* Plan Limits & Usage Tab */} {activeTab === 'limits' && (
)} {/* Credit Activity Tab */} {activeTab === 'activity' && (
)} {/* API Usage Tab */} {activeTab === 'api' && (
{/* API Stats Cards - Using real analytics data */}
Total Operations
{analytics?.usage_by_type.reduce((sum, item) => sum + item.count, 0).toLocaleString() || 0}
in last {period} days
Avg Operations/Day
{Math.round((analytics?.usage_by_type.reduce((sum, item) => sum + item.count, 0) || 0) / period)}
daily average
Credits Used
{analytics?.total_usage?.toLocaleString() || 0}
in last {period} days
{/* Operations by Type */}

Operations by Type

{analytics?.usage_by_type && analytics.usage_by_type.length > 0 ? (
{analytics.usage_by_type.map((item, index) => (
{item.transaction_type.replace(/_/g, ' ')}
{Math.abs(item.total).toLocaleString()} credits
{item.count}
operations
))}
) : (

No operations recorded in the selected period

)}
)}
); }