| /*! |
| * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
| * or implied. See the License for the specific language governing |
| * permissions and limitations under the License. |
| */ |
| |
| import React from 'react'; |
| import PropTypes from 'prop-types'; |
| import ReactDOM from 'react-dom'; |
| import classnames from 'classnames'; |
| import i18n from 'nfvo-utils/i18n/i18n.js'; |
| import { notificationType } from './UserNotificationsConstants.js'; |
| import ShowMore from 'react-show-more-text'; |
| |
| const Notification = ({ |
| notification, |
| users, |
| onActionClicked, |
| getNotificationTypeDesc |
| }) => { |
| const { eventType, read, eventAttributes, dateTime } = notification; |
| const { |
| itemName, |
| userId, |
| description, |
| versionName, |
| permission, |
| granted |
| } = eventAttributes; |
| const { fullName: userName } = users.find(user => user.userId === userId); |
| return ( |
| <div className={classnames('notification', { unread: !read })}> |
| <div className="notification-data"> |
| <div className="item-name"> |
| {itemName} |
| {versionName && ( |
| <span> v{versionName}</span> |
| )} |
| {!read && <div className="unread-circle-icon" />} |
| </div> |
| <div className="flex-items"> |
| <div className="type"> |
| {getNotificationTypeDesc( |
| eventType, |
| permission, |
| granted |
| )} |
| </div> |
| <div className="separator" /> |
| <div className="user-name">{`${i18n( |
| 'By' |
| )} ${userName}`}</div> |
| </div> |
| {(description || versionName) && ( |
| <div className="description"> |
| {description && ( |
| <ShowMore |
| anchorClass="more-less" |
| lines={2} |
| more={i18n('More')} |
| less={i18n('Less')}> |
| {description} |
| </ShowMore> |
| )} |
| {eventType === notificationType.ITEM_CHANGED.SUBMIT && ( |
| <div> |
| <div> |
| {i18n( |
| 'Version {versionName} was submitted.', |
| { versionName: versionName } |
| )} |
| </div> |
| </div> |
| )} |
| </div> |
| )} |
| <div className="date">{dateTime}</div> |
| </div> |
| <div className="notification-action"> |
| <div |
| className={classnames('action-button', { hidden: read })} |
| onClick={() => onActionClicked(notification)}> |
| {eventType === notificationType.PERMISSION_CHANGED || |
| eventType === notificationType.ITEM_DELETED || |
| eventType === notificationType.ITEM_ARCHIVED || |
| eventType === notificationType.ITEM_RESTORED |
| ? i18n('OK') |
| : i18n('Sync')} |
| </div> |
| </div> |
| </div> |
| ); |
| }; |
| |
| function getNotificationTypeDesc(eventType, permission, granted) { |
| switch (eventType) { |
| case notificationType.PERMISSION_CHANGED: |
| const grantedStr = granted ? i18n('Granted') : i18n('Taken'); |
| return `${i18n('Permission')} ${grantedStr}: ${permission}`; |
| case notificationType.ITEM_CHANGED.COMMIT: |
| return i18n('Your Copy Is Out Of Sync'); |
| case notificationType.ITEM_CHANGED.SUBMIT: |
| return i18n('Version Submitted'); |
| case notificationType.ITEM_DELETED: |
| return i18n('Item was deleted'); |
| case notificationType.ITEM_ARCHIVED: |
| return i18n('Item was archived'); |
| case notificationType.ITEM_RESTORED: |
| return i18n('Item was restored from archive'); |
| } |
| } |
| |
| class UserNotifications extends React.Component { |
| static propTypes = { |
| currentScreen: PropTypes.object, |
| notificationsList: PropTypes.array, |
| usersList: PropTypes.array, |
| lastScanned: PropTypes.string, |
| endOfPage: PropTypes.string, |
| onLoadPrevNotifications: PropTypes.func, |
| onSync: PropTypes.func, |
| updateNotification: PropTypes.func, |
| onLoadItemsLists: PropTypes.func |
| }; |
| |
| render() { |
| const { |
| notificationsList = [], |
| usersList, |
| lastScanned, |
| endOfPage |
| } = this.props; |
| |
| return ( |
| <div className="user-notifications"> |
| <div className="notifications-title"> |
| {i18n('Notifications')} |
| </div> |
| <div |
| className="notifications-list" |
| ref="notificationList" |
| onScroll={() => |
| this.loadPrevNotifications(lastScanned, endOfPage) |
| }> |
| {notificationsList.map(notification => ( |
| <Notification |
| key={notification.eventId} |
| notification={notification} |
| users={usersList} |
| onActionClicked={notification => |
| this.onActionClicked(notification) |
| } |
| getNotificationTypeDesc={getNotificationTypeDesc} |
| /> |
| ))} |
| </div> |
| </div> |
| ); |
| } |
| |
| onActionClicked(notification) { |
| const { |
| onSync, |
| updateNotification, |
| currentScreen, |
| onLoadItemsLists |
| } = this.props; |
| const { |
| eventType, |
| eventAttributes: { itemId, itemName, versionId, versionName } |
| } = notification; |
| if ( |
| eventType !== notificationType.PERMISSION_CHANGED && |
| eventType !== notificationType.ITEM_DELETED && |
| eventType !== notificationType.ITEM_ARCHIVED && |
| eventType !== notificationType.ITEM_RESTORED |
| ) { |
| onSync({ itemId, itemName, versionId, versionName, currentScreen }); |
| } else { |
| onLoadItemsLists(); |
| } |
| updateNotification(notification); |
| } |
| |
| loadPrevNotifications(lastScanned, endOfPage) { |
| if (endOfPage && lastScanned) { |
| let element = ReactDOM.findDOMNode(this.refs['notificationList']); |
| const { onLoadPrevNotifications } = this.props; |
| |
| if ( |
| element && |
| element.clientHeight + element.scrollTop === |
| element.scrollHeight |
| ) { |
| onLoadPrevNotifications(lastScanned, endOfPage); |
| } |
| } |
| } |
| } |
| |
| export default UserNotifications; |