diff options
author | Joram Wilander <jwawilander@gmail.com> | 2017-06-18 14:42:32 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-18 14:42:32 -0400 |
commit | ab67f6e257f6e8f08145a02a7b93550f99641be4 (patch) | |
tree | d33d1c58a3d229f7e37db58bc2c397ac3806c503 /webapp/components/post_view/reaction_list | |
parent | 0231e95f1c5a8c42ba97875f0d2301815f552974 (diff) | |
download | chat-ab67f6e257f6e8f08145a02a7b93550f99641be4.tar.gz chat-ab67f6e257f6e8f08145a02a7b93550f99641be4.tar.bz2 chat-ab67f6e257f6e8f08145a02a7b93550f99641be4.zip |
PLT-6215 Major post list refactor (#6501)
* Major post list refactor
* Fix post and thread deletion
* Fix preferences not selecting correctly
* Fix military time displaying
* Fix UP key for editing posts
* Fix ESLint error
* Various fixes and updates per feedback
* Fix for permalink view
* Revert to old scrolling method and various fixes
* Add floating timestamp, new message indicator, scroll arrows
* Update post loading for focus mode and add visibility limit
* Fix pinning posts and a react warning
* Add loading UI updates from Asaad
* Fix refreshing loop
* Temporarily bump post visibility limit
* Update infinite scrolling
* Remove infinite scrolling
Diffstat (limited to 'webapp/components/post_view/reaction_list')
-rw-r--r-- | webapp/components/post_view/reaction_list/index.js | 33 | ||||
-rw-r--r-- | webapp/components/post_view/reaction_list/reaction_list.jsx | 80 |
2 files changed, 113 insertions, 0 deletions
diff --git a/webapp/components/post_view/reaction_list/index.js b/webapp/components/post_view/reaction_list/index.js new file mode 100644 index 000000000..4fc9355d9 --- /dev/null +++ b/webapp/components/post_view/reaction_list/index.js @@ -0,0 +1,33 @@ +// Copyright (c) 2017 Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +import {connect} from 'react-redux'; +import {bindActionCreators} from 'redux'; +import {makeGetReactionsForPost} from 'mattermost-redux/selectors/entities/posts'; +import {getCustomEmojisAsMap} from 'mattermost-redux/selectors/entities/emojis'; + +import * as Actions from 'mattermost-redux/actions/posts'; + +import ReactionList from './reaction_list.jsx'; + +function makeMapStateToProps() { + const getReactionsForPost = makeGetReactionsForPost(); + + return function mapStateToProps(state, ownProps) { + return { + ...ownProps, + reactions: getReactionsForPost(state, ownProps.post.id), + emojis: getCustomEmojisAsMap(state) + }; + }; +} + +function mapDispatchToProps(dispatch) { + return { + actions: bindActionCreators({ + getReactionsForPost: Actions.getReactionsForPost + }, dispatch) + }; +} + +export default connect(makeMapStateToProps, mapDispatchToProps)(ReactionList); diff --git a/webapp/components/post_view/reaction_list/reaction_list.jsx b/webapp/components/post_view/reaction_list/reaction_list.jsx new file mode 100644 index 000000000..516f5332f --- /dev/null +++ b/webapp/components/post_view/reaction_list/reaction_list.jsx @@ -0,0 +1,80 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +import React from 'react'; +import PropTypes from 'prop-types'; + +import Reaction from 'components/post_view/reaction'; + +export default class ReactionListView extends React.PureComponent { + static propTypes = { + + /** + * The post to render reactions for + */ + post: PropTypes.object.isRequired, + + /** + * The reactions to render + */ + reactions: PropTypes.arrayOf(PropTypes.object), + + /** + * The emojis for the different reactions + */ + emojis: PropTypes.object.isRequired, + actions: PropTypes.shape({ + + /** + * Function to get reactions for a post + */ + getReactionsForPost: PropTypes.func.isRequired + }) + } + + componentDidMount() { + if (this.props.post.has_reactions) { + this.props.actions.getReactionsForPost(this.props.post.id); + } + } + + render() { + if (!this.props.post.has_reactions || (this.props.reactions && this.props.reactions.length === 0)) { + return null; + } + + const reactionsByName = new Map(); + const emojiNames = []; + + if (this.props.reactions) { + for (const reaction of this.props.reactions) { + const emojiName = reaction.emoji_name; + + if (reactionsByName.has(emojiName)) { + reactionsByName.get(emojiName).push(reaction); + } else { + emojiNames.push(emojiName); + reactionsByName.set(emojiName, [reaction]); + } + } + } + + const children = emojiNames.map((emojiName) => { + return ( + <Reaction + key={emojiName} + post={this.props.post} + emojiName={emojiName} + reactions={reactionsByName.get(emojiName) || []} + emojis={this.props.emojis} + /> + ); + }); + + return ( + <div className='post-reaction-list'> + {children} + </div> + ); + } +} |