Skip to content

Commit 8c2e6ef

Browse files
Merge pull request #29 from topcoder-platform/integration-v5-challenge-api
Integration v5 challenge api
2 parents 5c9f228 + 58126ac commit 8c2e6ef

File tree

15 files changed

+130
-148
lines changed

15 files changed

+130
-148
lines changed

__tests__/shared/reducers/challenge-listing/sidebar.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,20 +169,23 @@ function testReducer(reducer) {
169169
expectedState = {
170170
...expectedState,
171171
activeBucket: 'all',
172+
isBucketSwitching: true,
172173
};
173174
expect(state).toEqual(expectedState);
174175

175176
state = reducer(state, mockActions.selectBucket('saved-filter')());
176177
expectedState = {
177178
...expectedState,
178179
activeBucket: 'saved-filter',
180+
isBucketSwitching: true,
179181
};
180182
expect(state).toEqual(expectedState);
181183

182184
state = reducer(state, mockActions.selectBucket('upcoming')());
183185
expectedState = {
184186
...expectedState,
185187
activeBucket: 'upcoming',
188+
isBucketSwitching: true,
186189
};
187190
expect(state).toEqual(expectedState);
188191
});
@@ -193,6 +196,7 @@ function testReducer(reducer) {
193196
...expectedState,
194197
activeBucket: 'saved-filter',
195198
activeSavedFilter: 1,
199+
isBucketSwitching: true,
196200
};
197201
expect(state).toEqual(expectedState);
198202
});

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@
135135
"tc-accounts": "git+https://github.com/appirio-tech/accounts-app.git#dev",
136136
"tc-core-library-js": "github:appirio-tech/tc-core-library-js#v2.6.3",
137137
"tc-ui": "^1.0.12",
138-
"topcoder-react-lib": "1000.19.14",
138+
"topcoder-react-lib": "1000.19.22",
139139
"topcoder-react-ui-kit": "^1.0.11",
140140
"topcoder-react-utils": "0.7.8",
141141
"turndown": "^4.0.2",

src/assets/images/arrow-down.svg

Lines changed: 1 addition & 4 deletions
Loading

src/server/index.js

Lines changed: 0 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -145,69 +145,6 @@ async function onExpressJsSetup(server) {
145145
tcCommunitiesDemoApi,
146146
);
147147

