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