1
1
/* eslint-disable @typescript-eslint/no-explicit-any */
2
2
import { memo , useMemo } from 'react' ;
3
- import {
4
- CloneIcon ,
5
- DeploymentsIcon ,
6
- DownloadIcon ,
7
- OpenIcon ,
8
- ShareIcon ,
9
- TropyIcon
10
- } from '../../icons' ;
3
+ import { Box , Button } from '../../base' ;
4
+ import { iconXSmall } from '../../constants/iconsSizes' ;
5
+ import { LeaderBoardIcon , TropyIcon } from '../../icons' ;
11
6
import { useTheme } from '../../theme' ;
12
7
import { Carousel } from '../Carousel' ;
13
8
import { Pattern } from '../CustomCatalog/CustomCard' ;
@@ -21,18 +16,16 @@ import {
21
16
HeaderTitle ,
22
17
IconContainer ,
23
18
MainContainer ,
24
- RepoSection ,
25
19
RepoTitle ,
26
20
StatsValue ,
27
- StatusLabel ,
28
21
StyledCard ,
29
22
Title ,
23
+ TitleBox ,
30
24
UserNameText
31
25
} from './styles' ;
32
26
33
27
interface MetricConfig {
34
28
label : string ;
35
- icon : React . ComponentType < any > ;
36
29
id : string ;
37
30
countKey : keyof Pattern ;
38
31
}
@@ -54,22 +47,18 @@ interface StatCardProps {
54
47
patternName : string ;
55
48
pattern : Pattern ;
56
49
userName : string ;
57
- userid : string ;
58
- icon : React . ComponentType < any > ;
59
50
status : string ;
60
51
id : string ;
61
52
onCardClick : ( pattern : Pattern ) => void ;
62
53
onIconClick : ( sortOrder : string ) => void ;
63
- onAuthorClick : ( userId : string ) => void ;
64
- onStatusClick : ( status : string ) => void ;
54
+ onOpenLeaderboard ?: ( ) => void ;
65
55
}
66
56
67
57
interface PerformersSectionProps {
68
58
useGetCatalogFilters : ( params : any ) => any ;
69
59
onCardClick : ( pattern : Pattern ) => void ;
70
60
onIconClick : ( sortOrder : string ) => void ;
71
- onAuthorClick : ( userId : string ) => void ;
72
- onStatusClick : ( status : string ) => void ;
61
+ onOpenLeaderboard ?: ( ) => void ;
73
62
}
74
63
75
64
type MetricType = 'view' | 'clone' | 'download' | 'deployment' | 'share' ;
@@ -86,32 +75,27 @@ const BASE_QUERY_PARAMS: BaseQueryParams = {
86
75
const METRICS : Record < MetricType , MetricConfig > = {
87
76
view : {
88
77
label : 'Most Opens' ,
89
- icon : OpenIcon ,
90
- id : 'open-icon' ,
78
+ id : 'open' ,
91
79
countKey : 'view_count'
92
80
} ,
93
81
clone : {
94
82
label : 'Most Clones' ,
95
- icon : CloneIcon ,
96
- id : 'clone-icon' ,
83
+ id : 'clone' ,
97
84
countKey : 'clone_count'
98
85
} ,
99
86
download : {
100
87
label : 'Most Downloads' ,
101
- icon : DownloadIcon ,
102
- id : 'download-icon' ,
88
+ id : 'download' ,
103
89
countKey : 'download_count'
104
90
} ,
105
91
deployment : {
106
92
label : 'Most Deploys' ,
107
- icon : DeploymentsIcon ,
108
- id : 'deployments-icon' ,
93
+ id : 'deployments' ,
109
94
countKey : 'deployment_count'
110
95
} ,
111
96
share : {
112
97
label : 'Most Shares' ,
113
- icon : ShareIcon ,
114
- id : 'share-icon' ,
98
+ id : 'share' ,
115
99
countKey : 'share_count'
116
100
}
117
101
} ;
@@ -128,14 +112,10 @@ const StatCardComponent: React.FC<StatCardProps> = ({
128
112
patternName,
129
113
pattern,
130
114
userName,
131
- userid,
132
- icon : Icon ,
133
115
status,
134
116
id,
135
117
onCardClick,
136
- onIconClick,
137
- onAuthorClick,
138
- onStatusClick
118
+ onIconClick
139
119
} ) => {
140
120
const handleCardClick = ( ) => {
141
121
onCardClick ( pattern ) ;
@@ -146,36 +126,25 @@ const StatCardComponent: React.FC<StatCardProps> = ({
146
126
onIconClick ( sortOrder ) ;
147
127
} ;
148
128
149
- const handleAuthorClick = ( e : React . MouseEvent ) => {
150
- e . stopPropagation ( ) ;
151
- onAuthorClick ( userid ) ;
152
- } ;
153
-
154
- const handleStatusClick = ( e : React . MouseEvent ) => {
155
- e . stopPropagation ( ) ;
156
- onStatusClick ( status ) ;
157
- } ;
129
+ const theme = useTheme ( ) ;
158
130
159
131
return (
160
132
< StyledCard elevation = { 0 } status = { status } onClick = { handleCardClick } >
161
133
< ContentWrapper cardId = { id } >
162
134
< HeaderSection >
163
135
< HeaderTitle > { label } </ HeaderTitle >
164
136
< IconContainer onClick = { ( e ) => handleIconClick ( e , `${ countKey } +desc` ) } >
165
- < Icon className = { id } />
137
+ < LeaderBoardIcon { ... iconXSmall } fill = { theme . palette . common . black } />
166
138
</ IconContainer >
167
139
</ HeaderSection >
168
140
169
141
< StatsValue > { count } </ StatsValue >
170
142
171
- < RepoSection >
143
+ < Box >
172
144
< RepoTitle > { patternName } </ RepoTitle >
173
- < UserNameText onClick = { handleAuthorClick } > by { userName } </ UserNameText >
174
- </ RepoSection >
145
+ < UserNameText > by { userName } </ UserNameText >
146
+ </ Box >
175
147
</ ContentWrapper >
176
- < StatusLabel labelType = { status } onClick = { handleStatusClick } >
177
- { status }
178
- </ StatusLabel >
179
148
</ StyledCard >
180
149
) ;
181
150
} ;
@@ -246,8 +215,6 @@ const processQueryData = (
246
215
patternName : pattern . name || 'Unknown' ,
247
216
pattern : pattern ,
248
217
userName : pattern . user ?. first_name || 'Unknown' ,
249
- userid : pattern . user ?. id ,
250
- icon : config . icon ,
251
218
id : config . id ,
252
219
status : pattern ?. catalog_data ?. content_class
253
220
} ;
@@ -257,8 +224,7 @@ const PerformersSection: React.FC<PerformersSectionProps> = ({
257
224
useGetCatalogFilters,
258
225
onCardClick,
259
226
onIconClick,
260
- onAuthorClick,
261
- onStatusClick
227
+ onOpenLeaderboard
262
228
} ) => {
263
229
const theme = useTheme ( ) ;
264
230
const { queries, isLoading, hasError } = useMetricQueries ( useGetCatalogFilters ) ;
@@ -267,13 +233,8 @@ const PerformersSection: React.FC<PerformersSectionProps> = ({
267
233
( ) =>
268
234
( Object . keys ( METRICS ) as MetricType [ ] )
269
235
. map ( ( metric ) => processQueryData ( queries , metric ) )
270
- . filter (
271
- (
272
- stat
273
- ) : stat is Omit <
274
- StatCardProps ,
275
- 'onCardClick' | 'onIconClick' | 'onAuthorClick' | 'onStatusClick'
276
- > => Boolean ( stat )
236
+ . filter ( ( stat ) : stat is Omit < StatCardProps , 'onCardClick' | 'onIconClick' > =>
237
+ Boolean ( stat )
277
238
) ,
278
239
[ queries ]
279
240
) ;
@@ -291,24 +252,29 @@ const PerformersSection: React.FC<PerformersSectionProps> = ({
291
252
{ ...stat }
292
253
onCardClick = { onCardClick }
293
254
onIconClick = { onIconClick }
294
- onAuthorClick = { onAuthorClick }
295
- onStatusClick = { onStatusClick }
296
255
/>
297
256
) ) ;
298
257
299
258
return (
300
259
< ErrorBoundary >
301
260
< MainContainer >
302
- < Title >
303
- Top Performers
304
- < TropyIcon
305
- style = { {
306
- height : '2rem' ,
307
- width : '2rem' ,
308
- color : theme . palette . icon . secondary
309
- } }
310
- />
311
- </ Title >
261
+ < TitleBox >
262
+ < Box display = { 'flex' } alignItems = "center" gap = { 1 } >
263
+ < Title > Top Performers</ Title >
264
+ < TropyIcon
265
+ style = { {
266
+ height : '2rem' ,
267
+ width : '2rem' ,
268
+ color : theme . palette . icon . secondary
269
+ } }
270
+ />
271
+ </ Box >
272
+ { onOpenLeaderboard && (
273
+ < Button variant = "contained" onClick = { ( ) => onOpenLeaderboard ( ) } >
274
+ Open Leaderboard
275
+ </ Button >
276
+ ) }
277
+ </ TitleBox >
312
278
< CardsContainer >
313
279
{ isLoading && < StateCardSekeleton /> }
314
280
< Carousel items = { statComponents } />
0 commit comments