| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| 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,
|
| };
|
| };
|
|
|