import React from 'react'; import { bindActionCreators } from 'redux'; import { gql, compose } from 'react-apollo'; import { openMenu, closeMenu } from '../actions'; import { can } from 'plugin-api/beta/client/services'; import { getShallowChanges } from 'plugin-api/beta/client/utils'; import ModerationActions from '../components/ModerationActions'; import { connect, excludeIf, withFragments } from 'plugin-api/beta/client/hocs'; class ModerationActionsContainer extends React.Component { shouldComponentUpdate(nextProps) { // Specifically handle `showMenuForComment` if it is the only change. const changes = getShallowChanges(this.props, nextProps); if (changes.length === 1 && changes[0] === 'showMenuForComment') { const commentId = this.props.comment.id; if ( commentId !== this.props.showMenuForComment && commentId !== nextProps.showMenuForComment ) { return false; } } // Prevent Slot from rerendering when no props has shallowly changed. return changes.length !== 0; } toogleMenu = () => { if (this.props.showMenuForComment === this.props.comment.id) { this.props.closeMenu(); } else { this.props.openMenu(this.props.comment.id); } }; hideMenu = () => { if (this.props.showMenuForComment === this.props.comment.id) { this.props.closeMenu(); } }; render() { return ( ); } } const mapStateToProps = ({ auth, talkPluginModerationActions: state }) => ({ user: auth.user, showMenuForComment: state.showMenuForComment, }); const mapDispatchToProps = dispatch => bindActionCreators( { openMenu, closeMenu, }, dispatch ); const enhance = compose( connect(mapStateToProps, mapDispatchToProps), withFragments({ root: gql` fragment TalkModerationActions_root on RootQuery { me { id } } `, asset: gql` fragment TalkModerationActions_asset on Asset { id } `, comment: gql` fragment TalkModerationActions_comment on Comment { id status user { id } tags { tag { name } } } `, }), excludeIf(props => !can(props.user, 'MODERATE_COMMENTS')) ); export default enhance(ModerationActionsContainer);