From 7b2e18ff7cabe4fd6a7752ed21a9b76890fea36f Mon Sep 17 00:00:00 2001
From: Michael Telatynski <7t3chguy@gmail.com>
Date: Mon, 29 Jul 2019 12:13:23 +0100
Subject: [PATCH] Show MessageActionBar buttons conditionally on room state
permissions
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---
.../views/messages/MessageActionBar.js | 50 +++++++++++++++----
1 file changed, 39 insertions(+), 11 deletions(-)
diff --git a/src/components/views/messages/MessageActionBar.js b/src/components/views/messages/MessageActionBar.js
index 6f58dd7bef..231b7a03c3 100644
--- a/src/components/views/messages/MessageActionBar.js
+++ b/src/components/views/messages/MessageActionBar.js
@@ -1,5 +1,6 @@
/*
Copyright 2019 New Vector Ltd
+Copyright 2019 Michael Telatynski <7t3chguy@gmail.com>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -23,6 +24,7 @@ import dis from '../../../dispatcher';
import Modal from '../../../Modal';
import { createMenu } from '../../structures/ContextualMenu';
import { isContentActionable, canEditContent } from '../../../utils/EventUtils';
+import MatrixClientPeg from "../../../MatrixClientPeg";
export default class MessageActionBar extends React.PureComponent {
static propTypes = {
@@ -35,26 +37,48 @@ export default class MessageActionBar extends React.PureComponent {
onFocusChange: PropTypes.func,
};
+ state = {
+ canReact: true,
+ canReply: true,
+ };
+
componentDidMount() {
this.props.mxEvent.on("Event.decrypted", this.onDecrypted);
+ const room = MatrixClientPeg.get().getRoom(this.props.mxEvent.getRoomId());
+ room.on("RoomMember.powerLevel", this.onPermissionsChange);
+ room.on("RoomMember.membership", this.onPermissionsChange);
+ this.onPermissionsChange();
}
componentWillUnmount() {
this.props.mxEvent.removeListener("Event.decrypted", this.onDecrypted);
+ const room = MatrixClientPeg.get().getRoom(this.props.mxEvent.getRoomId());
+ room.removeListener("RoomMember.powerLevel", this.onPermissionsChange);
+ room.removeListener("RoomMember.membership", this.onPermissionsChange);
+ }
+
+ onPermissionsChange() {
+ const cli = MatrixClientPeg.get();
+ const room = cli.getRoom(this.props.mxEvent.getRoomId());
+ const me = cli.credentials.userId;
+ const canReact = room.getMyMembership() === "join" && room.currentState.maySendEvent("m.reaction", me);
+ const canReply = room.maySendMessage();
+
+ this.setState({canReact, canReply});
}
onDecrypted = () => {
// When an event decrypts, it is likely to change the set of available
// actions, so we force an update to check again.
this.forceUpdate();
- }
+ };
onFocusChange = (focused) => {
if (!this.props.onFocusChange) {
return;
}
this.props.onFocusChange(focused);
- }
+ };
onCryptoClick = () => {
const event = this.props.mxEvent;
@@ -62,21 +86,21 @@ export default class MessageActionBar extends React.PureComponent {
import('../../../async-components/views/dialogs/EncryptedEventDialog'),
{event},
);
- }
+ };
onReplyClick = (ev) => {
dis.dispatch({
action: 'reply_to_event',
event: this.props.mxEvent,
});
- }
+ };
onEditClick = (ev) => {
dis.dispatch({
action: 'edit_event',
event: this.props.mxEvent,
});
- }
+ };
onOptionsClick = (ev) => {
const MessageContextMenu = sdk.getComponent('context_menus.MessageContextMenu');
@@ -120,7 +144,7 @@ export default class MessageActionBar extends React.PureComponent {
createMenu(MessageContextMenu, menuOptions);
this.onFocusChange(true);
- }
+ };
renderReactButton() {
const ReactMessageAction = sdk.getComponent('messages.ReactMessageAction');
@@ -139,11 +163,15 @@ export default class MessageActionBar extends React.PureComponent {
let editButton;
if (isContentActionable(this.props.mxEvent)) {
- reactButton = this.renderReactButton();
- replyButton = ;
+ if (this.state.canReact) {
+ reactButton = this.renderReactButton();
+ }
+ if (this.state.canReply) {
+ replyButton = ;
+ }
}
if (canEditContent(this.props.mxEvent)) {
editButton =