import * as cx from 'classnames' import * as React from 'react' import * as moment from 'moment' import ClickOutside from 'react-click-outside' import * as ReactCSSTransitionReplace from 'react-css-transition-replace' import { humanizeDate, humanizeTime, renderEndUserName, renderEndUserShortName, } from '../../../utils/humanize' import { pluralize } from 'humanize-plus' import InlineSVG from 'svg-inline-react' import { APP_URL } from '../../../utils/ResourceConstants' import Avatar from './Avatar' import { Props, State } from './interfaces' import { ActivityType, IPageViewActivity } from '../../../modules/activity/interfaces' import { IActivityGroup, IOpenTrackActivityGroup, IClickTrackActivityGroup, IConversationActivityGroup, } from '../../../modules/activityGroups/interfaces' import './styles.styl' import UnfollowMenu from './UnfollowMenu' const chatIcon = require('!svg-inline-loader?removeTags=true&removeSVGTagAttrs=false!../../../../img/svg/reply.svg') const caretRightIcon = require('!svg-inline-loader?removeTags=true&removeSVGTagAttrs=false!../../../../img/svg/caret-right.svg') const pageView = require('!svg-inline-loader?removeTags=true&removeSVGTagAttrs=false!../../../../img/svg/page-view.svg') const dotsMenu = require('!svg-inline-loader?removeTags=true&removeSVGTagAttrs=false!../../../../img/svg/three-dots-menu.svg') const click = require('!svg-inline-loader?removeTags=true&removeSVGTagAttrs=false!../../../../img/svg/click.svg') const open = require('!svg-inline-loader?removeTags=true&removeSVGTagAttrs=false!../../../../img/svg/open.svg') const messages = require('!svg-inline-loader?removeTags=true&removeSVGTagAttrs=false!../../../../img/svg/messages.svg') class ExpandableActivityGroup extends React.Component { state = { expanded: false, } handleExpand = () => { this.setState({ expanded: !this.state.expanded }) } renderIcon = (type: ActivityType) => { switch (type) { case ActivityType.PAGE_VIEW: return case ActivityType.CLICK: return case ActivityType.OPEN: return case ActivityType.MESSAGE: return } } renderActivityType = (activityGroup: IActivityGroup) => { switch (activityGroup.type) { case ActivityType.PAGE_VIEW: return ( Visit: {activityGroup.total} {pluralize(activityGroup.total, 'Page View')} ) case ActivityType.CLICK: return ( {activityGroup.total} {pluralize(activityGroup.total, 'Click')} ) case ActivityType.OPEN: return ( {activityGroup.total} {pluralize(activityGroup.total, 'Open')} ) case ActivityType.MESSAGE: const inboxId = (activityGroup as IConversationActivityGroup).inboxId const conversationId = (activityGroup as IConversationActivityGroup).conversationId return [
REPLY
, {activityGroup.total} {pluralize(activityGroup.total, 'Message')} , ] } } renderExpanded() { if (!this.state.expanded) { return false } const { activityGroup, profile } = this.props if (activityGroup.type === ActivityType.PAGE_VIEW) { return (
{activityGroup.activity.map((activity: IPageViewActivity) => { return (
Viewed   {activity.event.attributes.title}
) })}
) } if (activityGroup.type === ActivityType.OPEN) { const group = (activityGroup as any) as IOpenTrackActivityGroup return (
Opens on your email:{' '} {group.gmailId ? ( {group.emailSubject || no subject} ) : ( group.emailSubject || no subject )}
{group.activity.map((activity) => { return (
Opened your email
) })}
) } if (activityGroup.type === ActivityType.CLICK) { const group = (activityGroup as any) as IClickTrackActivityGroup return (
Clicks on your email:{' '} {group.gmailId ? ( {group.emailSubject || no subject} ) : ( group.emailSubject || no subject )}
{group.activity.map((activity) => { return (
Clicked{' '} {activity.click.linkText || 'a link'}
) })}
) } if (activityGroup.type === ActivityType.MESSAGE) { const group = (activityGroup as any) as IConversationActivityGroup return (
{group.activity.map((activity) => { return (
{renderEndUserShortName(activityGroup.email, profile, activity)}:  {(activity.message.attributes && activity.message.attributes.preview) || 'No Preview'}
) })}
View Conversation
) } return false } toggleMuteEmail = (e: React.SyntheticEvent) => { this.stopClickBubble(e) const { activityGroup: { email }, actions } = this.props actions.addEmailToMuteList(email) } toggleMuteDomain = (e: React.SyntheticEvent) => { this.stopClickBubble(e) const { activityGroup: { email }, actions } = this.props const domain = email.split('@').pop() actions.addDomainToMuteList(domain) } addHoverClass = (e: any) => { this.removeHoverClass() e.currentTarget.classList.add('active') } removeHoverClass = () => { const hoverTargets = Array.prototype.slice.call( document.getElementsByClassName('activity-group-quickmenu-hover-target'), ) hoverTargets.map((el: HTMLElement) => el.classList.remove('active')) } stopClickBubble = (e: any) => { e.stopPropagation() e.nativeEvent.stopImmediatePropagation() } render() { const { activityGroup, avatarUrl, avatarStatus, profile } = this.props const fullBorder = !activityGroup.firstOfDate && activityGroup.firstOfEmail const semiBorder = !activityGroup.firstOfDate && !activityGroup.firstOfEmail return (
{activityGroup.firstOfDate && (
{humanizeDate(activityGroup.latestActivity)}
)}
{activityGroup.firstOfEmail && ( )}
{renderEndUserName( activityGroup.email, profile, activityGroup.activity && activityGroup.activity[0], )} {this.renderIcon(activityGroup.type)}
{this.renderActivityType(activityGroup)}
{humanizeTime(activityGroup.latestActivity)}
{this.renderExpanded()}
) } } export default ExpandableActivityGroup