From ccd3234873184393ac5afe4abbe3494461f87ac6 Mon Sep 17 00:00:00 2001 From: Christopher Date: Tue, 21 Jan 2020 16:13:14 +0000 Subject: [PATCH 01/15] Moved read receipts to the bottom of the EventTile. --- res/css/views/rooms/_EventTile.scss | 17 +---------------- src/components/views/rooms/EventTile.js | 6 +++--- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index fbac1e932a..0b5c4a48a6 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -289,17 +289,11 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { display: inline-block; width: 14px; height: 14px; - top: 29px; + top: -19px; user-select: none; z-index: 1; } -.mx_EventTile_continuation .mx_EventTile_readAvatars, -.mx_EventTile_info .mx_EventTile_readAvatars, -.mx_EventTile_emote .mx_EventTile_readAvatars { - top: 7px; -} - .mx_EventTile_readAvatars .mx_BaseAvatar { position: absolute; display: inline-block; @@ -621,15 +615,6 @@ div.mx_EventTile_notSent.mx_EventTile_redacted .mx_UnknownBody { top: 27px; } - .mx_EventTile_continuation .mx_EventTile_readAvatars, - .mx_EventTile_emote .mx_EventTile_readAvatars { - top: 5px; - } - - .mx_EventTile_info .mx_EventTile_readAvatars { - top: 4px; - } - .mx_RoomView_MessageList h2 { margin-top: 6px; } diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index dce4dc8a93..8ee51a9377 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -820,9 +820,6 @@ export default createReactClass({ // tab-index=-1 to allow it to be focusable but do not add tab stop for it, primarily for screen readers return (
-
- { readAvatars } -
{ sender }
+
+ { readAvatars } +
{ // The avatar goes after the event tile as it's absolutely positioned to be over the // event tile line, so needs to be later in the DOM so it appears on top (this avoids From 07348a65ad66b733c6de899ade6ba47c71c0e710 Mon Sep 17 00:00:00 2001 From: Mark Striemer Date: Mon, 2 Mar 2020 13:59:14 -0600 Subject: [PATCH 02/15] Include a mark as read X under the scroll to unread button --- res/css/views/rooms/_TopUnreadMessagesBar.scss | 14 ++++++++++++++ src/components/views/rooms/TopUnreadMessagesBar.js | 5 +++++ 2 files changed, 19 insertions(+) diff --git a/res/css/views/rooms/_TopUnreadMessagesBar.scss b/res/css/views/rooms/_TopUnreadMessagesBar.scss index a3916f321a..5f6f869877 100644 --- a/res/css/views/rooms/_TopUnreadMessagesBar.scss +++ b/res/css/views/rooms/_TopUnreadMessagesBar.scss @@ -56,3 +56,17 @@ limitations under the License. mask-position: 9px 13px; background: $roomtile-name-color; } + +.mx_TopUnreadMessagesBar_markAsRead { + display: block; + width: 18px; + height: 18px; + background-image: url('$(res)/img/cancel.svg'); + background-position: center; + background-size: 10px; + background-repeat: no-repeat; + background-color: $primary-bg-color; + border: 1.3px solid $roomtile-name-color; + border-radius: 99px; + margin: 5px auto; +} diff --git a/src/components/views/rooms/TopUnreadMessagesBar.js b/src/components/views/rooms/TopUnreadMessagesBar.js index 04805c799f..23d41059c4 100644 --- a/src/components/views/rooms/TopUnreadMessagesBar.js +++ b/src/components/views/rooms/TopUnreadMessagesBar.js @@ -27,6 +27,7 @@ export default createReactClass({ propTypes: { onScrollUpClick: PropTypes.func, + onCloseClick: PropTypes.func, }, render: function() { @@ -36,6 +37,10 @@ export default createReactClass({ title={_t('Jump to first unread message.')} onClick={this.props.onScrollUpClick}> + +
); }, From df9710907c833aad6275feb191f6d88c0bc8e58f Mon Sep 17 00:00:00 2001 From: Mark Striemer Date: Mon, 2 Mar 2020 15:45:16 -0600 Subject: [PATCH 03/15] Add en_US string --- src/i18n/strings/en_EN.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index ab18c58e90..58f42ebe34 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1139,6 +1139,7 @@ "Revoke invite": "Revoke invite", "Invited by %(sender)s": "Invited by %(sender)s", "Jump to first unread message.": "Jump to first unread message.", + "Mark all as read": "Mark all as read", "Error updating main address": "Error updating main address", "There was an error updating the room's main address. It may not be allowed by the server or a temporary failure occurred.": "There was an error updating the room's main address. It may not be allowed by the server or a temporary failure occurred.", "Error creating alias": "Error creating alias", From 98f0a2ab679d4d08c298a0148e3de09b4b9ea790 Mon Sep 17 00:00:00 2001 From: Simeon Keske Date: Wed, 4 Mar 2020 22:30:24 +0100 Subject: [PATCH 04/15] show the room presence indicator, even when cross-singing is enabled --- src/components/views/rooms/RoomTile.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index a07c81eb21..3245cdb779 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -491,15 +491,15 @@ export default createReactClass({ alt="dm" />; - const { room } = this.props; - const member = room.getMember(dmUserId); - if ( - member && member.membership === "join" && room.getJoinedMemberCount() === 2 && - SettingsStore.isFeatureEnabled("feature_presence_in_room_list") - ) { - const UserOnlineDot = sdk.getComponent('rooms.UserOnlineDot'); - dmOnline = ; - } + } + const { room } = this.props; + const member = room.getMember(dmUserId); + if ( + member && member.membership === "join" && room.getJoinedMemberCount() === 2 && + SettingsStore.isFeatureEnabled("feature_presence_in_room_list") + ) { + const UserOnlineDot = sdk.getComponent('rooms.UserOnlineDot'); + dmOnline = ; } // The following labels are written in such a fashion to increase screen reader efficiency (speed). From cf1d9cc8b5ff65cc127510a310ad0585c1c1dfba Mon Sep 17 00:00:00 2001 From: Simeon Keske Date: Wed, 4 Mar 2020 22:46:07 +0100 Subject: [PATCH 05/15] make the linter happy --- src/components/views/rooms/RoomTile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index 3245cdb779..e1624602f1 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -490,8 +490,8 @@ export default createReactClass({ height="13" alt="dm" />; - } + const { room } = this.props; const member = room.getMember(dmUserId); if ( From 7d051d6a1d0d927732adf44ea79534c64ccc326d Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Thu, 5 Mar 2020 17:44:35 +0100 Subject: [PATCH 06/15] await request promise inside encryption panel to show spinner --- src/components/structures/RightPanel.js | 2 ++ .../views/right_panel/EncryptionPanel.js | 15 ++++++++++++++- src/components/views/right_panel/UserInfo.js | 4 ++-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/components/structures/RightPanel.js b/src/components/structures/RightPanel.js index 20df323c10..8d25116827 100644 --- a/src/components/structures/RightPanel.js +++ b/src/components/structures/RightPanel.js @@ -182,6 +182,7 @@ export default class RightPanel extends React.Component { member: payload.member, event: payload.event, verificationRequest: payload.verificationRequest, + verificationRequestPromise: payload.verificationRequestPromise, }); } } @@ -231,6 +232,7 @@ export default class RightPanel extends React.Component { onClose={onClose} phase={this.state.phase} verificationRequest={this.state.verificationRequest} + verificationRequestPromise={this.state.verificationRequestPromise} />; } else { panel = { +const EncryptionPanel = ({verificationRequest, verificationRequestPromise, member, onClose, layout}) => { const [request, setRequest] = useState(verificationRequest); // state to show a spinner immediately after clicking "start verification", // before we have a request @@ -43,6 +43,19 @@ const EncryptionPanel = ({verificationRequest, member, onClose, layout}) => { setPhase(verificationRequest.phase); } }, [verificationRequest]); + + useEffect(() => { + async function awaitPromise() { + setRequesting(true); + const request = await verificationRequestPromise; + setRequesting(false); + setRequest(request); + setPhase(request.phase); + } + if (verificationRequestPromise) { + awaitPromise(); + } + }, [verificationRequestPromise]); const changeHandler = useCallback(() => { // handle transitions -> cancelled for mismatches which fire a modal instead of showing a card if (request && request.cancelled && MISMATCHES.includes(request.cancellationCode)) { diff --git a/src/components/views/right_panel/UserInfo.js b/src/components/views/right_panel/UserInfo.js index b8ba6968a4..17cb80492e 100644 --- a/src/components/views/right_panel/UserInfo.js +++ b/src/components/views/right_panel/UserInfo.js @@ -171,14 +171,14 @@ async function verifyDevice(userId, device) { return; } const cli = MatrixClientPeg.get(); - const verificationRequest = await cli.requestVerification( + const verificationRequestPromise = cli.requestVerification( userId, [device.deviceId], ); dis.dispatch({ action: "set_right_panel_phase", phase: RIGHT_PANEL_PHASES.EncryptionPanel, - refireParams: {member, verificationRequest}, + refireParams: {member, verificationRequestPromise}, }); }, primaryButton: _t("Done"), From 74fcb103b1d11a408a44a144c1850624904f0f2f Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 5 Mar 2020 11:04:33 -0700 Subject: [PATCH 07/15] Link to the right contributing guidelines --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0fbed22030..d6fd6db1b7 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ All code lands on the `develop` branch - `master` is only used for stable releas **Please file PRs against `develop`!!** Please follow the standard Matrix contributor's guide: -https://github.com/matrix-org/synapse/tree/master/CONTRIBUTING.rst +https://github.com/matrix-org/matrix-js-sdk/blob/develop/CONTRIBUTING.rst Please follow the Matrix JS/React code style as per: https://github.com/matrix-org/matrix-react-sdk/blob/master/code_style.md From 8fe54e5dca8d4293746f15f3a06ce6279651494f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Tue, 18 Feb 2020 10:59:42 +0100 Subject: [PATCH 08/15] ManageEventIndexDialog: Reword the status for the currently indexing rooms. --- .../views/dialogs/eventindex/ManageEventIndexDialog.js | 6 ++++-- src/i18n/strings/en_EN.json | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js index f3ea3beb1c..9f00136b89 100644 --- a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js +++ b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js @@ -160,10 +160,12 @@ export default class ManageEventIndexDialog extends React.Component {
{_t("Space used:")} {formatBytes(this.state.eventIndexSize, 0)}
{_t("Indexed messages:")} {formatCountLong(this.state.eventCount)}
- {_t("Indexed rooms:")} {_t("%(crawlingRooms)s out of %(totalRooms)s", { - crawlingRooms: formatCountLong(this.state.crawlingRoomsCount), + {_t("Monitoring %(totalRooms)s rooms in total.", { totalRooms: formatCountLong(this.state.roomCount), })}
+ {_t("Currently working in %(crawlingRooms)s rooms.", { + crawlingRooms: formatCountLong(this.state.crawlingRoomsCount), + })}
{crawlerState}
Date: Fri, 6 Mar 2020 15:34:19 +0100 Subject: [PATCH 09/15] Revert "ManageEventIndexDialog: Reword the status for the currently indexing rooms." This reverts commit 7d6569a0b87c48733dbddec3c2662325977d0234. --- .../views/dialogs/eventindex/ManageEventIndexDialog.js | 6 ++---- src/i18n/strings/en_EN.json | 4 ++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js index 9f00136b89..f3ea3beb1c 100644 --- a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js +++ b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js @@ -160,11 +160,9 @@ export default class ManageEventIndexDialog extends React.Component {
{_t("Space used:")} {formatBytes(this.state.eventIndexSize, 0)}
{_t("Indexed messages:")} {formatCountLong(this.state.eventCount)}
- {_t("Monitoring %(totalRooms)s rooms in total.", { - totalRooms: formatCountLong(this.state.roomCount), - })}
- {_t("Currently working in %(crawlingRooms)s rooms.", { + {_t("Indexed rooms:")} {_t("%(crawlingRooms)s out of %(totalRooms)s", { crawlingRooms: formatCountLong(this.state.crawlingRoomsCount), + totalRooms: formatCountLong(this.state.roomCount), })}
{crawlerState}
Date: Fri, 6 Mar 2020 15:43:17 +0100 Subject: [PATCH 10/15] ManageEventIndexDialog: Show how many rooms are done instead being processed. --- .../views/dialogs/eventindex/ManageEventIndexDialog.js | 6 ++++-- src/i18n/strings/en_EN.json | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js index f3ea3beb1c..8a5a0a3607 100644 --- a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js +++ b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js @@ -150,6 +150,8 @@ export default class ManageEventIndexDialog extends React.Component { const Field = sdk.getComponent('views.elements.Field'); + const doneRooms = Math.max(0, (this.state.roomCount - this.state.crawlingRoomsCount)); + const eventIndexingSettings = (
{ @@ -160,8 +162,8 @@ export default class ManageEventIndexDialog extends React.Component {
{_t("Space used:")} {formatBytes(this.state.eventIndexSize, 0)}
{_t("Indexed messages:")} {formatCountLong(this.state.eventCount)}
- {_t("Indexed rooms:")} {_t("%(crawlingRooms)s out of %(totalRooms)s", { - crawlingRooms: formatCountLong(this.state.crawlingRoomsCount), + {_t("Indexed rooms:")} {_t("%(doneRooms)s out of %(totalRooms)s", { + doneRooms: formatCountLong(doneRooms), totalRooms: formatCountLong(this.state.roomCount), })}
{crawlerState}
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 35c3144241..f6f850d627 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2136,7 +2136,7 @@ "Space used:": "Space used:", "Indexed messages:": "Indexed messages:", "Indexed rooms:": "Indexed rooms:", - "%(crawlingRooms)s out of %(totalRooms)s": "%(crawlingRooms)s out of %(totalRooms)s", + "%(doneRooms)s out of %(totalRooms)s": "%(doneRooms)s out of %(totalRooms)s", "Message downloading sleep time(ms)": "Message downloading sleep time(ms)", "Failed to set direct chat tag": "Failed to set direct chat tag", "Failed to remove tag %(tagName)s from room": "Failed to remove tag %(tagName)s from room", From 69389823f7fa8da68b3e8c7fa1ecaf9fc553ccf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 6 Mar 2020 16:07:10 +0100 Subject: [PATCH 11/15] ManageEventIndexDialog: Reword and move the crawler state around a bit. This reflects now the latests design on Figma. --- .../views/dialogs/eventindex/ManageEventIndexDialog.js | 6 +++--- src/i18n/strings/en_EN.json | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js index 8a5a0a3607..371fdcaf64 100644 --- a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js +++ b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.js @@ -141,10 +141,10 @@ export default class ManageEventIndexDialog extends React.Component { let crawlerState; if (this.state.currentRoom === null) { - crawlerState = _t("Not currently downloading messages for any room."); + crawlerState = _t("Not currently indexing messages for any room."); } else { crawlerState = ( - _t("Downloading mesages for %(currentRoom)s.", { currentRoom: this.state.currentRoom }) + _t("Currently indexing: %(currentRoom)s.", { currentRoom: this.state.currentRoom }) ); } @@ -160,13 +160,13 @@ export default class ManageEventIndexDialog extends React.Component { ) }
+ {crawlerState}
{_t("Space used:")} {formatBytes(this.state.eventIndexSize, 0)}
{_t("Indexed messages:")} {formatCountLong(this.state.eventCount)}
{_t("Indexed rooms:")} {_t("%(doneRooms)s out of %(totalRooms)s", { doneRooms: formatCountLong(doneRooms), totalRooms: formatCountLong(this.state.roomCount), })}
- {crawlerState}
Date: Fri, 6 Mar 2020 16:50:39 +0100 Subject: [PATCH 12/15] use crypto.verification.request even when xsign is disabled --- src/components/structures/MatrixChat.js | 41 +++++++++++++------------ 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index bc11e66d2c..e4af503b46 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1495,26 +1495,29 @@ export default createReactClass({ } }); - if (SettingsStore.isFeatureEnabled("feature_cross_signing")) { - cli.on("crypto.verification.request", request => { - if (request.pending) { - ToastStore.sharedInstance().addOrReplaceToast({ - key: 'verifreq_' + request.channel.transactionId, - title: _t("Verification Request"), - icon: "verification", - props: {request}, - component: sdk.getComponent("toasts.VerificationRequestToast"), - }); - } - }); - } else { - cli.on("crypto.verification.start", (verifier) => { - const IncomingSasDialog = sdk.getComponent("views.dialogs.IncomingSasDialog"); - Modal.createTrackedDialog('Incoming Verification', '', IncomingSasDialog, { - verifier, + cli.on("crypto.verification.request", request => { + const isFlagOn = SettingsStore.isFeatureEnabled("feature_cross_signing"); + + if (!isFlagOn && !request.channel.deviceId) { + request.cancel({code: "m.invalid_message", reason: "This client has cross-signing disabled"}); + return; + } + + if (request.pending) { + ToastStore.sharedInstance().addOrReplaceToast({ + key: 'verifreq_' + request.channel.transactionId, + title: _t("Verification Request"), + icon: "verification", + props: {request}, + component: sdk.getComponent("toasts.VerificationRequestToast"), + }); + } else if (request.started) { + const VerificationRequestDialog = sdk.getComponent("views.dialogs.VerificationRequestDialog"); + Modal.createTrackedDialog('Incoming Verification', '', VerificationRequestDialog, { + verificationRequest: request, }, null, /* priority = */ false, /* static = */ true); - }); - } + } + }); // Fire the tinter right on startup to ensure the default theme is applied // A later sync can/will correct the tint to be the right value for the user const colorScheme = SettingsStore.getValue("roomColor"); From f8ef5bb6a58a95969dfd181a6e997f882ce28514 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 6 Mar 2020 17:20:08 +0100 Subject: [PATCH 13/15] check .started first as it can be both .started and pending --- src/components/structures/MatrixChat.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index e4af503b46..87b0f6773f 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1503,7 +1503,12 @@ export default createReactClass({ return; } - if (request.pending) { + if (request.started) { + const VerificationRequestDialog = sdk.getComponent("views.dialogs.VerificationRequestDialog"); + Modal.createTrackedDialog('Incoming Verification', '', VerificationRequestDialog, { + verificationRequest: request, + }, null, /* priority = */ false, /* static = */ true); + } else if (request.pending) { ToastStore.sharedInstance().addOrReplaceToast({ key: 'verifreq_' + request.channel.transactionId, title: _t("Verification Request"), @@ -1511,11 +1516,6 @@ export default createReactClass({ props: {request}, component: sdk.getComponent("toasts.VerificationRequestToast"), }); - } else if (request.started) { - const VerificationRequestDialog = sdk.getComponent("views.dialogs.VerificationRequestDialog"); - Modal.createTrackedDialog('Incoming Verification', '', VerificationRequestDialog, { - verificationRequest: request, - }, null, /* priority = */ false, /* static = */ true); } }); // Fire the tinter right on startup to ensure the default theme is applied From b0617f10e82a5c60258846e69b97abb877c49e63 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 6 Mar 2020 17:22:56 +0100 Subject: [PATCH 14/15] stick to IncomingSasDialog as VerificationRequestDialog doesn't show sender yet, makes e2e tests fail --- src/components/structures/MatrixChat.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 87b0f6773f..a0b9a8fe57 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -1503,10 +1503,10 @@ export default createReactClass({ return; } - if (request.started) { - const VerificationRequestDialog = sdk.getComponent("views.dialogs.VerificationRequestDialog"); - Modal.createTrackedDialog('Incoming Verification', '', VerificationRequestDialog, { - verificationRequest: request, + if (request.verifier) { + const IncomingSasDialog = sdk.getComponent("views.dialogs.IncomingSasDialog"); + Modal.createTrackedDialog('Incoming Verification', '', IncomingSasDialog, { + verifier: request.verifier, }, null, /* priority = */ false, /* static = */ true); } else if (request.pending) { ToastStore.sharedInstance().addOrReplaceToast({ From e4d323d2f29ff61c24fb85784a038791da67a4f6 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 6 Mar 2020 14:23:20 -0700 Subject: [PATCH 15/15] Disable edits on redacted events Fixes https://github.com/vector-im/riot-web/issues/12633 --- src/components/views/messages/MessageActionBar.js | 7 +++++++ src/utils/EventUtils.js | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/components/views/messages/MessageActionBar.js b/src/components/views/messages/MessageActionBar.js index e07e39b971..fbc864caf2 100644 --- a/src/components/views/messages/MessageActionBar.js +++ b/src/components/views/messages/MessageActionBar.js @@ -121,10 +121,12 @@ export default class MessageActionBar extends React.PureComponent { componentDidMount() { this.props.mxEvent.on("Event.decrypted", this.onDecrypted); + this.props.mxEvent.on("Event.beforeRedaction", this.onBeforeRedaction); } componentWillUnmount() { this.props.mxEvent.removeListener("Event.decrypted", this.onDecrypted); + this.props.mxEvent.removeListener("Event.beforeRedaction", this.onBeforeRedaction); } onDecrypted = () => { @@ -133,6 +135,11 @@ export default class MessageActionBar extends React.PureComponent { this.forceUpdate(); }; + onBeforeRedaction = () => { + // When an event is redacted, we can't edit it so update the available actions. + this.forceUpdate(); + }; + onFocusChange = (focused) => { if (!this.props.onFocusChange) { return; diff --git a/src/utils/EventUtils.js b/src/utils/EventUtils.js index 8acf5ae396..7e33aaed81 100644 --- a/src/utils/EventUtils.js +++ b/src/utils/EventUtils.js @@ -46,7 +46,7 @@ export function isContentActionable(mxEvent) { } export function canEditContent(mxEvent) { - if (mxEvent.status === EventStatus.CANCELLED || mxEvent.getType() !== "m.room.message") { + if (mxEvent.status === EventStatus.CANCELLED || mxEvent.getType() !== "m.room.message" || mxEvent.isRedacted()) { return false; } const content = mxEvent.getOriginalContent();