diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js
index 6f2d8f038b..31ef15b6dc 100644
--- a/src/components/structures/MessagePanel.js
+++ b/src/components/structures/MessagePanel.js
@@ -346,6 +346,7 @@ module.exports = React.createClass({
continuation = true;
}
+/*
// Work out if this is still a continuation, as we are now showing commands
// and /me messages with their own little avatar. The case of a change of
// event type (commands) is handled above, but we need to handle the /me
@@ -357,6 +358,7 @@ module.exports = React.createClass({
&& prevEvent.getContent().msgtype === 'm.emote') {
continuation = false;
}
+*/
// local echoes have a fake date, which could even be yesterday. Treat them
// as 'today' for the date separators.
diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js
index f3ae3dff7f..0fffa8cef8 100644
--- a/src/components/views/rooms/EventTile.js
+++ b/src/components/views/rooms/EventTile.js
@@ -248,8 +248,7 @@ module.exports = React.createClass({
if (!actions || !actions.tweaks) { return false; }
// don't show self-highlights from another of our clients
- if (this.props.mxEvent.sender &&
- this.props.mxEvent.sender.userId === MatrixClientPeg.get().credentials.userId)
+ if (this.props.mxEvent.getSender() === MatrixClientPeg.get().credentials.userId)
{
return false;
}
@@ -375,7 +374,7 @@ module.exports = React.createClass({
// Info messages are basically information about commands processed on a
// room, or emote messages
- var isInfoMessage = (msgtype === 'm.emote' || eventType !== 'm.room.message');
+ var isInfoMessage = (eventType !== 'm.room.message');
var EventTileType = sdk.getComponent(eventTileTypes[eventType]);
// This shouldn't happen: the caller should check we support this type
@@ -384,21 +383,24 @@ module.exports = React.createClass({
throw new Error("Event type not supported");
}
+ var e2eEnabled = MatrixClientPeg.get().isRoomEncrypted(this.props.mxEvent.getRoomId());
+ var isSending = (['sending', 'queued', 'encrypting'].indexOf(this.props.eventSendStatus) !== -1);
+
var classes = classNames({
mx_EventTile: true,
mx_EventTile_info: isInfoMessage,
- mx_EventTile_sending: ['sending', 'queued'].indexOf(
- this.props.eventSendStatus
- ) !== -1,
+ mx_EventTile_encrypting: this.props.eventSendStatus == 'encrypting',
+ mx_EventTile_sending: isSending,
mx_EventTile_notSent: this.props.eventSendStatus == 'not_sent',
- mx_EventTile_highlight: this.props.tileShape === 'notif' ? false : this.shouldHighlight(),
+ mx_EventTile_highlight: this.props.tileShape == 'notif' ? false : this.shouldHighlight(),
mx_EventTile_selected: this.props.isSelectedEvent,
mx_EventTile_continuation: this.props.tileShape ? '' : this.props.continuation,
mx_EventTile_last: this.props.last,
mx_EventTile_contextual: this.props.contextual,
menu: this.state.menu,
- mx_EventTile_verified: this.state.verified == true,
+ mx_EventTile_verified: this.state.verified == true || (e2eEnabled && isSending),
mx_EventTile_unverified: this.state.verified == false,
+ mx_EventTile_bad: this.props.mxEvent.getContent().msgtype === 'm.bad.encrypted',
});
var permalink = "#/room/" + this.props.mxEvent.getRoomId() +"/"+ this.props.mxEvent.getId();
@@ -412,7 +414,7 @@ module.exports = React.createClass({
avatarSize = 24;
needsSenderProfile = true;
} else if (isInfoMessage) {
- // a small avatar, with no sender profile, for emotes and
+ // a small avatar, with no sender profile, for
// joins/parts/etc
avatarSize = 14;
needsSenderProfile = false;
@@ -447,13 +449,28 @@ module.exports = React.createClass({
else {
sender = ;
}
-
}
var editButton = (
);
+ var e2e;
+ if (e2eEnabled) {
+ if (this.props.mxEvent.getContent().msgtype === 'm.bad.encrypted') {
+ e2e =
;
+ }
+ else if (this.state.verified == true) {
+ e2e =
;
+ }
+ else if (this.state.verified == false) {
+ e2e =
;
+ }
+ else {
+ e2e =
;
+ }
+ }
+
if (this.props.tileShape === "notif") {
var room = MatrixClientPeg.get().getRoom(this.props.mxEvent.getRoomId());
@@ -515,6 +532,7 @@ module.exports = React.createClass({
+ { e2e }
);
+ if (MatrixClientPeg.get().isRoomEncrypted(this.props.room.roomId)) {
+ // FIXME: show a /!\ if there are untrusted devices in the room...
+ controls.push(
+
+ );
+ }
+
var callButton, videoCallButton, hangupButton;
if (this.props.callState && this.props.callState !== 'ended') {
hangupButton =
diff --git a/test/test-utils.js b/test/test-utils.js
index 78349b7824..e4c01d5c52 100644
--- a/test/test-utils.js
+++ b/test/test-utils.js
@@ -39,6 +39,7 @@ export function stubClient() {
loginFlows: sinon.stub(),
on: sinon.stub(),
removeListener: sinon.stub(),
+ isRoomEncrypted: sinon.stub().returns(false),
paginateEventTimeline: sinon.stub().returns(q()),
sendReadReceipt: sinon.stub().returns(q()),