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