1- import React , { useEffect , useState } from 'react' ;
1+ import React , { useEffect , useState , useMemo } from 'react' ;
22import { BUCKETS , isPastBucket } from 'utils/challenge-listing/buckets' ;
33import cn from 'classnames' ;
44import { useMediaQuery } from 'react-responsive' ;
55import ArrowIcon from 'assets/images/ico-arrow-down.svg' ;
6+ import { config } from 'topcoder-react-utils' ;
67import PT from 'prop-types' ;
78
89import './style.scss' ;
10+ import { getUpdateQuery } from 'utils/url' ;
911
1012const ChallengeTab = ( {
1113 activeBucket,
@@ -14,41 +16,75 @@ const ChallengeTab = ({
1416 previousBucketOfPastChallengesTab,
1517 previousBucketOfActiveTab,
1618 selectBucket,
19+ location,
20+ history,
1721} ) => {
1822 const past = isPastBucket ( activeBucket ) ;
1923 const [ currentSelected , setCurrentSelected ] = useState ( past ) ;
2024 const [ isTabClosed , setIsTabClosed ] = useState ( true ) ;
25+ const currentTabName = useMemo ( ( ) => {
26+ if ( location . pathname && location . pathname . indexOf ( config . GIGS_PAGES_PATH ) >= 0 ) {
27+ return 'GIGS' ;
28+ }
29+ return currentSelected ? 'PAST CHALLENGES' : 'ACTIVE CHALLENGES' ;
30+ } , [ location , currentSelected ] ) ;
31+ const pageTitle = useMemo ( ( ) => {
32+ if ( location . pathname && location . pathname . indexOf ( config . GIGS_PAGES_PATH ) >= 0 ) {
33+ return 'GIG WORK OPPORTUNITIES' ;
34+ }
35+ return 'CHALLENGES' ;
36+ } , [ location ] ) ;
2137
2238 useEffect ( ( ) => {
2339 setCurrentSelected ( isPastBucket ( activeBucket ) ) ;
2440 } , [ activeBucket ] ) ;
2541
42+ const moveToChallengesPage = ( selectedBucket ) => {
43+ if ( currentTabName === 'GIGS' ) {
44+ const queryParams = getUpdateQuery ( { bucket : selectedBucket } ) ;
45+ history . push ( `/challenges${ queryParams || '' } ` ) ;
46+ }
47+ } ;
48+
2649 const onActiveClick = ( ) => {
27- if ( ! past ) {
50+ if ( ! past && currentTabName !== 'GIGS' ) {
2851 return ;
2952 }
3053 setPreviousBucketOfPastChallengesTab ( activeBucket ) ;
3154 setCurrentSelected ( 0 ) ;
3255 setIsTabClosed ( true ) ;
56+ let selectedBucket = '' ;
3357 if ( previousBucketOfActiveTab ) {
34- selectBucket ( previousBucketOfActiveTab ) ;
58+ selectedBucket = previousBucketOfActiveTab ;
3559 } else {
36- selectBucket ( BUCKETS . OPEN_FOR_REGISTRATION ) ;
60+ selectedBucket = BUCKETS . OPEN_FOR_REGISTRATION ;
3761 }
62+ moveToChallengesPage ( selectedBucket ) ;
63+ selectBucket ( selectedBucket ) ;
3864 } ;
3965
4066 const onPastChallengesClick = ( ) => {
41- if ( past ) {
67+ if ( past && currentTabName !== 'GIGS' ) {
4268 return ;
4369 }
4470 setPreviousBucketOfActiveTab ( activeBucket ) ;
4571 setCurrentSelected ( 1 ) ;
4672 setIsTabClosed ( true ) ;
73+ let selectedBucket = '' ;
4774 if ( previousBucketOfPastChallengesTab ) {
48- selectBucket ( previousBucketOfPastChallengesTab ) ;
75+ selectedBucket = previousBucketOfPastChallengesTab ;
4976 } else {
50- selectBucket ( BUCKETS . ALL_PAST ) ;
77+ selectedBucket = BUCKETS . ALL_PAST ;
5178 }
79+ moveToChallengesPage ( selectedBucket ) ;
80+ selectBucket ( selectedBucket ) ;
81+ } ;
82+
83+ const onGigsClick = ( ) => {
84+ if ( typeof window === 'undefined' ) {
85+ return ;
86+ }
87+ history . push ( config . GIGS_PAGES_PATH ) ;
5288 } ;
5389
5490 const desktop = useMediaQuery ( { minWidth : 1024 } ) ;
@@ -57,7 +93,7 @@ const ChallengeTab = ({
5793 < ul styleName = "challenge-tab" >
5894 < li
5995 key = "tab-item-active"
60- styleName = { cn ( 'item' , { active : ! currentSelected } ) }
96+ styleName = { cn ( 'item' , { active : currentTabName === 'ACTIVE CHALLENGES' } ) }
6197 onClick = { onActiveClick }
6298 onKeyDown = { ( e ) => {
6399 if ( e . key !== 'Enter' ) {
@@ -71,7 +107,7 @@ const ChallengeTab = ({
71107 </ li >
72108 < li
73109 key = "tab-item-past"
74- styleName = { cn ( 'item' , { active : currentSelected } ) }
110+ styleName = { cn ( 'item' , { active : currentTabName === 'PAST CHALLENGES' } ) }
75111 onClick = { onPastChallengesClick }
76112 onKeyDown = { ( e ) => {
77113 if ( e . key !== 'Enter' ) {
@@ -83,6 +119,20 @@ const ChallengeTab = ({
83119 >
84120 PAST CHALLENGES
85121 </ li >
122+ < li
123+ key = "tab-item-gigs"
124+ styleName = { cn ( 'item' , { active : currentTabName === 'GIGS' } ) }
125+ onClick = { onGigsClick }
126+ onKeyDown = { ( e ) => {
127+ if ( e . key !== 'Enter' ) {
128+ return ;
129+ }
130+ onGigsClick ( ) ;
131+ } }
132+ role = "presentation"
133+ >
134+ GIGS
135+ </ li >
86136 </ ul >
87137 ) ;
88138
@@ -93,7 +143,7 @@ const ChallengeTab = ({
93143 role = "presentation"
94144 onClick = { ( ) => setIsTabClosed ( ! isTabClosed ) }
95145 >
96- < p styleName = "title" > { currentSelected ? 'PAST CHALLENGES' : 'ACTIVE CHALLENGES' } </ p >
146+ < p styleName = "title" > { currentTabName } </ p >
97147 < div
98148 role = "presentation"
99149 styleName = { cn ( 'icon' , { down : ! isTabClosed } ) }
@@ -108,39 +158,59 @@ const ChallengeTab = ({
108158 < div
109159 role = "presentation"
110160 onClick = { onActiveClick }
111- styleName = { cn ( 'item' , { active : ! currentSelected } ) }
161+ styleName = { cn ( 'item' , { active : currentTabName === 'ACTIVE CHALLENGES' } ) }
112162 >
113163 < p > ACTIVE CHALLENGES</ p >
114164 </ div >
115165 < div
116166 role = "presentation"
117- styleName = { cn ( 'item' , { active : currentSelected } ) }
167+ styleName = { cn ( 'item' , { active : currentTabName === 'PAST CHALLENGES' } ) }
118168 onClick = { onPastChallengesClick }
119169 >
120170 < p > PAST CHALLENGES</ p >
121171 </ div >
172+ < div
173+ role = "presentation"
174+ styleName = { cn ( 'item' , { active : currentTabName === 'GIGS' } ) }
175+ onClick = { onGigsClick }
176+ >
177+ < p > GIGS</ p >
178+ </ div >
122179 </ div >
123180 )
124181 }
125182 </ React . Fragment >
126183 ) ;
127184
128- return desktop ? desktopTab : mobileTab ;
185+ return (
186+ < React . Fragment >
187+ < h1 styleName = "tc-title" > { pageTitle } </ h1 >
188+ < hr styleName = "tc-seperator" />
189+ { desktop ? desktopTab : mobileTab }
190+ </ React . Fragment >
191+ ) ;
129192} ;
130193
131194ChallengeTab . defaultProps = {
195+ activeBucket : null ,
196+ selectBucket : ( ) => { } ,
132197 setPreviousBucketOfActiveTab : ( ) => { } ,
133198 setPreviousBucketOfPastChallengesTab : ( ) => { } ,
134199 previousBucketOfActiveTab : null ,
135200 previousBucketOfPastChallengesTab : null ,
136201} ;
137202
138203ChallengeTab . propTypes = {
139- activeBucket : PT . string . isRequired ,
204+ location : PT . shape ( {
205+ search : PT . string ,
206+ pathname : PT . string ,
207+ } ) . isRequired ,
208+ history : PT . shape ( ) . isRequired ,
209+ activeBucket : PT . string ,
140210 setPreviousBucketOfActiveTab : PT . func ,
141211 setPreviousBucketOfPastChallengesTab : PT . func ,
142212 previousBucketOfActiveTab : PT . string ,
143- selectBucket : PT . func . isRequired ,
213+ selectBucket : PT . func ,
144214 previousBucketOfPastChallengesTab : PT . string ,
145215} ;
146216
0 commit comments