diff --git a/src/TextForEvent.js b/src/TextForEvent.js
index 3f772e9cfb..3e1659f392 100644
--- a/src/TextForEvent.js
+++ b/src/TextForEvent.js
@@ -116,7 +116,6 @@ function textForRoomNameEvent(ev) {
function textForMessageEvent(ev) {
var senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender();
-
var message = senderDisplayName + ': ' + ev.getContent().body;
if (ev.getContent().msgtype === "m.emote") {
message = "* " + senderDisplayName + " " + message;
diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js
index 0981b7b706..21665bb421 100644
--- a/src/components/structures/MessagePanel.js
+++ b/src/components/structures/MessagePanel.js
@@ -295,7 +295,10 @@ module.exports = React.createClass({
var last = (i == lastShownEventIndex);
// Wrap consecutive member events in a ListSummary, ignore if redacted
- if (isMembershipChange(mxEv) && EventTile.haveTileForEvent(mxEv)) {
+ if (isMembershipChange(mxEv) &&
+ EventTile.haveTileForEvent(mxEv) &&
+ !mxEv.isRedacted()
+ ) {
let ts1 = mxEv.getTs();
// Ensure that the key of the MemberEventListSummary does not change with new
// member events. This will prevent it from being re-created unnecessarily, and
@@ -481,13 +484,17 @@ module.exports = React.createClass({
// here.
return !this.props.suppressFirstDateSeparator;
}
+ const prevEventDate = prevEvent.getDate();
+ if (!nextEventDate || !prevEventDate) {
+ return false;
+ }
// Return early for events that are > 24h apart
if (Math.abs(prevEvent.getTs() - nextEventDate.getTime()) > MILLIS_IN_DAY) {
return true;
}
// Compare weekdays
- return prevEvent.getDate().getDay() !== nextEventDate.getDay();
+ return prevEventDate.getDay() !== nextEventDate.getDay();
},
// get a list of read receipts that should be shown next to this event
diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js
index a625e63062..0030fe6575 100644
--- a/src/components/views/messages/TextualBody.js
+++ b/src/components/views/messages/TextualBody.js
@@ -246,6 +246,10 @@ module.exports = React.createClass({
var mxEvent = this.props.mxEvent;
var content = mxEvent.getContent();
+ if (mxEvent.isRedacted()) {
+ content = {body: "Message redacted by " + mxEvent.event.redacted_because.sender};
+ }
+
var body = HtmlUtils.bodyToHtml(content, this.props.highlights, {});
if (this.props.highlightLink) {
diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js
index c9508428ba..f011b5517a 100644
--- a/src/components/views/rooms/EventTile.js
+++ b/src/components/views/rooms/EventTile.js
@@ -396,6 +396,7 @@ module.exports = WithMatrixClient(React.createClass({
var e2eEnabled = this.props.matrixClient.isRoomEncrypted(this.props.mxEvent.getRoomId());
var isSending = (['sending', 'queued', 'encrypting'].indexOf(this.props.eventSendStatus) !== -1);
+ const isRedacted = this.props.mxEvent.isRedacted();
var classes = classNames({
mx_EventTile: true,
@@ -412,6 +413,7 @@ module.exports = WithMatrixClient(React.createClass({
mx_EventTile_verified: this.state.verified == true,
mx_EventTile_unverified: this.state.verified == false,
mx_EventTile_bad: this.props.mxEvent.getContent().msgtype === 'm.bad.encrypted',
+ mx_EventTile_redacted: isRedacted,
});
var permalink = "#/room/" + this.props.mxEvent.getRoomId() +"/"+ this.props.mxEvent.getId();
@@ -486,6 +488,8 @@ module.exports = WithMatrixClient(React.createClass({
else if (e2eEnabled) {
e2e = ;
}
+ const timestamp = this.props.mxEvent.isRedacted() ?
+ null :