1
1
import React , { Component , PropTypes } from 'react' ;
2
- import fetch from 'isomorphic-fetch' ;
3
2
import moment from 'moment' ;
4
- import _ from 'lodash' ;
5
3
import LeaderboardAvatar from '../LeaderboardAvatar/LeaderboardAvatar' ;
6
4
import ChallengeProgressBar from '../ChallengeProgressBar/ChallengeProgressBar' ;
7
5
import ProgressBarTooltip from '../ChallengeCard/Tooltips/ProgressBarTooltip' ;
@@ -15,7 +13,6 @@ import './ChallengeStatus.scss';
15
13
// Constants
16
14
const ID_LENGTH = 6 ;
17
15
const MAX_VISIBLE_WINNERS = 3 ;
18
- const MOCK_PHOTO = 'https://acrobatusers.com/assets/images/template/author_generic.jpg' ;
19
16
const STALLED_MSG = 'Stalled' ;
20
17
const DRAFT_MSG = 'In Draft' ;
21
18
const STALLED_TIME_LEFT_MSG = 'Challenge is currently on hold' ;
@@ -149,13 +146,15 @@ const getTimeToGo = (start, end) => {
149
146
* Returns an user profile object as expected by the UserAvatarTooltip
150
147
* @param {String } handle
151
148
*/
152
- function getSampleProfile ( user ) {
153
- const { handle } = user ;
149
+ function getProfile ( user ) {
150
+ const { handle, placement } = user ;
151
+ const photoLink = user . photoURL || `i/m/${ handle } .jpeg` ;
154
152
return {
155
153
handle,
154
+ placement,
156
155
country : '' ,
157
156
memberSince : '' ,
158
- photoLink : `i/m/ ${ handle } .jpeg` ,
157
+ photoLink,
159
158
ratingSummary : [ ] ,
160
159
} ;
161
160
}
@@ -173,28 +172,48 @@ class ChallengeStatus extends Component {
173
172
DS_CHALLENGE_URL ,
174
173
FORUM_URL ,
175
174
} ;
176
- this . handleHover = this . handleHover . bind ( this ) ;
177
- this . getDevelopmentWinners = this . getDevelopmentWinners . bind ( this ) ;
178
- this . getDesignWinners = this . getDesignWinners . bind ( this ) ;
175
+
179
176
this . registrantsLink = this . registrantsLink . bind ( this ) ;
180
177
}
181
178
182
179
renderLeaderboard ( ) {
183
180
const { challenge } = this . props ;
184
181
const { DS_CHALLENGE_URL , CHALLENGE_URL } = this . state ;
185
182
const { id, track } = challenge ;
183
+
186
184
const challengeURL = track === 'DATA_SCIENCE' ? DS_CHALLENGE_URL : CHALLENGE_URL ;
187
- const leaderboard = this . state . winners && this . state . winners . map ( winner => (
188
- < div className = "avatar-container" key = { winner . handle } >
189
- < UserAvatarTooltip user = { getSampleProfile ( winner ) } >
190
- < LeaderboardAvatar member = { winner } />
191
- </ UserAvatarTooltip >
192
- </ div >
193
- ) ) ;
185
+ let winners = challenge . winners && challenge . winners . filter ( winner => winner . type === 'final' )
186
+ . map ( winner => ( {
187
+ handle : winner . handle ,
188
+ position : winner . placement ,
189
+ photoURL : winner . photoURL || `${ this . props . MAIN_URL } /i/m/${ winner . handle } .jpeg` ,
190
+ } ) ) ;
191
+
192
+ if ( winners && winners . length > MAX_VISIBLE_WINNERS ) {
193
+ const lastItem = {
194
+ handle : `+${ winners . length - MAX_VISIBLE_WINNERS } ` ,
195
+ isLastItem : true ,
196
+ } ;
197
+ winners = winners . slice ( 0 , MAX_VISIBLE_WINNERS ) ;
198
+ winners . push ( lastItem ) ;
199
+ }
200
+
201
+ const leaderboard = winners && winners . map ( ( winner ) => {
202
+ if ( winner . isLastItem ) {
203
+ return < LeaderboardAvatar key = { winner . handle } member = { winner } url = { `${ this . props . detailLink } #winner` } /> ;
204
+ }
205
+ const userProfile = getProfile ( winner ) ;
206
+ return (
207
+ < div className = "avatar-container" key = { winner . handle } >
208
+ < UserAvatarTooltip user = { userProfile } >
209
+ < LeaderboardAvatar member = { winner } />
210
+ </ UserAvatarTooltip >
211
+ </ div > ) ;
212
+ } ) ;
194
213
return leaderboard || (
195
- < span className = "winners" onMouseEnter = { this . handleHover } >
196
- < a href = { `${ challengeURL } ${ id } ` } > Winners </ a >
197
- </ span > ) ;
214
+ < span className = "winners" >
215
+ < a href = { `${ challengeURL } ${ id } #winner ` } > Results </ a >
216
+ </ span > ) ;
198
217
}
199
218
200
219
renderRegisterButton ( ) {
@@ -334,16 +353,15 @@ class ChallengeStatus extends Component {
334
353
< div >
335
354
{ this . renderLeaderboard ( ) }
336
355
< span className = "challenge-stats" >
337
- < span >
356
+ < span className = "num-reg" >
338
357
< Tooltip content = { numRegistrantsTipText ( challenge . numRegistrants ) } >
339
358
< a className = "num-reg past" href = { this . registrantsLink ( challenge , MM_REG ) } >
340
359
< RegistrantsIcon /> < span className = "number" > { challenge . numRegistrants } </ span >
341
360
</ a >
342
361
</ Tooltip >
343
362
</ span >
344
- < span >
363
+ < span className = "num-sub" >
345
364
< Tooltip content = { numSubmissionsTipText ( challenge . numSubmissions ) } >
346
-
347
365
< a className = "num-sub past" href = { this . registrantsLink ( challenge , MM_SUB ) } >
348
366
< SubmissionsIcon /> < span className = "number" > { challenge . numSubmissions } </ span >
349
367
</ a >
@@ -360,86 +378,6 @@ class ChallengeStatus extends Component {
360
378
) ;
361
379
}
362
380
363
- getDevelopmentWinners ( challengeId ) {
364
- return new Promise ( ( resolve , reject ) => {
365
- fetch ( `${ this . props . config . API_URL_V2 } /develop/challenges/${ challengeId } ` )
366
- . then ( res => res . json ( ) )
367
- . then ( ( data ) => {
368
- let winners = data . submissions . filter ( sub => sub . placement )
369
- . map ( winner => ( {
370
- handle : winner . handle ,
371
- position : winner . placement ,
372
- photoURL : MOCK_PHOTO ,
373
- } ) ) ;
374
- winners = _ . uniqWith ( winners , _ . isEqual ) ;
375
- if ( winners . length > MAX_VISIBLE_WINNERS ) {
376
- const lastItem = {
377
- handle : `+${ winners . length - MAX_VISIBLE_WINNERS } ` ,
378
- } ;
379
- winners = winners . slice ( 0 , MAX_VISIBLE_WINNERS ) ;
380
- winners . push ( lastItem ) ;
381
- }
382
- resolve ( winners ) ;
383
- } )
384
- . catch ( err => reject ( err ) ) ;
385
- } ) ;
386
- }
387
-
388
- getDesignWinners ( challengeId ) {
389
- return new Promise ( ( resolve , reject ) => {
390
- fetch ( `${ this . props . config . API_URL_V2 } /design/challenges/result/${ challengeId } ` )
391
- . then ( res => res . json ( ) )
392
- . then ( ( data ) => {
393
- let winners = data . results . filter ( sub => sub . placement )
394
- . map ( winner => ( {
395
- handle : winner . handle ,
396
- position : winner . placement ,
397
- photoURL : MOCK_PHOTO ,
398
- } ) ) ;
399
- winners = _ . uniqWith ( winners , _ . isEqual ) ;
400
- if ( winners . length > MAX_VISIBLE_WINNERS ) {
401
- const lastItem = {
402
- handle : `+${ winners . length - MAX_VISIBLE_WINNERS } ` ,
403
- } ;
404
- winners = winners . slice ( 0 , MAX_VISIBLE_WINNERS ) ;
405
- winners . push ( lastItem ) ;
406
- }
407
- resolve ( winners ) ;
408
- } )
409
- . catch ( err => reject ( err ) ) ;
410
- } ) ;
411
- }
412
-
413
-
414
- getWinners ( challengeType , challengeId ) {
415
- switch ( challengeType ) {
416
- case 'develop' :
417
- return this . getDevelopmentWinners ( challengeId ) ;
418
- case 'design' :
419
- return this . getDesignWinners ( challengeId ) ;
420
- default :
421
- return this . getDevelopmentWinners ( challengeId ) ;
422
- }
423
- }
424
-
425
- /**
426
- * Get the list of winners when the user hovers
427
- * over the status
428
- */
429
- handleHover ( ) {
430
- if ( ! this . state . winners ) {
431
- const { challenge } = this . props ;
432
- const { id, track } = challenge ;
433
-
434
- // We don't have the API for data science challenge
435
- if ( track === 'DATA_SCIENCE' ) {
436
- return ;
437
- }
438
- const results = this . getWinners ( track . toLowerCase ( ) , id ) ;
439
- results . then ( winners => this . setState ( { winners } ) ) ;
440
- }
441
- }
442
-
443
381
render ( ) {
444
382
const { challenge } = this . props ;
445
383
const status = challenge . status === 'COMPLETED' ? 'completed' : '' ;
@@ -456,12 +394,14 @@ ChallengeStatus.defaultProps = {
456
394
config : { } ,
457
395
detailLink : '' ,
458
396
sampleWinnerProfile : undefined ,
397
+ MAIN_URL : process . env . MAIN_URL ,
459
398
} ;
460
399
461
400
ChallengeStatus . propTypes = {
462
401
challenge : PropTypes . object ,
463
402
config : PropTypes . object ,
464
403
detailLink : PropTypes . string ,
404
+ MAIN_URL : PropTypes . string ,
465
405
} ;
466
406
467
407
export default ChallengeStatus ;
0 commit comments