148-
// Get roleId by name
149-
server.use(
150-
'/community-app-assets/api/challenges/roleId',
151-
async (req, res, next) => {
152-
let tokenM2M = '';
153-
try {
154-
tokenM2M = await services.api.getTcM2mToken();
155-
} catch (err) {
156-
logger.error('proxyApi-roleId-getTcM2mToken : ', err);
157-
}
158-
159-
const params = {
160-
name: req.query.name,
161-
isActive: true,
162-
};
163-
const url = `${config.API.V5}/resource-roles?${qs.stringify(params)}`;
164-
try {
165-
let data = await fetch(url, {
166-
headers: { Authorization: `Bearer ${tokenM2M}` },
167-
});
168-
data = await data.text();
169-
res.send(data);
170-
} catch (err) {
171-
next(err);
172-
}
173-
},
174-
);
175-
176-
// Get registrants from challenge
177-
server.use(
178-
'/community-app-assets/api/challenges/:challengeId/registrants',
179-
async (req, res, next) => {
180-
let tokenM2M = '';
181-
let roleId = '';
182-
try {
183-
tokenM2M = await services.api.getTcM2mToken();
184-
} catch (err) {
185-
logger.error('proxyApi-registrants-getTcM2mToken : ', err);
186-
}
187-
188-
try {
189-
roleId = await services.challenge.getService().getRoleId('Submitter');
190-
} catch (err) {
191-
logger.error('proxyApi-registrants-getRoleId : ', err);
192-
}
193-
194-
const params = {
195-
challengeId: req.params.challengeId,
196-
roleId,
197-
};
198-
const url = `${config.API.V5}/resources?${qs.stringify(params)}`;
199-
try {
200-
let data = await fetch(url, {
201-
headers: { Authorization: `Bearer ${tokenM2M}` },
202-
});
203-
data = await data.text();
204-
res.send(data);
205-
} catch (err) {
206-
next(err);
207-
}
208-
},
209-
);
210-
211148
server.use(
212149
'/community-app-assets/api/edit-contentful-entry/:id',
213150
(req, res) => res.redirect(`${CMS_BASE_URL}/entries/${req.params.id}`),

src/shared/actions/challenge-listing/sidebar.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ export default createActions({
143143

144144
/* Pass in the bucket type. */
145145
SELECT_BUCKET: _.identity,
146+
SELECT_BUCKET_DONE: _.noop,
146147

147148
/* Pass in the index of filter inside savedFilters array. */
148149
SELECT_SAVED_FILTER: _.identity,

src/shared/components/ProfilePage/Stats/SubTrackChallengeView/index.jsx

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,20 @@ class SubTrackChallengeView extends React.Component {
137137
loadSRM,
138138
loadingMarathonUUID,
139139
loadMarathon,
140+
userId,
140141
} = this.props;
141142

142143
if (track === 'DEVELOP' || track === 'DESIGN') {
143144
if (!loadingSubTrackChallengesUUID) {
144-
loadSubtrackChallenges(handle, auth.tokenV3, track, subTrack, 0, CHALLENGE_PER_PAGE, true);
145+
loadSubtrackChallenges(
146+
handle,
147+
auth.tokenV3,
148+
track, subTrack,
149+
0,
150+
CHALLENGE_PER_PAGE,
151+
true,
152+
userId,
153+
);
145154
}
146155
} else if (track === 'DATA_SCIENCE') {
147156
if (subTrack === 'SRM') {
@@ -168,6 +177,7 @@ class SubTrackChallengeView extends React.Component {
168177
loadSRM,
169178
loadingMarathonUUID,
170179
loadMarathon,
180+
userId,
171181
} = this.props;
172182

173183
const {
@@ -184,6 +194,7 @@ class SubTrackChallengeView extends React.Component {
184194
pageNum + 1,
185195
CHALLENGE_PER_PAGE,
186196
false,
197+
userId,
187198
);
188199
this.setState({ pageNum: pageNum + 1 });
189200
}
@@ -400,7 +411,16 @@ function mapDispatchToProps(dispatch) {
400411
const action = actions.members;
401412

402413
return {
403-
loadSubtrackChallenges: (handle, tokenV3, track, subTrack, pageNum, pageSize, refresh) => {
414+
loadSubtrackChallenges: (
415+
handle,
416+
tokenV3,
417+
track,
418+
subTrack,
419+
pageNum,
420+
pageSize,
421+
refresh,
422+
userId,
423+
) => {
404424
const uuid = shortId();
405425
dispatch(action.getSubtrackChallengesInit(handle, uuid));
406426
dispatch(action.getSubtrackChallengesDone(
@@ -412,6 +432,7 @@ function mapDispatchToProps(dispatch) {
412432
pageNum,
413433
pageSize,
414434
refresh,
435+
userId,
415436
));
416437
},
417438
loadSRM: (handle, tokenV3, pageNum, pageSize, refresh) => {

src/shared/components/challenge-detail/RecommendedActiveChallenges/ChallengesCard/index.jsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import {
88
getEndDate,
99
PRIZE_MODE,
1010
getPrizePurseUI,
11-
getPrizePointsUI,
1211
getTimeLeft,
12+
getChallengeSubTrack,
1313
} from 'utils/challenge-detail/helper';
1414

1515
import TrackIcon from 'components/TrackIcon';
@@ -37,7 +37,11 @@ export default function ChallengesCard({
3737
phases,
3838
} = challenge;
3939

40-
const { track } = legacy;
40+
let { track } = legacy;
41+
const subTrack = getChallengeSubTrack(challenge.type, challengeTypes);
42+
if (subTrack === 'DEVELOP_MARATHON_MATCH') {
43+
track = 'DATA_SCIENCE';
44+
}
4145

4246
const challengeDetailLink = `${challengesUrl}/${id}`;
4347

@@ -59,12 +63,12 @@ export default function ChallengesCard({
5963
<div styleName="challenge-track">
6064
<TrackAbbreviationTooltip
6165
legacy={challenge.legacy}
62-
subTrack={challenge.subTrack}
66+
subTrack={subTrack}
6367
>
6468
<span styleName="track-icon">
6569
<TrackIcon
6670
track={track}
67-
subTrack={challenge.subTrack}
71+
subTrack={subTrack}
6872
tcoEligible={challenge.events && challenge.events.length > 0 ? challenge.events[0].eventName : ''}
6973
isDataScience={challenge.isDataScience}
7074
challengesUrl={challengesUrl}
@@ -88,7 +92,6 @@ export default function ChallengesCard({
8892
</span>
8993
<div styleName="prizes">
9094
{getPrizePurseUI(challenge, prizeMode, true, 'Prize Purse')}
91-
{getPrizePointsUI(challenge)}
9295
</div>
9396
</div>
9497
<ChallengeStatus

src/shared/components/challenge-detail/Registrants/index.jsx

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,19 @@ function formatDate(date) {
2020
}
2121

2222
function getDate(arr, handle) {
23-
const results = arr.filter(a => _.toString(a.submitter || a.handle) === _.toString(handle))
23+
const results = arr.filter(a => _.toString(a.createdBy || a.memberHandle) === _.toString(handle))
2424
.sort((a, b) => new Date(b.submissionTime || b.submissionDate).getTime()
2525
- new Date(a.submissionTime || a.submissionDate).getTime());
2626
return results[0] ? (results[0].submissionTime || results[0].submissionDate) : '';
2727
}
2828

2929
function passedCheckpoint(checkpoints, handle, results) {
30-
const mine = checkpoints.filter(c => _.toString(c.submitter) === _.toString(handle));
30+
const mine = checkpoints.filter(c => _.toString(c.createdBy) === _.toString(handle));
3131
return _.some(mine, m => _.find(results, r => r.submissionId === m.submissionId));
3232
}
3333

3434
function getPlace(results, handle, places) {
35-
const found = _.find(results, w => _.toString(w.handle) === _.toString(handle)
35+
const found = _.find(results, w => _.toString(w.memberHandle) === _.toString(handle)
3636
&& w.placement <= places && w.submissionStatus !== 'Failed Review');
3737

3838
if (found) {
@@ -99,7 +99,7 @@ export default class Registrants extends React.Component {
9999

100100
let checkpoint;
101101
if (twoRounds) {
102-
checkpoint = getDate(checkpoints, registrant.handle);
102+
checkpoint = getDate(checkpoints, registrant.memberHandle);
103103
if (!checkpoint
104104
&& moment(registrant.submissionDate).isBefore(checkpointDate)) {
105105
checkpoint = registrant.submissionDate;
@@ -188,8 +188,8 @@ export default class Registrants extends React.Component {
188188
break;
189189
}
190190
case 'Username': {
191-
valueA = `${a.handle}`.toLowerCase();
192-
valueB = `${b.handle}`.toLowerCase();
191+
valueA = `${a.memberHandle}`.toLowerCase();
192+
valueB = `${b.memberHandle}`.toLowerCase();
193193
valueIsString = true;
194194
break;
195195
}
@@ -239,16 +239,18 @@ export default class Registrants extends React.Component {
239239
onSortChange,
240240
} = this.props;
241241
const {
242-
prizes,
242+
prizeSets,
243243
legacy,
244244
} = challenge;
245245
const { track } = legacy;
246246
const { sortedRegistrants } = this.state;
247247
const { field, sort } = this.getRegistrantsSortParam();
248248
const revertSort = (sort === 'desc') ? 'asc' : 'desc';
249249
const isDesign = track.toLowerCase() === 'design';
250-
const isF2F = challenge.subTrack.indexOf('FIRST_2_FINISH') > -1;
251-
const isBugHunt = challenge.subTrack.indexOf('BUG_HUNT') > -1;
250+
const isF2F = track.indexOf('FIRST_2_FINISH') > -1;
251+
const isBugHunt = track.indexOf('BUG_HUNT') > -1;
252+
const placementPrizes = _.find(prizeSets, { type: 'placement' });
253+
const { prizes } = placementPrizes || [];
252254

253255
const checkpoints = challenge.checkpoints || [];
254256

@@ -379,7 +381,7 @@ export default class Registrants extends React.Component {
379381
<div styleName="body" role="rowgroup">
380382
{
381383
sortedRegistrants.map((r) => {
382-
const placement = getPlace(results, r.handle, places);
384+
const placement = getPlace(results, r.memberHandle, places);
383385
const colorStyle = JSON.parse(r.colorStyle.replace(/(\w+):\s*([^;]*)/g, '{"$1": "$2"}'));
384386
let checkpoint = this.getCheckPoint(r);
385387
if (checkpoint) {
@@ -393,7 +395,7 @@ export default class Registrants extends React.Component {
393395
}
394396

395397
return (
396-
<div styleName="row" key={r.handle} role="row">
398+
<div styleName="row" key={r.memberHandle} role="row">
397399
{
398400
!isDesign && !isF2F && !isBugHunt && (
399401
<div styleName="col-2">
@@ -411,19 +413,19 @@ export default class Registrants extends React.Component {
411413
<div styleName="col-3">
412414
<span role="cell">
413415
<a
414-
href={`${window.origin}/members/${r.handle}`}
416+
href={`${window.origin}/members/${r.memberHandle}`}
415417
style={colorStyle}
416418
target={`${_.includes(window.origin, 'www') ? '_self' : '_blank'}`}
417419
>
418-
{r.handle}
420+
{r.memberHandle}
419421
</a>
420422
</span>
421423
</div>
422424
<div styleName="col-4">
423425
<div styleName="sm-only title">
424426
Registration Date
425427
</div>
426-
<span role="cell">{formatDate(r.registrationDate)}</span>
428+
<span role="cell">{formatDate(r.created)}</span>
427429
</div>
428430
{
429431
twoRounds
@@ -437,7 +439,7 @@ export default class Registrants extends React.Component {
437439
{checkpoint}
438440
</span>
439441
{
440-
passedCheckpoint(checkpoints, r.handle, checkpointResults)
442+
passedCheckpoint(checkpoints, r.memberHandle, checkpointResults)
441443
&& <CheckMark styleName="passed" />
442444
}
443445
</div>
@@ -482,7 +484,7 @@ Registrants.propTypes = {
482484
challenge: PT.shape({
483485
phases: PT.arrayOf(PT.shape({
484486
actualEndDate: PT.string,
485-
phaseType: PT.string.isRequired,
487+
name: PT.string.isRequired,
486488
scheduledEndDate: PT.string,
487489
})).isRequired,
488490
allPhases: PT.arrayOf(PT.shape()),
@@ -491,7 +493,7 @@ Registrants.propTypes = {
491493
track: PT.any,
492494
}),
493495
subTrack: PT.any,
494-
prizes: PT.arrayOf(PT.number).isRequired,
496+
prizeSets: PT.arrayOf(PT.shape()).isRequired,
495497
registrants: PT.arrayOf(PT.shape()).isRequired,
496498
round1Introduction: PT.string,
497499
round2Introduction: PT.string,

0 commit comments

Comments
 (0)