|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import React from 'react'; |
|
|
import { Card, Avatar, Skeleton, Tag } from '@douyinfe/semi-ui'; |
|
|
import { VChart } from '@visactor/react-vchart'; |
|
|
import { useNavigate } from 'react-router-dom'; |
|
|
import { useTranslation } from 'react-i18next'; |
|
|
|
|
|
const StatsCards = ({ |
|
|
groupedStatsData, |
|
|
loading, |
|
|
getTrendSpec, |
|
|
CARD_PROPS, |
|
|
CHART_CONFIG, |
|
|
}) => { |
|
|
const navigate = useNavigate(); |
|
|
const { t } = useTranslation(); |
|
|
return ( |
|
|
<div className='mb-4'> |
|
|
<div className='grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4'> |
|
|
{groupedStatsData.map((group, idx) => ( |
|
|
<Card |
|
|
key={idx} |
|
|
{...CARD_PROPS} |
|
|
className={`${group.color} border-0 !rounded-2xl w-full`} |
|
|
title={group.title} |
|
|
> |
|
|
<div className='space-y-4'> |
|
|
{group.items.map((item, itemIdx) => ( |
|
|
<div |
|
|
key={itemIdx} |
|
|
className='flex items-center justify-between cursor-pointer' |
|
|
onClick={item.onClick} |
|
|
> |
|
|
<div className='flex items-center'> |
|
|
<Avatar |
|
|
className='mr-3' |
|
|
size='small' |
|
|
color={item.avatarColor} |
|
|
> |
|
|
{item.icon} |
|
|
</Avatar> |
|
|
<div> |
|
|
<div className='text-xs text-gray-500'>{item.title}</div> |
|
|
<div className='text-lg font-semibold'> |
|
|
<Skeleton |
|
|
loading={loading} |
|
|
active |
|
|
placeholder={ |
|
|
<Skeleton.Paragraph |
|
|
active |
|
|
rows={1} |
|
|
style={{ |
|
|
width: '65px', |
|
|
height: '24px', |
|
|
marginTop: '4px', |
|
|
}} |
|
|
/> |
|
|
} |
|
|
> |
|
|
{item.value} |
|
|
</Skeleton> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
{item.title === t('当前余额') ? ( |
|
|
<Tag |
|
|
color='white' |
|
|
shape='circle' |
|
|
size='large' |
|
|
onClick={(e) => { |
|
|
e.stopPropagation(); |
|
|
navigate('/console/topup'); |
|
|
}} |
|
|
> |
|
|
{t('充值')} |
|
|
</Tag> |
|
|
) : ( |
|
|
(loading || |
|
|
(item.trendData && item.trendData.length > 0)) && ( |
|
|
<div className='w-24 h-10'> |
|
|
<VChart |
|
|
spec={getTrendSpec(item.trendData, item.trendColor)} |
|
|
option={CHART_CONFIG} |
|
|
/> |
|
|
</div> |
|
|
) |
|
|
)} |
|
|
</div> |
|
|
))} |
|
|
</div> |
|
|
</Card> |
|
|
))} |
|
|
</div> |
|
|
</div> |
|
|
); |
|
|
}; |
|
|
|
|
|
export default StatsCards; |
|
|
|