import { getDashboardData } from '@/web/support/wallet/usage/api'; import { Box, Flex } from '@chakra-ui/react'; import { formatNumber } from '@fastgpt/global/common/math/tools'; import MyBox from '@fastgpt/web/components/common/MyBox'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import { addDays } from 'date-fns'; import { useTranslation } from 'next-i18next'; import React, { useMemo } from 'react'; import { ResponsiveContainer, LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, TooltipProps } from 'recharts'; import { NameType, ValueType } from 'recharts/types/component/DefaultTooltipContent'; import { UnitType, UsageFilterParams } from './type'; import dayjs from 'dayjs'; export type usageFormType = { date: string; totalPoints: number; }; const CustomTooltip = ({ active, payload }: TooltipProps) => { const data = payload?.[0]?.payload as usageFormType; const { t } = useTranslation(); if (active && data) { return ( {data.date} {`${formatNumber(data.totalPoints)} ${t('account_usage:points')}`} ); } return null; }; const UsageDashboard = ({ filterParams, Tabs, Selectors }: { filterParams: UsageFilterParams; Tabs: React.ReactNode; Selectors: React.ReactNode; }) => { const { t } = useTranslation(); const { dateRange, selectTmbIds, usageSources, unit, isSelectAllSource, isSelectAllTmb } = filterParams; const { data: totalPoints = [], loading: totalPointsLoading } = useRequest2( () => getDashboardData({ dateStart: dateRange.from ? dayjs(dateRange.from.setHours(0, 0, 0, 0)).format() : dayjs(new Date().setHours(0, 0, 0, 0)).format(), dateEnd: dateRange.to ? dayjs(addDays(dateRange.to, 1).setHours(0, 0, 0, 0)).format() : dayjs(addDays(new Date(), 1).setHours(0, 0, 0, 0)).format(), sources: isSelectAllSource ? undefined : usageSources, teamMemberIds: isSelectAllTmb ? undefined : selectTmbIds, unit }).then((res) => res.map((item) => ({ ...item, date: dayjs(item.date).format('YYYY-MM-DD') })) ), { manual: false, refreshDeps: [filterParams] } ); const totalUsage = useMemo(() => { return totalPoints.reduce((acc, curr) => acc + curr.totalPoints, 0); }, [totalPoints]); return ( <> {Tabs} {Selectors} {`${t('account_usage:total_usage')}:`} {`${formatNumber(totalUsage)} ${t('account_usage:points')}`} {t('account_usage:points')} } /> ); }; export default React.memo(UsageDashboard);