diff options
author | Harrison Healey <harrisonmhealey@gmail.com> | 2016-11-30 13:55:49 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-11-30 13:55:49 -0500 |
commit | 165ad0d4f791f8ae2109472d8a626d911fa368e0 (patch) | |
tree | 29001baf676d7d4ef4cd9462e9f2c6766ed6333a /webapp/components/create_post.jsx | |
parent | 2bf0342d130b3a77c5ed02e98e0857f28a5787f0 (diff) | |
download | chat-165ad0d4f791f8ae2109472d8a626d911fa368e0.tar.gz chat-165ad0d4f791f8ae2109472d8a626d911fa368e0.tar.bz2 chat-165ad0d4f791f8ae2109472d8a626d911fa368e0.zip |
PLT-1378 Initial version of emoji reactions (#4520)
* Refactored emoji.json to support multiple aliases and emoji categories
* Added custom category to emoji.jsx and stabilized all fields
* Removed conflicting aliases for :mattermost: and :ca:
* fixup after store changes
* Added emoji reactions
* Removed reactions for an emoji when that emoji is deleted
* Fixed incorrect test case
* Renamed ReactionList to ReactionListView
* Fixed :+1: and :-1: not showing up as possible reactions
* Removed text emoticons from emoji reaction autocomplete
* Changed emoji reactions to be sorted by the order that they were first created
* Set a maximum number of listeners for the ReactionStore
* Removed unused code from Textbox component
* Fixed reaction permissions
* Changed error code when trying to modify reactions for another user
* Fixed merge conflicts
* Properly applied theme colours to reactions
* Fixed ESLint and gofmt errors
* Fixed ReactionListContainer to properly update when its post prop changes
* Removed unnecessary escape characters from reaction regexes
* Shared reaction message pattern between CreatePost and CreateComment
* Removed an unnecessary select query when saving a reaction
* Changed reactions route to be under /reactions
* Fixed copyright dates on newly added files
* Removed debug code that prevented all unit tests from being ran
* Cleaned up unnecessary code for reactions
* Renamed ReactionStore.List to ReactionStore.GetForPost
Diffstat (limited to 'webapp/components/create_post.jsx')
-rw-r--r-- | webapp/components/create_post.jsx | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/webapp/components/create_post.jsx b/webapp/components/create_post.jsx index db61aca41..2ba79af36 100644 --- a/webapp/components/create_post.jsx +++ b/webapp/components/create_post.jsx @@ -9,14 +9,16 @@ import FilePreview from './file_preview.jsx'; import PostDeletedModal from './post_deleted_modal.jsx'; import TutorialTip from './tutorial/tutorial_tip.jsx'; -import AppDispatcher from '../dispatcher/app_dispatcher.jsx'; +import AppDispatcher from 'dispatcher/app_dispatcher.jsx'; import * as GlobalActions from 'actions/global_actions.jsx'; import Client from 'client/web_client.jsx'; import * as Utils from 'utils/utils.jsx'; import * as UserAgent from 'utils/user_agent.jsx'; import * as ChannelActions from 'actions/channel_actions.jsx'; +import * as PostActions from 'actions/post_actions.jsx'; import ChannelStore from 'stores/channel_store.jsx'; +import EmojiStore from 'stores/emoji_store.jsx'; import PostStore from 'stores/post_store.jsx'; import MessageHistoryStore from 'stores/message_history_store.jsx'; import UserStore from 'stores/user_store.jsx'; @@ -34,6 +36,8 @@ const KeyCodes = Constants.KeyCodes; import React from 'react'; +export const REACTION_PATTERN = /^(\+|-):([^:\s]+):\s*$/; + export default class CreatePost extends React.Component { constructor(props) { super(props); @@ -101,6 +105,7 @@ export default class CreatePost extends React.Component { this.setState({submitting: true, serverError: null}); + const isReaction = REACTION_PATTERN.exec(post.message); if (post.message.indexOf('/') === 0) { PostStore.storeDraft(this.state.channelId, null); this.setState({message: '', postError: null, fileInfos: []}); @@ -123,14 +128,18 @@ export default class CreatePost extends React.Component { const state = {}; state.serverError = err.message; state.submitting = false; - this.setState(state); + this.setState({state}); } } ); + } else if (isReaction && EmojiStore.has(isReaction[2])) { + this.sendReaction(isReaction); } else { this.sendMessage(post); } + this.setState({message: '', submitting: false, postError: null, fileInfos: [], serverError: null}); + const fasterThanHumanWillClick = 150; const forceFocus = (Date.now() - this.state.lastBlurAt < fasterThanHumanWillClick); this.focusTextbox(forceFocus); @@ -148,7 +157,6 @@ export default class CreatePost extends React.Component { post.parent_id = this.state.parentId; GlobalActions.emitUserPostedEvent(post); - this.setState({message: '', submitting: false, postError: null, fileInfos: [], serverError: null}); Client.createPost(post, (data) => { @@ -177,6 +185,21 @@ export default class CreatePost extends React.Component { ); } + sendReaction(isReaction) { + const action = isReaction[1]; + + const emojiName = isReaction[2]; + const postId = PostStore.getLatestPost(this.state.channelId).id; + + if (action === '+') { + PostActions.addReaction(this.state.channelId, postId, emojiName); + } else if (action === '-') { + PostActions.removeReaction(this.state.channelId, postId, emojiName); + } + + PostStore.storeCurrentDraft(null); + } + focusTextbox(keepFocus = false) { if (keepFocus || !Utils.isMobile()) { this.refs.textbox.focus(); |