Merge pull request #285 from chriswmartin/detailed-status-actions
Add mute, block, conversation mute actions to detailed status dropdown
This commit is contained in:
		
						commit
						e6ab869d95
					
				
					 2 changed files with 55 additions and 2 deletions
				
			
		| 
						 | 
					@ -13,6 +13,10 @@ const messages = defineMessages({
 | 
				
			||||||
  reblog: { id: 'status.reblog', defaultMessage: 'Boost' },
 | 
					  reblog: { id: 'status.reblog', defaultMessage: 'Boost' },
 | 
				
			||||||
  cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },
 | 
					  cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },
 | 
				
			||||||
  favourite: { id: 'status.favourite', defaultMessage: 'Favourite' },
 | 
					  favourite: { id: 'status.favourite', defaultMessage: 'Favourite' },
 | 
				
			||||||
 | 
					  mute: { id: 'status.mute', defaultMessage: 'Mute @{name}' },
 | 
				
			||||||
 | 
					  muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' },
 | 
				
			||||||
 | 
					  unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' },
 | 
				
			||||||
 | 
					  block: { id: 'status.block', defaultMessage: 'Block @{name}' },
 | 
				
			||||||
  report: { id: 'status.report', defaultMessage: 'Report @{name}' },
 | 
					  report: { id: 'status.report', defaultMessage: 'Report @{name}' },
 | 
				
			||||||
  share: { id: 'status.share', defaultMessage: 'Share' },
 | 
					  share: { id: 'status.share', defaultMessage: 'Share' },
 | 
				
			||||||
  pin: { id: 'status.pin', defaultMessage: 'Pin on profile' },
 | 
					  pin: { id: 'status.pin', defaultMessage: 'Pin on profile' },
 | 
				
			||||||
| 
						 | 
					@ -32,6 +36,9 @@ export default class ActionBar extends React.PureComponent {
 | 
				
			||||||
    onReply: PropTypes.func.isRequired,
 | 
					    onReply: PropTypes.func.isRequired,
 | 
				
			||||||
    onReblog: PropTypes.func.isRequired,
 | 
					    onReblog: PropTypes.func.isRequired,
 | 
				
			||||||
    onFavourite: PropTypes.func.isRequired,
 | 
					    onFavourite: PropTypes.func.isRequired,
 | 
				
			||||||
 | 
					    onMute: PropTypes.func,
 | 
				
			||||||
 | 
					    onMuteConversation: PropTypes.func,
 | 
				
			||||||
 | 
					    onBlock: PropTypes.func,
 | 
				
			||||||
    onDelete: PropTypes.func.isRequired,
 | 
					    onDelete: PropTypes.func.isRequired,
 | 
				
			||||||
    onMention: PropTypes.func.isRequired,
 | 
					    onMention: PropTypes.func.isRequired,
 | 
				
			||||||
    onReport: PropTypes.func,
 | 
					    onReport: PropTypes.func,
 | 
				
			||||||
| 
						 | 
					@ -60,6 +67,18 @@ export default class ActionBar extends React.PureComponent {
 | 
				
			||||||
    this.props.onMention(this.props.status.get('account'), this.context.router.history);
 | 
					    this.props.onMention(this.props.status.get('account'), this.context.router.history);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  handleMuteClick = () => {
 | 
				
			||||||
 | 
					    this.props.onMute(this.props.status.get('account'));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  handleConversationMuteClick = () => {
 | 
				
			||||||
 | 
					    this.props.onMuteConversation(this.props.status);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  handleBlockClick = () => {
 | 
				
			||||||
 | 
					    this.props.onBlock(this.props.status.get('account'));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  handleReport = () => {
 | 
					  handleReport = () => {
 | 
				
			||||||
    this.props.onReport(this.props.status);
 | 
					    this.props.onReport(this.props.status);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -83,6 +102,7 @@ export default class ActionBar extends React.PureComponent {
 | 
				
			||||||
    const { status, intl } = this.props;
 | 
					    const { status, intl } = this.props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const publicStatus = ['public', 'unlisted'].includes(status.get('visibility'));
 | 
					    const publicStatus = ['public', 'unlisted'].includes(status.get('visibility'));
 | 
				
			||||||
 | 
					    const mutingConversation = status.get('muted');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let menu = [];
 | 
					    let menu = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -95,10 +115,15 @@ export default class ActionBar extends React.PureComponent {
 | 
				
			||||||
        menu.push({ text: intl.formatMessage(status.get('pinned') ? messages.unpin : messages.pin), action: this.handlePinClick });
 | 
					        menu.push({ text: intl.formatMessage(status.get('pinned') ? messages.unpin : messages.pin), action: this.handlePinClick });
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      menu.push(null);
 | 
				
			||||||
 | 
					      menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMuteClick });
 | 
				
			||||||
 | 
					      menu.push(null);
 | 
				
			||||||
      menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick });
 | 
					      menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick });
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick });
 | 
					      menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick });
 | 
				
			||||||
      menu.push(null);
 | 
					      menu.push(null);
 | 
				
			||||||
 | 
					      menu.push({ text: intl.formatMessage(messages.mute, { name: status.getIn(['account', 'username']) }), action: this.handleMuteClick });
 | 
				
			||||||
 | 
					      menu.push({ text: intl.formatMessage(messages.block, { name: status.getIn(['account', 'username']) }), action: this.handleBlockClick });
 | 
				
			||||||
      menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport });
 | 
					      menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,14 +20,16 @@ import {
 | 
				
			||||||
  replyCompose,
 | 
					  replyCompose,
 | 
				
			||||||
  mentionCompose,
 | 
					  mentionCompose,
 | 
				
			||||||
} from 'flavours/glitch/actions/compose';
 | 
					} from 'flavours/glitch/actions/compose';
 | 
				
			||||||
