// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See License.txt for license information. import PostMessageContainer from 'components/post_view/post_message_view'; import UserProfile from './user_profile.jsx'; import FileAttachmentListContainer from 'components/file_attachment_list'; import ProfilePicture from './profile_picture.jsx'; import CommentIcon from 'components/common/comment_icon.jsx'; import DotMenu from 'components/dot_menu'; import PostFlagIcon from 'components/post_view/post_flag_icon.jsx'; import PostBodyAdditionalContent from 'components/post_view/post_body_additional_content.jsx'; import TeamStore from 'stores/team_store.jsx'; import * as GlobalActions from 'actions/global_actions.jsx'; import * as Utils from 'utils/utils.jsx'; import * as PostUtils from 'utils/post_utils.jsx'; import Constants from 'utils/constants.jsx'; import React from 'react'; import PropTypes from 'prop-types'; import {FormattedMessage, FormattedDate} from 'react-intl'; import {browserHistory, Link} from 'react-router/es6'; export default class SearchResultsItem extends React.Component { constructor(props) { super(props); this.handleFocusRHSClick = this.handleFocusRHSClick.bind(this); this.handleJumpClick = this.handleJumpClick.bind(this); this.handleDropdownOpened = this.handleDropdownOpened.bind(this); this.shrinkSidebar = this.shrinkSidebar.bind(this); this.state = { currentTeamDisplayName: TeamStore.getCurrent().name, width: '', height: '', dropdownOpened: false }; } shouldComponentUpdate(nextProps, nextState) { if (!Utils.areObjectsEqual(nextState.post, this.props.post)) { return true; } if (nextProps.isFlagged !== this.props.isFlagged) { return true; } if (nextState.dropdownOpened !== this.state.dropdownOpened) { return true; } return false; } componentDidMount() { window.addEventListener('resize', () => { Utils.updateWindowDimensions(this); }); } componentWillUnmount() { window.removeEventListener('resize', () => { Utils.updateWindowDimensions(this); }); } shrinkSidebar() { setTimeout(() => { this.props.shrink(); }); } handleFocusRHSClick(e) { e.preventDefault(); GlobalActions.emitPostFocusRightHandSideFromSearch(this.props.post, this.props.isMentionSearch); } handleJumpClick() { if (Utils.isMobile()) { GlobalActions.toggleSideBarAction(false); } this.shrinkSidebar(); browserHistory.push(TeamStore.getCurrentTeamRelativeUrl() + '/pl/' + this.props.post.id); } handleDropdownOpened = (isOpened) => { this.setState({ dropdownOpened: isOpened }); } timeTag(post) { return ( ); } renderTimeTag(post) { return Utils.isMobile() ? this.timeTag(post) : ( {this.timeTag(post)} ); } getClassName = () => { let className = 'post post--thread'; if (this.props.compactDisplay) { className += ' post--compact'; } if (this.state.dropdownOpened) { className += ' post--hovered'; } return className; } render() { let channelName = null; const channel = this.props.channel; const user = this.props.user || {}; const post = this.props.post; let idCount = -1; if (this.props.lastPostCount >= 0 && this.props.lastPostCount < Constants.TEST_ID_COUNT) { idCount = this.props.lastPostCount; } if (channel) { channelName = channel.display_name; if (channel.type === 'D') { channelName = ( ); } } let overrideUsername; let disableProfilePopover = false; if (post.props && post.props.from_webhook && post.props.override_username && global.window.mm_config.EnablePostUsernameOverride === 'true') { overrideUsername = post.props.override_username; disableProfilePopover = true; } let botIndicator; if (post.props && post.props.from_webhook) { botIndicator =
{Constants.BOT_NAME}
; } const profilePic = ( ); const profilePicContainer = (
{profilePic}
); let postClass = ''; if (PostUtils.isEdited(this.props.post)) { postClass += ' post--edited'; } let fileAttachment = null; if (post.file_ids && post.file_ids.length > 0) { fileAttachment = ( ); } let message; let flagContent; let rhsControls; if (post.state === Constants.POST_DELETED) { message = (

); } else { flagContent = ( ); rhsControls = (
); const messageWrapper = ( ); message = ( ); } let pinnedBadge; if (post.is_pinned) { pinnedBadge = ( ); } return (

{channelName}
{profilePicContainer}
{botIndicator}
{this.renderTimeTag(post)} {pinnedBadge} {flagContent}
{rhsControls}
{message} {fileAttachment}
); } } SearchResultsItem.propTypes = { post: PropTypes.object, lastPostCount: PropTypes.number, user: PropTypes.object, channel: PropTypes.object, compactDisplay: PropTypes.bool, isMentionSearch: PropTypes.bool, isFlaggedSearch: PropTypes.bool, term: PropTypes.string, useMilitaryTime: PropTypes.bool.isRequired, shrink: PropTypes.func, isFlagged: PropTypes.bool, isBusy: PropTypes.bool, status: PropTypes.string };