File size: 4,106 Bytes
4ef3a0e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/*

Copyright (C) 2025 QuantumNous



This program is free software: you can redistribute it and/or modify

it under the terms of the GNU Affero General Public License as

published by the Free Software Foundation, either version 3 of the

License, or (at your option) any later version.



This program is distributed in the hope that it will be useful,

but WITHOUT ANY WARRANTY; without even the implied warranty of

MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

GNU Affero General Public License for more details.



You should have received a copy of the GNU Affero General Public License

along with this program. If not, see <https://www.gnu.org/licenses/>.



For commercial licensing, please contact support@quantumnous.com

*/

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;