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 =