import { deleteStatus } from 'flavours/glitch/actions/statuses';
 | 
					import { blockAccount } from 'flavours/glitch/actions/accounts';
 | 
				
			||||||
 | 
					import { muteStatus, unmuteStatus, deleteStatus } from 'flavours/glitch/actions/statuses';
 | 
				
			||||||
 | 
					import { initMuteModal } from 'flavours/glitch/actions/mutes';
 | 
				
			||||||
import { initReport } from 'flavours/glitch/actions/reports';
 | 
					import { initReport } from 'flavours/glitch/actions/reports';
 | 
				
			||||||
import { makeGetStatus } from 'flavours/glitch/selectors';
 | 
					import { makeGetStatus } from 'flavours/glitch/selectors';
 | 
				
			||||||
import { ScrollContainer } from 'react-router-scroll-4';
 | 
					import { ScrollContainer } from 'react-router-scroll-4';
 | 
				
			||||||
import ColumnBackButton from 'flavours/glitch/components/column_back_button';
 | 
					import ColumnBackButton from 'flavours/glitch/components/column_back_button';
 | 
				
			||||||
import StatusContainer from 'flavours/glitch/containers/status_container';
 | 
					import StatusContainer from 'flavours/glitch/containers/status_container';
 | 
				
			||||||
import { openModal } from 'flavours/glitch/actions/modal';
 | 
					import { openModal } from 'flavours/glitch/actions/modal';
 | 
				
			||||||
import { defineMessages, injectIntl } from 'react-intl';
 | 
					import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 | 
				
			||||||
import ImmutablePureComponent from 'react-immutable-pure-component';
 | 
					import ImmutablePureComponent from 'react-immutable-pure-component';
 | 
				
			||||||
import { HotKeys } from 'react-hotkeys';
 | 
					import { HotKeys } from 'react-hotkeys';
 | 
				
			||||||
import { boostModal, favouriteModal, deleteModal } from 'flavours/glitch/util/initial_state';
 | 
					import { boostModal, favouriteModal, deleteModal } from 'flavours/glitch/util/initial_state';
 | 
				
			||||||
| 
						 | 
					@ -36,6 +38,7 @@ import { attachFullscreenListener, detachFullscreenListener, isFullscreen } from
 | 
				
			||||||
const messages = defineMessages({
 | 
					const messages = defineMessages({
 | 
				
			||||||
  deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },
 | 
					  deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },
 | 
				
			||||||
  deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' },
 | 
					  deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' },
 | 
				
			||||||
 | 
					  blockConfirm: { id: 'confirmations.block.confirm', defaultMessage: 'Block' },
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const makeMapStateToProps = () => {
 | 
					const makeMapStateToProps = () => {
 | 
				
			||||||
| 
						 | 
					@ -165,6 +168,28 @@ export default class Status extends ImmutablePureComponent {
 | 
				
			||||||
    this.props.dispatch(openModal('VIDEO', { media, time }));
 | 
					    this.props.dispatch(openModal('VIDEO', { media, time }));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  handleMuteClick = (account) => {
 | 
				
			||||||
 | 
					    this.props.dispatch(initMuteModal(account));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  handleConversationMuteClick = (status) => {
 | 
				
			||||||
 | 
					    if (status.get('muted')) {
 | 
				
			||||||
 | 
					      this.props.dispatch(unmuteStatus(status.get('id')));
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      this.props.dispatch(muteStatus(status.get('id')));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  handleBlockClick = (account) => {
 | 
				
			||||||
 | 
					    const { dispatch, intl } = this.props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dispatch(openModal('CONFIRM', {
 | 
				
			||||||
 | 
					      message: <FormattedMessage id='confirmations.block.message' defaultMessage='Are you sure you want to block {name}?' values={{ name: <strong>@{account.get('acct')}</strong> }} />,
 | 
				
			||||||
 | 
					      confirm: intl.formatMessage(messages.blockConfirm),
 | 
				
			||||||
 | 
					      onConfirm: () => dispatch(blockAccount(account.get('id'))),
 | 
				
			||||||
 | 
					    }));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  handleReport = (status) => {
 | 
					  handleReport = (status) => {
 | 
				
			||||||
    this.props.dispatch(initReport(status.get('account'), status));
 | 
					    this.props.dispatch(initReport(status.get('account'), status));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -349,6 +374,9 @@ export default class Status extends ImmutablePureComponent {
 | 
				
			||||||
                  onReblog={this.handleReblogClick}
 | 
					                  onReblog={this.handleReblogClick}
 | 
				
			||||||
                  onDelete={this.handleDeleteClick}
 | 
					                  onDelete={this.handleDeleteClick}
 | 
				
			||||||
                  onMention={this.handleMentionClick}
 | 
					                  onMention={this.handleMentionClick}
 | 
				
			||||||
 | 
					                  onMute={this.handleMuteClick}
 | 
				
			||||||
 | 
					                  onMuteConversation={this.handleConversationMuteClick}
 | 
				
			||||||
 | 
					                  onBlock={this.handleBlockClick}
 | 
				
			||||||
                  onReport={this.handleReport}
 | 
					                  onReport={this.handleReport}
 | 
				
			||||||
                  onPin={this.handlePin}
 | 
					                  onPin={this.handlePin}
 | 
				
			||||||
                  onEmbed={this.handleEmbed}
 | 
					                  onEmbed={this.handleEmbed}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue