11import React , { useCallback , useEffect , useState } from 'react' ;
22import clsx from "clsx" ;
33import { BountyTileData , ContestSchedule , ContestTileData , ContestTileProps , ContestTileVariant } from "./ContestTile.types" ;
4- import { Status } from '../types' ;
4+ import { Status , TagSize , TagVariant } from '../types' ;
55import { ContestStatus } from '../ContestStatus' ;
66import { Countdown } from './ContestTile' ;
77import { getDates } from '../../utils/time' ;
8+ import { Tag } from '../Tag' ;
9+ import { Icon } from '../Icon' ;
10+ import wolfbotIcon from "../../../public/icons/wolfbot.svg" ;
811
912export default function CompactTemplate ( {
1013 variant,
@@ -19,6 +22,7 @@ export default function CompactTemplate({
1922 "compact--light" : variant === ContestTileVariant . COMPACT_LIGHT ,
2023 "compact--dark" : variant === ContestTileVariant . COMPACT_DARK ,
2124 } ) ;
25+ const isDarkTile = variant === ContestTileVariant . DARK || variant === ContestTileVariant . COMPACT_DARK ;
2226
2327 const tileClasses = clsx ( {
2428 c4contesttile : true ,
@@ -29,11 +33,13 @@ export default function CompactTemplate({
2933 < div id = { htmlId ?? undefined } className = { clsx ( variantClasses , tileClasses ) } >
3034 < div className = "container--inner compact-content" >
3135 { contestData && < IsContest
36+ isDarkTile = { isDarkTile }
3237 title = { title }
3338 contestData = { contestData }
3439 sponsorUrl = { sponsorUrl }
3540 sponsorImage = { sponsorImage } /> }
3641 { bountyData && < IsBounty
42+ isDarkTile = { isDarkTile }
3743 title = { title }
3844 bountyData = { bountyData }
3945 sponsorUrl = { sponsorUrl }
@@ -45,14 +51,20 @@ export default function CompactTemplate({
4551}
4652
4753
48- const IsContest = ( { title, contestData, sponsorUrl, sponsorImage} : {
54+ const IsContest = ( { title, isDarkTile = true , contestData, sponsorUrl, sponsorImage} : {
4955 title : string ;
56+ isDarkTile : boolean ;
5057 contestData : ContestTileData ;
5158 sponsorUrl : string | undefined ;
5259 sponsorImage : string | undefined ;
5360} ) => {
54- const { startDate, endDate, amount, contestUrl, contestType } = contestData ;
61+ const { startDate, endDate, amount, contestUrl, contestType, ecosystem , languages } = contestData ;
5562 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+ }
5668
5769 const updateContestTileStatus = useCallback ( ( ) => {
5870 if ( contestData ) {
@@ -137,16 +149,48 @@ const IsContest = ({title, contestData, sponsorUrl, sponsorImage}: {
137149 </ div >
138150 < p className = "amount" > { amount } </ p >
139151 </ 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 > }
140179 </ div >
141180) }
142181
143- const IsBounty = ( { title, bountyData, sponsorUrl, sponsorImage} : {
182+ const IsBounty = ( { title, isDarkTile = true , bountyData, sponsorUrl, sponsorImage} : {
144183 title : string ;
184+ isDarkTile : boolean ;
145185 bountyData : BountyTileData ;
146186 sponsorUrl : string | undefined ;
147187 sponsorImage : string | undefined ;
148188} ) => {
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+ }
150194
151195 return (
152196 < div className = "body--bounty" >
@@ -189,5 +233,20 @@ const IsBounty = ({title, bountyData, sponsorUrl, sponsorImage}: {
189233 < strong > Max Bounty</ strong >
190234 < p className = "amount" > { amount } </ p >
191235 </ 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 > }
192251 </ div >
193252) }
0 commit comments