Skip to content

Commit 80a8e72

Browse files
committed
fix: review opp only for reviewers
1 parent 33de1f0 commit 80a8e72

File tree

7 files changed

+58
-20
lines changed

7 files changed

+58
-20
lines changed

__tests__/shared/components/challenge-listing/Filters/__snapshots__/FiltersPanel.jsx.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ exports[`Matches shallow shapshot 2`] = `
6666
disabled={false}
6767
expanding={false}
6868
isAuth={false}
69+
isReviewer={false}
6970
past={false}
7071
/>
7172
</div>

__tests__/shared/components/challenge-listing/Sidebar/__snapshots__/index.jsx.snap

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ exports[`Matches shallow shapshot 1`] = `
1313
disabled={false}
1414
expanding={false}
1515
isAuth={false}
16+
isReviewer={false}
1617
past={false}
1718
selectBucket={[MockFunction]}
1819
/>
@@ -36,6 +37,7 @@ exports[`Matches shallow shapshot 2`] = `
3637
disabled={false}
3738
expanding={false}
3839
isAuth={false}
40+
isReviewer={false}
3941
past={false}
4042
selectBucket={[MockFunction]}
4143
/>

src/shared/components/challenge-listing/Filters/FiltersPanel/index.jsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import Tooltip from 'components/Tooltip';
3131
import { config, Link } from 'topcoder-react-utils';
3232
import { COMPOSE, PRIORITY } from 'react-css-super-themr';
3333
import { REVIEW_OPPORTUNITY_TYPES } from 'utils/tc';
34+
import { isReviewerOrAdmin } from 'utils/challenge-listing/helper';
3435
import { isFilterEmpty, isPastBucket, BUCKETS } from 'utils/challenge-listing/buckets';
3536
import SwitchWithLabel from 'components/SwitchWithLabel';
3637
import ChallengeSearchBar from 'containers/challenge-listing/ChallengeSearchBar';
@@ -382,6 +383,7 @@ export default function FiltersPanel({
382383
disabled={disabled}
383384
expanding={expanding}
384385
isAuth={isAuth}
386+
isReviewer={isReviewerOrAdmin(auth)}
385387
selectBucket={selectBucket}
386388
past={past}
387389
/>

src/shared/components/challenge-listing/Listing/index.jsx

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import Bucket from './Bucket';
1515
import ReviewOpportunityBucket from './ReviewOpportunityBucket';
1616
import CardPlaceholder from '../placeholders/ChallengeCard';
1717
import './style.scss';
18+
import { isReviewerOrAdmin } from '../../../utils/challenge-listing/helper';
1819

1920
// const Filter = challengeUtils.filter;
2021
const LOADING_MESSAGE = 'Loading Challenges';
@@ -146,25 +147,33 @@ function Listing({
146147
* and are only shown when explicitly chosen from the sidebar */
147148
isReviewOpportunitiesBucket(bucket)
148149
? (
149-
<ReviewOpportunityBucket
150-
// bucket={buckets[bucket]}
151-
bucket={bucket}
152-
challengesUrl={challengesUrl}
153-
expandedTags={expandedTags}
154-
expandTag={expandTag}
155-
filterState={filterState}
156-
keepPlaceholders={keepPastPlaceholders}
157-
needLoad={needLoad}
158-
loading={loadingReviewOpportunities}
159-
loadMore={loadMoreReviewOpportunities}
160-
opportunities={reviewOpportunities}
161-
setFilterState={setFilterState}
162-
setSort={sort => setSort(bucket, sort)}
163-
sort={sorts[bucket]}
164-
challengeTypes={challengeTypes}
165-
isLoggedIn={isLoggedIn}
166-
setSearchText={setSearchText}
167-
/>
150+
<React.Fragment>
151+
{
152+
isReviewerOrAdmin(auth) ? (
153+
<ReviewOpportunityBucket
154+
// bucket={buckets[bucket]}
155+
bucket={bucket}
156+
challengesUrl={challengesUrl}
157+
expandedTags={expandedTags}
158+
expandTag={expandTag}
159+
filterState={filterState}
160+
keepPlaceholders={keepPastPlaceholders}
161+
needLoad={needLoad}
162+
loading={loadingReviewOpportunities}
163+
loadMore={loadMoreReviewOpportunities}
164+
opportunities={reviewOpportunities}
165+
setFilterState={setFilterState}
166+
setSort={sort => setSort(bucket, sort)}
167+
sort={sorts[bucket]}
168+
challengeTypes={challengeTypes}
169+
isLoggedIn={isLoggedIn}
170+
setSearchText={setSearchText}
171+
/>
172+
) : (
173+
<div styleName="no-results">You have no access to review page.</div>
174+
)
175+
}
176+
</React.Fragment>
168177
)
169178
: (
170179
<Bucket

src/shared/components/challenge-listing/Sidebar/BucketSelector/index.jsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export default function BucketSelector({
2929
// extraBucket,
3030
// filterState,
3131
isAuth,
32+
isReviewer,
3233
// savedFilters,
3334
selectBucket,
3435
// selectSavedFilter,
@@ -89,7 +90,7 @@ export default function BucketSelector({
8990
{getBucket(BUCKETS.OPEN_FOR_REGISTRATION)}
9091
{/* DISABLED: Until api receive fix community-app#5073 */}
9192
{/* {getBucket(BUCKETS.ONGOING)} */}
92-
{getBucket(BUCKETS.REVIEW_OPPORTUNITIES)}
93+
{isReviewer ? getBucket(BUCKETS.REVIEW_OPPORTUNITIES) : null}
9394
{/* {getBucket(BUCKETS.PAST)} */}
9495
{/* NOTE: We do not show upcoming challenges for now, for various reasons,
9596
* more political than technical ;)
@@ -140,6 +141,7 @@ BucketSelector.defaultProps = {
140141
disabled: false,
141142
// extraBucket: null,
142143
isAuth: false,
144+
isReviewer: false,
143145
expanding: false,
144146
past: false,
145147
};
@@ -156,6 +158,7 @@ BucketSelector.propTypes = {
156158
// extraBucket: PT.string,
157159
// filterState: PT.shape().isRequired,
158160
isAuth: PT.bool,
161+
isReviewer: PT.bool,
159162
// savedFilters: PT.arrayOf(PT.shape()).isRequired,
160163
selectBucket: PT.func.isRequired,
161164
// selectSavedFilter: PT.func.isRequired,

src/shared/components/challenge-listing/Sidebar/index.jsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import React from 'react';
1919
import PT from 'prop-types';
20+
import { isReviewerOrAdmin } from 'utils/challenge-listing/helper';
2021
// import _ from 'lodash';
2122
import { isPastBucket } from 'utils/challenge-listing/buckets';
2223
import ChallengeSearchBar from 'containers/challenge-listing/ChallengeSearchBar';
@@ -42,6 +43,7 @@ export default function SideBarFilters({
4243
// extraBucket,
4344
// filterState,
4445
// hideTcLinksInFooter,
46+
auth,
4547
isAuth,
4648
// resetFilterName,
4749
// savedFilters,
@@ -113,6 +115,7 @@ export default function SideBarFilters({
113115
// extraBucket={extraBucket}
114116
// filterState={filterState}
115117
isAuth={isAuth}
118+
isReviewer={isReviewerOrAdmin(auth)}
116119
// savedFilters={savedFilters}
117120
selectBucket={selectBucket}
118121
// selectSavedFilter={selectSavedFilter}
@@ -155,6 +158,7 @@ SideBarFilters.propTypes = {
155158
// extraBucket: PT.string,
156159
// filterState: PT.shape().isRequired,
157160
// hideTcLinksInFooter: PT.bool,
161+
auth: PT.shape().isRequired,
158162
isAuth: PT.bool,
159163
// resetFilterName: PT.func.isRequired,
160164
// savedFilters: PT.arrayOf(PT.shape()).isRequired,

src/shared/utils/challenge-listing/helper.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import _ from 'lodash';
12
import moment from 'moment';
23

34
/**
@@ -62,3 +63,19 @@ export const formatOrdinals = (n) => {
6263

6364
return ord;
6465
};
66+
67+
/**
68+
* Check if user's role is reviewer or admin
69+
* @param {Object || null} auth
70+
*
71+
* @returns {Boolean}
72+
*/
73+
export const isReviewerOrAdmin = (auth) => {
74+
const roles = _.get(auth, 'user.roles');
75+
76+
if (!roles || !_.isArray(roles)) {
77+
return false;
78+
}
79+
80+
return _.intersection(roles, ['administrator', 'Reviewer']).length;
81+
};

0 commit comments

Comments
 (0)