From c3d095b465ed87c086409992ef78b62a06c09909 Mon Sep 17 00:00:00 2001 From: bonespiked Date: Sat, 1 Apr 2017 17:00:30 -0400 Subject: Add reaction picker (#5904) --- webapp/components/rhs_root_post.jsx | 73 +++++++++++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 4 deletions(-) (limited to 'webapp/components/rhs_root_post.jsx') diff --git a/webapp/components/rhs_root_post.jsx b/webapp/components/rhs_root_post.jsx index f07826d63..b298853d8 100644 --- a/webapp/components/rhs_root_post.jsx +++ b/webapp/components/rhs_root_post.jsx @@ -14,14 +14,17 @@ import UserStore from 'stores/user_store.jsx'; import TeamStore from 'stores/team_store.jsx'; import * as GlobalActions from 'actions/global_actions.jsx'; -import {flagPost, unflagPost, pinPost, unpinPost} from 'actions/post_actions.jsx'; +import {flagPost, unflagPost, pinPost, unpinPost, addReaction} from 'actions/post_actions.jsx'; import * as Utils from 'utils/utils.jsx'; import * as PostUtils from 'utils/post_utils.jsx'; +import EmojiPicker from 'components/emoji_picker/emoji_picker.jsx'; +import ReactDOM from 'react-dom'; + import Constants from 'utils/constants.jsx'; import DelayedAction from 'utils/delayed_action.jsx'; -import {Tooltip, OverlayTrigger} from 'react-bootstrap'; +import {Tooltip, OverlayTrigger, Overlay} from 'react-bootstrap'; import {FormattedMessage} from 'react-intl'; @@ -37,6 +40,8 @@ export default class RhsRootPost extends React.Component { this.unflagPost = this.unflagPost.bind(this); this.pinPost = this.pinPost.bind(this); this.unpinPost = this.unpinPost.bind(this); + this.reactEmojiClick = this.reactEmojiClick.bind(this); + this.emojiPickerClick = this.emojiPickerClick.bind(this); this.canEdit = false; this.canDelete = false; @@ -45,7 +50,9 @@ export default class RhsRootPost extends React.Component { this.state = { currentTeamDisplayName: TeamStore.getCurrent().name, width: '', - height: '' + height: '', + showRHSEmojiPicker: false, + testStateObj: true }; } @@ -70,7 +77,7 @@ export default class RhsRootPost extends React.Component { this.canEdit = false; } - shouldComponentUpdate(nextProps) { + shouldComponentUpdate(nextProps, nextState) { if (nextProps.status !== this.props.status) { return true; } @@ -107,6 +114,10 @@ export default class RhsRootPost extends React.Component { return true; } + if (this.state.showRHSEmojiPicker !== nextState.showRHSEmojiPicker) { + return true; + } + return false; } @@ -155,13 +166,30 @@ export default class RhsRootPost extends React.Component { unpinPost(this.props.post.channel_id, this.props.post.id); } + emojiPickerClick() { + this.setState({showRHSEmojiPicker: !this.state.showRHSEmojiPicker}); + } + + reactEmojiClick(emoji) { + const emojiName = emoji.name || emoji.aliases[0]; + addReaction(this.props.post.channel_id, this.props.post.id, emojiName); + this.setState({showRHSEmojiPicker: false}); + } + render() { const post = this.props.post; const user = this.props.user; const mattermostLogo = Constants.MATTERMOST_ICON_SVG; var timestamp = user ? user.last_picture_update : 0; var channel = ChannelStore.get(post.channel_id); + let canReact = false; const flagIcon = Constants.FLAG_ICON_SVG; + if (post.state !== Constants.POST_FAILED && + post.state !== Constants.POST_LOADING && + !Utils.isPostEphemeral(post) && + Utils.isFeatureEnabled(Constants.PRE_RELEASE_FEATURES.EMOJI_PICKER_PREVIEW)) { + canReact = true; + } this.canDelete = PostUtils.canDeletePost(post); this.canEdit = PostUtils.canEditPost(post, this.editDisableAction); @@ -195,6 +223,41 @@ export default class RhsRootPost extends React.Component { } } + let react; + let reactOverlay; + + if (canReact) { + react = ( + + + + + + ); + reactOverlay = ( + this.setState({showRHSEmojiPicker: false})} + target={() => ReactDOM.findDOMNode(this.refs.rhs_root_reacticon)} + + > + + + ); + } + var dropdownContents = []; if (Utils.isMobile()) { @@ -547,7 +610,9 @@ export default class RhsRootPost extends React.Component {
  • + {reactOverlay} {rootOptions} + {react}
  • -- cgit v1.2.3-1-g7c22