From 44e9ca6c522aeb9de8db8f3018e5fe2fe3890334 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 1 May 2019 13:58:32 +0100 Subject: [PATCH] Extract `isContentActionable` to a separate helper This moves the check about whether an event is actionable (for the purpose of replies, edits, reactions, etc.) to shared utils module. --- .../views/context_menus/MessageContextMenu.js | 26 +++++------ .../views/messages/MessageActionBar.js | 27 ++--------- src/utils/EventUtils.js | 45 +++++++++++++++++++ 3 files changed, 60 insertions(+), 38 deletions(-) create mode 100644 src/utils/EventUtils.js diff --git a/src/components/views/context_menus/MessageContextMenu.js b/src/components/views/context_menus/MessageContextMenu.js index 1191b6d66e..2e4611f7d0 100644 --- a/src/components/views/context_menus/MessageContextMenu.js +++ b/src/components/views/context_menus/MessageContextMenu.js @@ -27,6 +27,7 @@ import Modal from '../../../Modal'; import Resend from '../../../Resend'; import SettingsStore from '../../../settings/SettingsStore'; import { isUrlPermitted } from '../../../HtmlUtils'; +import { isContentActionable } from '../../../utils/EventUtils'; module.exports = React.createClass({ displayName: 'MessageContextMenu', @@ -247,22 +248,19 @@ module.exports = React.createClass({ ); } - if (isSent && mxEvent.getType() === 'm.room.message') { - const content = mxEvent.getContent(); - if (content.msgtype && content.msgtype !== 'm.bad.encrypted' && content.hasOwnProperty('body')) { - forwardButton = ( -
- { _t('Forward Message') } + if (isContentActionable(mxEvent)) { + forwardButton = ( +
+ { _t('Forward Message') } +
+ ); + + if (this.state.canPin) { + pinButton = ( +
+ { this._isPinned() ? _t('Unpin Message') : _t('Pin Message') }
); - - if (this.state.canPin) { - pinButton = ( -
- { this._isPinned() ? _t('Unpin Message') : _t('Pin Message') } -
- ); - } } } diff --git a/src/components/views/messages/MessageActionBar.js b/src/components/views/messages/MessageActionBar.js index 276a142ccb..76bae137f5 100644 --- a/src/components/views/messages/MessageActionBar.js +++ b/src/components/views/messages/MessageActionBar.js @@ -16,7 +16,7 @@ limitations under the License. import React from 'react'; import PropTypes from 'prop-types'; -import {EventStatus} from 'matrix-js-sdk'; +import classNames from 'classnames'; import { _t } from '../../../languageHandler'; import sdk from '../../../index'; @@ -24,7 +24,7 @@ import dis from '../../../dispatcher'; import Modal from '../../../Modal'; import { createMenu } from '../../structures/ContextualMenu'; import SettingsStore from '../../../settings/SettingsStore'; -import classNames from 'classnames'; +import { isContentActionable } from '../../../utils/EventUtils'; export default class MessageActionBar extends React.PureComponent { static propTypes = { @@ -123,27 +123,6 @@ export default class MessageActionBar extends React.PureComponent { this.onFocusChange(true); } - isContentActionable() { - const { mxEvent } = this.props; - const { status: eventStatus } = mxEvent; - - // status is SENT before remote-echo, null after - const isSent = !eventStatus || eventStatus === EventStatus.SENT; - - if (isSent && mxEvent.getType() === 'm.room.message') { - const content = mxEvent.getContent(); - if ( - content.msgtype && - content.msgtype !== 'm.bad.encrypted' && - content.hasOwnProperty('body') - ) { - return true; - } - } - - return false; - } - isReactionsEnabled() { return SettingsStore.isFeatureEnabled("feature_reactions"); } @@ -220,7 +199,7 @@ export default class MessageActionBar extends React.PureComponent { let likeDimensionReactionButtons; let replyButton; - if (this.isContentActionable()) { + if (isContentActionable(this.props.mxEvent)) { agreeDimensionReactionButtons = this.renderAgreeDimension(); likeDimensionReactionButtons = this.renderLikeDimension(); replyButton =