import { useState, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { Chart as ChartJS, CategoryScale, LinearScale, PointElement, LineElement, Title, Tooltip, Legend, Filler } from 'chart.js'; import { Button } from '@/components/ui/Button'; import { LoadingSpinner } from '@/components/ui/LoadingSpinner'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import { useHeaderRefresh } from '@/hooks/useHeaderRefresh'; import { useThemeStore } from '@/stores'; import { StatCards, UsageChart, ChartLineSelector, ApiDetailsCard, ModelStatsCard, PriceSettingsCard, useUsageData, useSparklines, useChartData } from '@/components/usage'; import { getModelNamesFromUsage, getApiStats, getModelStats } from '@/utils/usage'; import styles from './UsagePage.module.scss'; // Register Chart.js components ChartJS.register( CategoryScale, LinearScale, PointElement, LineElement, Title, Tooltip, Legend, Filler ); export function UsagePage() { const { t } = useTranslation(); const isMobile = useMediaQuery('(max-width: 768px)'); const resolvedTheme = useThemeStore((state) => state.resolvedTheme); const isDark = resolvedTheme === 'dark'; // Data hook const { usage, loading, error, modelPrices, setModelPrices, loadUsage, handleExport, handleImport, handleImportChange, importInputRef, exporting, importing } = useUsageData(); useHeaderRefresh(loadUsage); // Chart lines state const [chartLines, setChartLines] = useState(['all']); const MAX_CHART_LINES = 9; // Sparklines hook const { requestsSparkline, tokensSparkline, rpmSparkline, tpmSparkline, costSparkline } = useSparklines({ usage, loading }); // Chart data hook const { requestsPeriod, setRequestsPeriod, tokensPeriod, setTokensPeriod, requestsChartData, tokensChartData, requestsChartOptions, tokensChartOptions } = useChartData({ usage, chartLines, isDark, isMobile }); // Derived data const modelNames = useMemo(() => getModelNamesFromUsage(usage), [usage]); const apiStats = useMemo(() => getApiStats(usage, modelPrices), [usage, modelPrices]); const modelStats = useMemo(() => getModelStats(usage, modelPrices), [usage, modelPrices]); const hasPrices = Object.keys(modelPrices).length > 0; return (
{loading && !usage && (
{t('common.loading')}
)}

{t('usage_stats.title')}

{error &&
{error}
} {/* Stats Overview Cards */} {/* Chart Line Selection */} {/* Charts Grid */}
{/* Details Grid */}
{/* Price Settings */}
); }