/** * @flow * @file AppActivity component */ import * as React from 'react'; import classNames from 'classnames'; import getProp from 'lodash/get'; import noop from 'lodash/noop'; import TetherComponent from 'react-tether'; import { FormattedMessage, injectIntl } from 'react-intl'; import ActivityCard from '../ActivityCard'; import ActivityTimestamp from '../common/activity-timestamp'; import DeleteConfirmation from '../common/delete-confirmation'; import IconTrash from '../../../../icons/general/IconTrash'; import Media from '../../../../components/media'; import messages from './messages'; import { bdlGray80 } from '../../../../styles/variables'; import { Link } from '../../../../components/link'; import { MenuItem } from '../../../../components/menu'; import type { AppItem, ActivityTemplateItem, ActionItemError } from '../../../../common/types/feed'; import type { User, BoxItemPermission } from '../../../../common/types/core'; import './AppActivity.scss'; type Props = { activity_template: ActivityTemplateItem, app: AppItem, created_at: string, created_by: User, currentUser?: User, error?: ActionItemError, id: string, intl: any, isPending?: boolean, onDelete: ({ id: string, permissions?: {} }) => void, permissions?: BoxItemPermission, rendered_text: string, }; type State = { isConfirmingDelete: boolean, }; function mapActivityNodes(node: HTMLLinkElement): React.Node { const { dataset = {}, href = '#', tagName, textContent } = node; switch (tagName) { case 'A': return ( {textContent} ); default: return textContent; } } class AppActivity extends React.PureComponent { static defaultProps = { onDelete: noop, permissions: {}, }; parser = new DOMParser(); state: State = { isConfirmingDelete: false, }; handleDeleteCancel = (): void => { this.setState({ isConfirmingDelete: false }); }; handleDeleteClick = () => { this.setState({ isConfirmingDelete: true }); }; handleDeleteConfirm = (): void => { const { id, onDelete, permissions } = this.props; onDelete({ id, permissions }); }; parseActivity = (): Array => { const { rendered_text: renderedText } = this.props; const doc: Document = this.parser.parseFromString(renderedText, 'text/html'); if (!doc) { return []; } const childNodes = getProp(doc, 'body.childNodes', []); return Array.from(childNodes); }; render() { const { activity_template: { id: templateId }, app: { name, icon_url }, created_at: createdAt, created_by: createdBy, currentUser, error, intl, isPending, permissions, } = this.props; const canDelete = getProp(permissions, 'can_delete', false) || (currentUser && currentUser.id === createdBy.id); const createdAtTimestamp = new Date(createdAt).getTime(); const isMenuVisible = canDelete && !isPending; const { isConfirmingDelete } = this.state; return ( {intl.formatMessage(messages.appActivityAltIcon, {isMenuVisible && ( {isConfirmingDelete && ( )} )}
{name}
{this.parseActivity().map(mapActivityNodes)}
); } } export default injectIntl(AppActivity);