| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| import { useMemo } from 'react'; |
| import { Wallet, Activity, Zap, Gauge } from 'lucide-react'; |
| import { |
| IconMoneyExchangeStroked, |
| IconHistogram, |
| IconCoinMoneyStroked, |
| IconTextStroked, |
| IconPulse, |
| IconStopwatchStroked, |
| IconTypograph, |
| IconSend, |
| } from '@douyinfe/semi-icons'; |
| import { renderQuota } from '../../helpers'; |
| import { createSectionTitle } from '../../helpers/dashboard'; |
|
|
| export const useDashboardStats = ( |
| userState, |
| consumeQuota, |
| consumeTokens, |
| times, |
| trendData, |
| performanceMetrics, |
| navigate, |
| t, |
| ) => { |
| const groupedStatsData = useMemo( |
| () => [ |
| { |
| title: createSectionTitle(Wallet, t('账户数据')), |
| color: 'bg-blue-50', |
| items: [ |
| { |
| title: t('当前余额'), |
| value: renderQuota(userState?.user?.quota), |
| icon: <IconMoneyExchangeStroked />, |
| avatarColor: 'blue', |
| trendData: [], |
| trendColor: '#3b82f6', |
| }, |
| { |
| title: t('历史消耗'), |
| value: renderQuota(userState?.user?.used_quota), |
| icon: <IconHistogram />, |
| avatarColor: 'purple', |
| trendData: [], |
| trendColor: '#8b5cf6', |
| }, |
| ], |
| }, |
| { |
| title: createSectionTitle(Activity, t('使用统计')), |
| color: 'bg-green-50', |
| items: [ |
| { |
| title: t('请求次数'), |
| value: userState.user?.request_count, |
| icon: <IconSend />, |
| avatarColor: 'green', |
| trendData: [], |
| trendColor: '#10b981', |
| }, |
| { |
| title: t('统计次数'), |
| value: times, |
| icon: <IconPulse />, |
| avatarColor: 'cyan', |
| trendData: trendData.times, |
| trendColor: '#06b6d4', |
| }, |
| ], |
| }, |
| { |
| title: createSectionTitle(Zap, t('资源消耗')), |
| color: 'bg-yellow-50', |
| items: [ |
| { |
| title: t('统计额度'), |
| value: renderQuota(consumeQuota), |
| icon: <IconCoinMoneyStroked />, |
| avatarColor: 'yellow', |
| trendData: trendData.consumeQuota, |
| trendColor: '#f59e0b', |
| }, |
| { |
| title: t('统计Tokens'), |
| value: isNaN(consumeTokens) ? 0 : consumeTokens.toLocaleString(), |
| icon: <IconTextStroked />, |
| avatarColor: 'pink', |
| trendData: trendData.tokens, |
| trendColor: '#ec4899', |
| }, |
| ], |
| }, |
| { |
| title: createSectionTitle(Gauge, t('性能指标')), |
| color: 'bg-indigo-50', |
| items: [ |
| { |
| title: t('平均RPM'), |
| value: performanceMetrics.avgRPM, |
| icon: <IconStopwatchStroked />, |
| avatarColor: 'indigo', |
| trendData: trendData.rpm, |
| trendColor: '#6366f1', |
| }, |
| { |
| title: t('平均TPM'), |
| value: performanceMetrics.avgTPM, |
| icon: <IconTypograph />, |
| avatarColor: 'orange', |
| trendData: trendData.tpm, |
| trendColor: '#f97316', |
| }, |
| ], |
| }, |
| ], |
| [ |
| userState?.user?.quota, |
| userState?.user?.used_quota, |
| userState?.user?.request_count, |
| times, |
| consumeQuota, |
| consumeTokens, |
| trendData, |
| performanceMetrics, |
| navigate, |
| t, |
| ], |
| ); |
|
|
| return { |
| groupedStatsData, |
| }; |
| }; |
|
|