@@ -3,6 +3,7 @@ import PropTypes from 'prop-types'
3
3
import cn from 'classnames'
4
4
import _ from 'lodash'
5
5
import moment from 'moment'
6
+ import { Link } from 'topcoder-react-utils'
6
7
import styles from './styles.module.scss'
7
8
import BackArrow from '../../assets/images/left-arrow.svg'
8
9
import GearIcon from '../../assets/images/icon-settings-gear.svg'
@@ -21,27 +22,60 @@ const eventTypes = {
21
22
}
22
23
}
23
24
24
- const Item = ( { item, auth, onDismiss, markNotificationAsRead } ) =>
25
- < div className = { styles [ 'noti-item' ] } >
26
- < div className = { styles . left } >
27
- < p className = { styles [ 'txt' ] } > { item . contents } </ p >
28
- < span className = { styles [ 'time-txt' ] } > { moment ( item . date ) . fromNow ( ) } </ span >
29
- </ div >
30
- < div className = { styles . right } >
31
- {
32
- ! item . isRead &&
33
- ( < div className = { cn ( [ styles . point , item . isSeen && styles [ 'point-grey' ] , ! item . isSeen && styles [ 'point-red' ] ] ) }
34
- onClick = { ( ) => {
35
- markNotificationAsRead ( item , auth . tokenV3 )
36
- } } /> ) }
37
- </ div >
38
- </ div >
25
+ // Dynamic element, to select between Link and Div
26
+ const ConditionalWrapper = ( {
27
+ condition, renderLink, renderDiv, children
28
+ } ) => (
29
+ condition ? renderLink ( children ) : renderDiv ( children )
30
+ )
31
+
32
+ const Item = ( { item, auth, onDismiss, markNotificationAsRead, isLink } ) =>
33
+ < ConditionalWrapper
34
+ condition = {
35
+ ( eventTypes . PROJECT . ACTIVE . includes ( item . eventType ) ||
36
+ eventTypes . PROJECT . COMPLETED . includes ( item . eventType ) ) &&
37
+ item . sourceId
38
+ }
39
+ renderLink = { children => (
40
+ < Link
41
+ to = { `/challenges/${ item . sourceId } ` }
42
+ className = { styles [ 'noti-item' ] }
43
+ onClick = { ( ) => ! item . isRead && markNotificationAsRead ( item , auth . tokenV3 ) }
44
+ >
45
+ { children }
46
+ </ Link >
47
+ ) }
48
+ renderDiv = { children => (
49
+ < div className = { styles [ 'noti-item' ] } >
50
+ { children }
51
+ </ div >
52
+ ) }
53
+ >
54
+ < Fragment >
55
+ < div className = { styles . left } >
56
+ < p className = { styles [ 'txt' ] } > { item . contents } </ p >
57
+ < span className = { styles [ 'time-txt' ] } > { moment ( item . date ) . fromNow ( ) } </ span >
58
+ </ div >
59
+ < div className = { styles . right } >
60
+ {
61
+ ! item . isRead &&
62
+ ( < div className = { cn ( [ styles . point , item . isSeen && styles [ 'point-grey' ] , ! item . isSeen && styles [ 'point-red' ] ] ) }
63
+ onClick = { ( ) => {
64
+ if ( ! isLink ) {
65
+ markNotificationAsRead ( item , auth . tokenV3 )
66
+ }
67
+ } }
68
+ /> ) }
69
+ </ div >
70
+ </ Fragment >
71
+ </ ConditionalWrapper >
39
72
40
73
Item . propTypes = {
41
74
item : PropTypes . object . isRequired ,
42
75
auth : PropTypes . shape ( ) . isRequired ,
43
76
onDismiss : PropTypes . func ,
44
- markNotificationAsRead : PropTypes . func . isRequired
77
+ markNotificationAsRead : PropTypes . func . isRequired ,
78
+ isLink : PropTypes . bool . isRequired
45
79
}
46
80
47
81
export default class NotificationList extends React . Component {
@@ -62,6 +96,13 @@ export default class NotificationList extends React.Component {
62
96
} ) )
63
97
}
64
98
99
+ isLink ( item ) {
100
+ const ret = ( eventTypes . PROJECT . ACTIVE . includes ( item . eventType ) ||
101
+ eventTypes . PROJECT . COMPLETED . includes ( item . eventType ) ) &&
102
+ item . sourceId
103
+ return ret
104
+ }
105
+
65
106
render ( ) {
66
107
const { onClose, onSettings, notifications, onDismiss, unReadNotifications,
67
108
markNotificationAsRead, markAllNotificationAsRead, auth } = this . props
@@ -139,14 +180,15 @@ export default class NotificationList extends React.Component {
139
180
markNotificationAsRead = { markNotificationAsRead }
140
181
key = { `noti-${ challengeIdx } -${ itemIdx } ` }
141
182
onDismiss = { ( ) => onDismiss ( [ item ] ) }
183
+ isLink = { this . isLink ( item ) }
142
184
/> ) ) }
143
185
</ Fragment >
144
186
) )
145
187
}
146
188
</ Fragment >
147
189
</ div >
148
190
< div className = { styles [ 'view-all-notifications' ] } >
149
- < a href = '/notifications' > View all Notifications</ a >
191
+ < Link to = '/notifications' > View all Notifications</ Link >
150
192
</ div >
151
193
</ >
152
194
)
0 commit comments