diff options
Diffstat (limited to 'web/react/components/search_results_item.jsx')
-rw-r--r-- | web/react/components/search_results_item.jsx | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/web/react/components/search_results_item.jsx b/web/react/components/search_results_item.jsx new file mode 100644 index 000000000..aa56f1174 --- /dev/null +++ b/web/react/components/search_results_item.jsx @@ -0,0 +1,105 @@ +// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// See License.txt for license information. + +var PostStore = require('../stores/post_store.jsx'); +var ChannelStore = require('../stores/channel_store.jsx'); +var UserStore = require('../stores/user_store.jsx'); +var UserProfile = require('./user_profile.jsx'); +var utils = require('../utils/utils.jsx'); +var client = require('../utils/client.jsx'); +var AsyncClient = require('../utils/async_client.jsx'); +var AppDispatcher = require('../dispatcher/app_dispatcher.jsx'); +var Constants = require('../utils/constants.jsx'); +var ActionTypes = Constants.ActionTypes; + +export default class SearchResultsItem extends React.Component { + constructor(props) { + super(props); + + this.handleClick = this.handleClick.bind(this); + } + + handleClick(e) { + e.preventDefault(); + + var self = this; + + client.getPost( + this.props.post.channel_id, + this.props.post.id, + function success(data) { + AppDispatcher.handleServerAction({ + type: ActionTypes.RECIEVED_POST_SELECTED, + post_list: data, + from_search: PostStore.getSearchTerm() + }); + + AppDispatcher.handleServerAction({ + type: ActionTypes.RECIEVED_SEARCH, + results: null, + is_mention_search: self.props.isMentionSearch + }); + }, + function success(err) { + AsyncClient.dispatchError(err, 'getPost'); + } + ); + + var postChannel = ChannelStore.get(this.props.post.channel_id); + var teammate = ''; + + if (postChannel.type === 'D') { + teammate = utils.getDirectTeammate(this.props.post.channel_id).username; + } + + utils.switchChannel(postChannel, teammate); + } + + render() { + var message = utils.textToJsx(this.props.post.message, {searchTerm: this.props.term, noMentionHighlight: !this.props.isMentionSearch}); + var channelName = ''; + var channel = ChannelStore.get(this.props.post.channel_id); + var timestamp = UserStore.getCurrentUser().update_at; + + if (channel) { + channelName = channel.display_name; + if (channel.type === 'D') { + channelName = 'Private Message'; + } + } + + return ( + <div + className='search-item-container post' + onClick={this.handleClick} + > + <div className='search-channel__name'>{channelName}</div> + <div className='post-profile-img__container'> + <img + className='post-profile-img' + src={'/api/v1/users/' + this.props.post.user_id + '/image?time=' + timestamp} + height='36' + width='36' + /> + </div> + <div className='post__content'> + <ul className='post-header'> + <li className='post-header-col'><strong><UserProfile userId={this.props.post.user_id} /></strong></li> + <li className='post-header-col'> + <time className='search-item-time'> + {utils.displayDate(this.props.post.create_at) + ' ' + utils.displayTime(this.props.post.create_at)} + </time> + </li> + </ul> + <div className='search-item-snippet'><span>{message}</span></div> + </div> + </div> + ); + } +} + +SearchResultsItem.propTypes = { + post: React.PropTypes.object, + isMentionSearch: React.PropTypes.bool, + term: React.PropTypes.string +};
\ No newline at end of file |