1
1
import React , { useCallback , useEffect , useState } from 'react' ;
2
2
import clsx from "clsx" ;
3
3
import { BountyTileData , ContestSchedule , ContestTileData , ContestTileProps , ContestTileVariant } from "./ContestTile.types" ;
4
- import { Status } from '../types' ;
4
+ import { Status , TagSize , TagVariant } from '../types' ;
5
5
import { ContestStatus } from '../ContestStatus' ;
6
6
import { Countdown } from './ContestTile' ;
7
7
import { getDates } from '../../utils/time' ;
8
+ import { Tag } from '../Tag' ;
9
+ import { Icon } from '../Icon' ;
10
+ import wolfbotIcon from "../../../public/icons/wolfbot.svg" ;
8
11
9
12
export default function CompactTemplate ( {
10
13
variant,
@@ -19,6 +22,7 @@ export default function CompactTemplate({
19
22
"compact--light" : variant === ContestTileVariant . COMPACT_LIGHT ,
20
23
"compact--dark" : variant === ContestTileVariant . COMPACT_DARK ,
21
24
} ) ;
25
+ const isDarkTile = variant === ContestTileVariant . DARK || variant === ContestTileVariant . COMPACT_DARK ;
22
26
23
27
const tileClasses = clsx ( {
24
28
c4contesttile : true ,
@@ -29,11 +33,13 @@ export default function CompactTemplate({
29
33
< div id = { htmlId ?? undefined } className = { clsx ( variantClasses , tileClasses ) } >
30
34
< div className = "container--inner compact-content" >
31
35
{ contestData && < IsContest
36
+ isDarkTile = { isDarkTile }
32
37
title = { title }
33
38
contestData = { contestData }
34
39
sponsorUrl = { sponsorUrl }
35
40
sponsorImage = { sponsorImage } /> }
36
41
{ bountyData && < IsBounty
42
+ isDarkTile = { isDarkTile }
37
43
title = { title }
38
44
bountyData = { bountyData }
39
45
sponsorUrl = { sponsorUrl }
@@ -45,14 +51,20 @@ export default function CompactTemplate({
45
51
}
46
52
47
53
48
- const IsContest = ( { title, contestData, sponsorUrl, sponsorImage} : {
54
+ const IsContest = ( { title, isDarkTile = true , contestData, sponsorUrl, sponsorImage} : {
49
55
title : string ;
56
+ isDarkTile : boolean ;
50
57
contestData : ContestTileData ;
51
58
sponsorUrl : string | undefined ;
52
59
sponsorImage : string | undefined ;
53
60
} ) => {
54
- const { startDate, endDate, amount, contestUrl, contestType } = contestData ;
61
+ const { startDate, endDate, amount, contestUrl, contestType, ecosystem , languages } = contestData ;
55
62
const [ contestTimelineObject , setContestTimelineObject ] = useState < ContestSchedule | undefined > ( ) ;
63
+ const [ hasBotRace , setHasBotRace ] = useState ( contestData ? ! ! contestData . botFindingsRepo : false ) ;
64
+ let ecosystemLogoName : string = "" ;
65
+ if ( ecosystem && ( ecosystem === "Polkadot" || ecosystem === "Ethereum" ) ) {
66
+ ecosystemLogoName = `logo-${ ecosystem . toLowerCase ( ) } `
67
+ }
56
68
57
69
const updateContestTileStatus = useCallback ( ( ) => {
58
70
if ( contestData ) {
@@ -137,16 +149,48 @@ const IsContest = ({title, contestData, sponsorUrl, sponsorImage}: {
137
149
</ div >
138
150
< p className = "amount" > { amount } </ p >
139
151
</ div >
152
+ { ( ( hasBotRace && contestTimelineObject && ( contestTimelineObject . botRaceStatus === Status . UPCOMING ||
153
+ contestTimelineObject . botRaceStatus === Status . LIVE ) ) || ecosystem || languages ?. length > 0 ) && < div className = "tags" >
154
+ { hasBotRace && contestTimelineObject &&
155
+ ( contestTimelineObject . botRaceStatus === Status . UPCOMING ||
156
+ contestTimelineObject . botRaceStatus === Status . LIVE ) && (
157
+ < Tag
158
+ variant = { isDarkTile ? TagVariant . DEFAULT : TagVariant . WHITE_OUTLINE }
159
+ label = { contestTimelineObject . botRaceStatus === Status . LIVE ? "Bot Race live" : "1st hour: Bot Race" }
160
+ iconLeft = { wolfbotIcon }
161
+ size = { TagSize . NARROW }
162
+ />
163
+ ) }
164
+ { ecosystem && < Tag
165
+ variant = { isDarkTile ? TagVariant . DEFAULT : TagVariant . WHITE_OUTLINE }
166
+ label = { ecosystem }
167
+ iconLeft = { ecosystemLogoName ? < Icon name = { ecosystemLogoName } size = "small" color = "white" /> : undefined }
168
+ size = { TagSize . NARROW }
169
+ /> }
170
+ { languages
171
+ && languages . length > 0
172
+ && languages . map ( ( language ) => < Tag
173
+ variant = { isDarkTile ? TagVariant . DEFAULT : TagVariant . WHITE_OUTLINE }
174
+ label = { language }
175
+ size = { TagSize . NARROW }
176
+ />
177
+ ) }
178
+ </ div > }
140
179
</ div >
141
180
) }
142
181
143
- const IsBounty = ( { title, bountyData, sponsorUrl, sponsorImage} : {
182
+ const IsBounty = ( { title, isDarkTile = true , bountyData, sponsorUrl, sponsorImage} : {
144
183
title : string ;
184
+ isDarkTile : boolean ;
145
185
bountyData : BountyTileData ;
146
186
sponsorUrl : string | undefined ;
147
187
sponsorImage : string | undefined ;
148
188
} ) => {
149
- const { amount, bountyUrl } = bountyData ;
189
+ const { amount, bountyUrl, ecosystem, languages } = bountyData ;
190
+ let ecosystemLogoName : string = "" ;
191
+ if ( ecosystem && ( ecosystem === "Polkadot" || ecosystem === "Ethereum" ) ) {
192
+ ecosystemLogoName = `logo-${ ecosystem . toLowerCase ( ) } `
193
+ }
150
194
151
195
return (
152
196
< div className = "body--bounty" >
@@ -189,5 +233,20 @@ const IsBounty = ({title, bountyData, sponsorUrl, sponsorImage}: {
189
233
< strong > Max Bounty</ strong >
190
234
< p className = "amount" > { amount } </ p >
191
235
</ div >
236
+ { ( ecosystem || languages ?. length > 0 ) && < div className = "tags" >
237
+ { ecosystem && < Tag
238
+ variant = { isDarkTile ? TagVariant . DEFAULT : TagVariant . WHITE_OUTLINE }
239
+ label = { ecosystem }
240
+ iconLeft = { ecosystemLogoName ? < Icon name = { ecosystemLogoName } size = "small" color = "white" /> : undefined }
241
+ size = { TagSize . NARROW }
242
+ /> }
243
+ { languages
244
+ && languages . length > 0
245
+ && languages . map ( ( language ) => < Tag
246
+ variant = { isDarkTile ? TagVariant . DEFAULT : TagVariant . WHITE_OUTLINE }
247
+ label = { language }
248
+ size = { TagSize . NARROW } />
249
+ ) }
250
+ </ div > }
192
251
</ div >
193
252
) }
0 commit comments