Skip to content

Commit 258ce62

Browse files
Notification items clickable
topcoder-platform/community-app#4085
1 parent 96d3b99 commit 258ce62

File tree

3 files changed

+62
-20
lines changed

3 files changed

+62
-20
lines changed

dist/dev/index.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/prod/index.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/NotificationsPopup/NotificationList.js

Lines changed: 59 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types'
33
import cn from 'classnames'
44
import _ from 'lodash'
55
import moment from 'moment'
6+
import { Link } from 'topcoder-react-utils'
67
import styles from './styles.module.scss'
78
import BackArrow from '../../assets/images/left-arrow.svg'
89
import GearIcon from '../../assets/images/icon-settings-gear.svg'
@@ -21,27 +22,60 @@ const eventTypes = {
2122
}
2223
}
2324

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>
3972

4073
Item.propTypes = {
4174
item: PropTypes.object.isRequired,
4275
auth: PropTypes.shape().isRequired,
4376
onDismiss: PropTypes.func,
44-
markNotificationAsRead: PropTypes.func.isRequired
77+
markNotificationAsRead: PropTypes.func.isRequired,
78+
isLink: PropTypes.bool.isRequired
4579
}
4680

4781
export default class NotificationList extends React.Component {
@@ -62,6 +96,13 @@ export default class NotificationList extends React.Component {
6296
}))
6397
}
6498

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+
65106
render () {
66107
const { onClose, onSettings, notifications, onDismiss, unReadNotifications,
67108
markNotificationAsRead, markAllNotificationAsRead, auth } = this.props
@@ -139,14 +180,15 @@ export default class NotificationList extends React.Component {
139180
markNotificationAsRead={markNotificationAsRead}
140181
key={`noti-${challengeIdx}-${itemIdx}`}
141182
onDismiss={() => onDismiss([item])}
183+
isLink={this.isLink(item)}
142184
/>))}
143185
</Fragment>
144186
))
145187
}
146188
</Fragment>
147189
</div>
148190
<div className={styles['view-all-notifications']}>
149-
<a href='/notifications'>View all Notifications</a>
191+
<Link to='/notifications'>View all Notifications</Link>
150192
</div>
151193
</>
152194
)

0 commit comments

Comments
 (0)